Почему traceroute ожидает "Destination Unreachable" в последнем прыжке вместо "Echo Reply", когда он работает по UDP?
Выдержка из раздела реализации страницы википедии для traceroute:
"... до тех пор, пока пункт назначения не будет достигнут и не вернет сообщение ICMP Destination Unreachable, если используются пакеты UDP, или сообщение ICMP Echo Reply, если используются сообщения ICMP Echo".
В нем говорится, что на последнем переходе traceroute ожидает ICMP "Destination Unreachable", когда я ожидал, что он будет использовать ICMP "Echo Reply".
Я видел историю страницы, и она была изменена человеком по имени "Гай Харрис". Он говорит: ". . . Если вы используете пакеты UDP, как traceroute делает по умолчанию, последний переход возвращает ICMP Destination Unreachable (если вам не повезло отправить пакет UDP на порт с прослушивателем), а не ICMP Echo Ответить."
Может кто-нибудь, пожалуйста, пролить свет на это?
Источник: https://en.wikipedia.org/wiki/Traceroute
2 ответа
Потому что traceroute нужно получить сообщение, когда дейтаграмма UDP достигла места назначения.
Traceroute работает следующим образом:
- Отправляет дейтаграмму UDP с TTL как 1 на хост назначения. Маршрутизатор считывает дейтаграмму, уменьшает TTL и отправляет обратно сообщение об превышении времени ICMP.
- Traceroute получает вышеупомянутое сообщение и отправляет другую дейтаграмму UDP с TTL как 2. Маршрутизаторы в Интернете читают эту дейтаграмму, каждый уменьшает TTL и, наконец, отправляет обратно сообщение ICMP превышено время.
- Вышеприведенные шаги продолжаются, и, наконец, с TTL, равным N, дейтаграмма UDP достигла хоста назначения. Тогда что должен вернуть хост? Он не может отправить обратно сообщение об превышении времени ICMP, как раньше - TTL не превышен.
Проект трассировки для отправки дейтаграммы UDP на порт хоста, и почти невозможно, чтобы порт прослушивался (33435
например). Хост назначения получает UDP-дейтаграмму, находит, что целевой порт дейтаграммы не прослушивается, и затем возвращает сообщение "Destination Unreachable" - точнее, "Port Unreachable".
Вот почему в последнем прыжке traceroute ожидает сообщение "Destination Unreachable", чтобы определить, что дейтаграмма UDP уже достигла пункта назначения.
Кстати, если целевой порт случайно прослушивается на хосте назначения, это всего лишь сценарий, описанный Ги Харрисом: "если вам не повезло отправить пакет UDP на порт с прослушивателем"
https://www.slashroot.in/how-does-traceroute-work-and-examples-using-traceroute-command
Ссылка выше — это та, которую я нашел вчера, когда пытался сделать ping и функцию traceroute на C. Там довольно хорошо объясняется, как работает traceroute, поэтому я рекомендую всем, кто хочет лучше понять тему, прочитать эту статью. .
Но чтобы дать краткий ответ на ваш вопрос, есть много способов реализовать traceroute. В статье говорится, что их 3. В Linux используется стиль UDP для реализации traceroute, тогда как в Windows используется стиль ICMP. Так что вы не совсем неправы, но ответ немного сложнее.