IP-tracert [Trace Route]

IP-tracert [Trace Route]

post id: 19

post length: 5692

post datetime: 12/9/2009 7:31:45 PM

post ip: 77.51.3.219

IP-tracert [Trace Route]

Дата подачи: 10.04.2009

IP-tracert [Trace Route]

Трассировка [Trace Route] маршрута к определённому хосту через Internet Control Message Protocol (ICMP) по типу диагностической утилиты TRACERT.

[Выдержка по-моему с {

http://www.qnx} -

Процесс маршрутизации дейтаграмм состоит в определении следующего узла (Next hop) в пути следования дейтаграммы и пересылки дейтаграммы этому узлу, который является либо узлом назначения, либо промежуточным маршрутизатором, задача которого — определить следующий узел и переслать ему дейтаграмму. Ни узел-отправитель, ни любой промежуточный маршрутизатор не имеют информации о всей цепочке, по которой пересылается дейтаграмма; каждый маршрутизатор, а также узел-отправитель, основываясь на адресе назначения дейтаграммы, находит только следующий узел ее маршрута.]

Следовательно, получить всю цепочку можно только путём цикличной отправки произвольных эхо-сообщений на исследуемый хост, последовательно увеличивая значение поля TTL на +1. При получении дейтаграммы, очередной маршрутизатор проверяет IP Time-To-Live (TTL), и если время жизни пакето истекло (а вернее сказать количество перенаправлений достигло max), не пересылает её далее по цепочке, а возвращает отправителю сообщение [Time Exceeded]. Таким образом можно перебрать каждое звено в цепочке маршрутов до тех пор, пока в ответ не придёт стандартный эхо-ответ (с типом 0).

в консольном исполнении выглядит так:

MSDN:

Unicast Routing Principles

http://technet.microsoft.com/en-us/library/cc736574.aspx

готов ка:

Tracert by Laszlo Lueck:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId =722&lngWId=10

IcmpSendEcho Perform a Tracert (Trace Route) in VB:

'-----------{{

'I ICMPHeader [размер: 8 byte]

'----------------------------

<StructLayout(LayoutKind.Sequential, Pack:=1)> _

Public Structure ICMPHeader

Dim Type As [Byte]

Dim Code As [Byte]

Dim CRC As Int16

<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> _

Public [body]() As Byte

End Structure

<STAThread()> Sub Main()

'

Try

'

Dim StartPoint As New IPEndPoint(IPAddress.Any, Nothing)

'

Dim EndPoint As New IPEndPoint(IPAddress.Parse("81.19.70.3"), Nothing)

'

Dim Client As New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp)

'

Client.Blocking = False

'

'* формируем пакет...

'

Dim ICMPHead As New ICMPHeader

'

Dim Size As Integer = Marshal.SizeOf(ICMPHead)

'

Dim ptr As IntPtr = Marshal.AllocHGlobal(Size)

'

With ICMPHead

.Type = 8

.Code = 0

'...

End With

'

Marshal.StructureToPtr(ICMPHead, ptr, True)

'

Dim buff(Size - 1) As Byte

'

Marshal.Copy(ptr, buff, 0, Size)

'

' ** пересчитываем [CRC]...

' <remarks>

' расчет контрольной суммы

' рассматривался ранее.

' </remarks>

'

ICMPHead.CRC = MCheckSum.Calculate(buff)

'

Marshal.StructureToPtr(ICMPHead, ptr, True)

'

Marshal.Copy(ptr, buff, 0, Size)

'

Marshal.FreeHGlobal(ptr)

'

Console.WriteLine(String.Concat( _

"Трассировка маршрута к ", EndPoint.Address _

, " [", Dns.Resolve(EndPoint.Address.ToString).HostName _

, "] ", vbCrLf, "с максимальным количеством прыжков [32]", vbCrLf) _

)

'

For hop As Integer = 1 To 32

'

Try

'

Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive _

, CInt(Client.GetSocketOption(SocketOptionLevel.IP _

, SocketOptionName.IpTimeToLive) _

+ 1) _

)

'

'

'* send...

'

Dim ret As Integer = Client.SendTo(buff, 0, buff.Length, SocketFlags.None, EndPoint)

'

Thread.Sleep(5)

'

ReDim buff(buff.Length + 19)

'

'* Receive...

'

Dim receive = Client.ReceiveFrom(buff, Client.Available, SocketFlags.None, StartPoint)

'

While receive = 0

'

'

End While

'...

'кое что пропущено…

'...

Dim str As String = Dns.Resolve(CType(StartPoint, IPEndPoint).Address.ToString).HostName

'

Console.Write(String.Concat(hop, ". .......", str _

, " [", CType(StartPoint, IPEndPoint).Address _

, "] ", vbCrLf) _

)

'

If ((receive = Size + 20) _

And (buff(20) = 0)) Then

'...

'кое что пропущено…

'...

Exit For

End If

'

Catch e As Exception

End Try

'

Next

'

Console.WriteLine(String.Concat( _

vbCrLf, vbCrLf, "Трассировка завершена.") _

)

'

Client.Close()

'

Catch e As Exception

Console.WriteLine(String.Concat( _

e.Message _

))

End Try

'

Console.WriteLine(String.Concat(ControlChars.CrLf _

, "Press ENTER to continue..." _

))

'

Console.ReadLine()

'

End Sub