Когда traceroute использует TCP? Или он просто использует UDP, а также почему Traceroute использует UDP на MacX и ICMP на Windows? Я думал, что ICMP просто содержит сообщение о том, что вызвало ошибку пакета, и не передает такие сегменты, как TCP и UDP.
Сообщения ICMP по-прежнему являются IP-пакетами. Traceroute использует ECHO Request
(ICMP типа 8) по умолчанию в Unix и Windows с увеличивающимся TTL, регистрируя адрес отправки каждого Time Exceeded
(Тип 11) сообщение, которое он получает от переходов по маршруту. (ср: http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol)
Это «правильный» способ сделать это, но вы можете столкнуться с проблемами, если некоторые из систем на маршруте отключаются или по-другому обрабатывают трафик ICMP.
Некоторые реализации traceroute
(например, в Linux) есть -T
и -U
варианты переключения на TCP / UDP вместо этого (и следующие -p
аргумент для указания порта назначения). Это полезно для более точного моделирования реального трафика, что в некоторых случаях может дать более точный результат.
Я подозреваю, что реализация OSX по умолчанию использует UDP по этой причине, но я не могу сказать наверняка. Вместо этого вы можете найти переключатель для использования ICMP.
Windows Tracert обычно использует ICMP с определенным TTL. TTL увеличивается с каждым прыжком, пока не достигнет пункта назначения. Это означает, что первый переход имеет TTL (max-hop-count), равный 1. Даже если пакет не достигает цели, первый переход отбрасывает его и отправляет обратно сообщение TIME EXCEEDED, это сообщение используется для сопоставления маршрута. , и следующий ICMP отправляется с TTL равным 2.
OSX и Linux по умолчанию используют UDP с увеличивающимися номерами портов, но оба могут быть настроены для использования пакетов TCP, UDP, ICMP или GRE.