Documents & code‎ > ‎

IP-tracert [Trace Route]

IP-tracert [Trace Route]   
post id19 
post length5692 
post datetime12/9/2009 7:31:45 PM 
post ip77.51.3.219 

 

IP-tracert [Trace Route] 

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


IP-tracert [Trace Route] 

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

[Выдержка по-моему с {urlhttp://www.qnx} - 
Процесс маршрутизации дейтаграмм состоит в определении следующего узла (Next hop) в пути следования дейтаграммы и пересылки дейтаграммы этому узлу, который является либо узлом назначения, либо промежуточным маршрутизатором, задача которого — определить следующий узел и переслать ему дейтаграмму. Ни узел-отправитель, ни любой промежуточный маршрутизатор не имеют информации о всей цепочке, по которой пересылается дейтаграмма; каждый маршрутизатор, а также узел-отправитель, основываясь на адресе назначения дейтаграммы, находит только следующий узел ее маршрута.] 
Следовательно, получить всю цепочку можно только путём цикличной отправки произвольных эхо-сообщений на исследуемый хост, последовательно увеличивая значение поля TTL на +1. При получении дейтаграммы, очередной маршрутизатор проверяет IP Time-To-Live (TTL), и если время жизни пакето истекло (а вернее сказать количество перенаправлений достигло max), не пересылает её далее по цепочке, а возвращает отправителю сообщение [Time Exceeded]. Таким образом можно перебрать каждое звено в цепочке маршрутов до тех пор, пока в ответ не придёт стандартный эхо-ответ (с типом 0). 


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

 


MSDN: 

Unicast Routing Principles 
urlhttp://msdn.microsoft.com/en-us/library/ms811091.aspx 

What Is Unicast IPv4 Routing? 
urlhttp://technet.microsoft.com/en-us/library/cc736574.aspx 

готов ка: 

Tracert by Laszlo Lueck
urlhttp://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId =722&lngWId=10 


IcmpSendEcho Perform a Tracert (Trace Route) in VB: 
urlhttp://vbnet.mvps.org/code/internet/tracert.htm 



'-----------{{ 
'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 As Exception 
       End Try 
       ' 
      Next 
      ' 
      Console.WriteLine(String.Concat( _ 
       vbCrLf, vbCrLf, "Трассировка завершена.") _ 
       ) 
      ' 
      Client.Close() 
      ' 
      Catch As Exception 
      Console.WriteLine(String.Concat( _ 
      e.Message _ 
      )) 
      End Try 
      ' 
      Console.WriteLine(String.Concat(ControlChars.CrLf _ 
      , "Press ENTER to continue..." _ 
      )) 
      ' 
      Console.ReadLine() 
      ' 
End Sub 

Comments