Как мне реализовать Traceroute с использованием UDP? - PullRequest
1 голос
/ 02 сентября 2011

Очевидно, ICMP - не единственный способ создания Traceroute. Этот и этот ответ указывает на возможность отправки пакета UDP (или любого другого) с низким TTL и ожидания сообщения ICMP.

Как мне реализовать это в C #? System.IO.Sockets? Объекты TCP? Кто-нибудь знает легкий / лучший способ?

Обновление 1:

Кажется, что следующий код правильно генерирует исключение при нажатии TTL. Как извлечь информацию из возвращенного пакета UDP?

Как узнать, что полученный UDP-пакет предназначен для меня (а не какого-либо другого приложения на моем хосте?)

   public  void PingUDPAsync(IPAddress _destination, short ttl)
    {
        // This constructor arbitrarily assigns the local port number.
        UdpClient udpClient = new UdpClient(21000);
        udpClient.Ttl = ttl;
       // udpClient.DontFragment = true;

        try
        {
            udpClient.Connect(_destination, 21000);

            // Sends a message to the host to which you have connected.
            Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");

            udpClient.Send(sendBytes, sendBytes.Length);


            //IPEndPoint object will allow us to read datagrams sent from any source.
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

            // Blocks until a message returns on this socket from a remote host.
            Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
            string returnData = Encoding.ASCII.GetString(receiveBytes);

            // Uses the IPEndPoint object to determine which of these two hosts responded.
            Console.WriteLine("This is the message you received " +
                                         returnData.ToString());
            Console.WriteLine("This message was sent from " +
                                        RemoteIpEndPoint.Address.ToString() +
                                        " on their port number " +
                                        RemoteIpEndPoint.Port.ToString());

            udpClient.Close();
        }
        catch (SocketException socketException)
        {
            Console.WriteLine(socketException.ToString());
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

    }

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Да, System.Net.Sockets должен предоставить вам все примитивные объекты, которые вам понадобятся для отправки / получения пакетов UDP / TCP. Много документации и примеров в Интернете, две статьи, которые вы включили в свой вопрос, очень интересны и являются хорошей отправной точкой:)

0 голосов
/ 10 февраля 2019

https://learningnetwork.cisco.com/thread/87497 Вы можете проверить ответ здесь, который детально описывает реализацию трассировки UPD Cisco. Он достаточно всеобъемлющий и может быть легко адаптирован для работы с конкретным портом UDP. Вы не получите пакет UDP обратно от цели. Скорее, вы получите ответ ICMP, чтобы указать, что трафик не был получен. Пакет UDP, который вы создаете, имеет номер порта случайного ответа, и ваш хост отслеживает, какие порты используются какими приложениями. Когда ответ ICMP отправляется обратно, он отправляется на IP-адрес хоста и порт ответа, включенный в заголовок UDP. Ваш хост увидит порт и узнает, что он привязан к вашему приложению. Затем он доставляет пакет в ваше приложение.

...