Traceroute, ICMP, UDP и TCP
Когда traceroute использует TCP? Или он просто использует UDP, а также почему Traceroute использует UDP на MacX и ICMP на Windows? Я думал, что ICMP просто содержит сообщение о том, что вызвало ошибку пакета, и не передает сегменты, такие как TCP и UDP.
3 ответа
Сообщения 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.
Чтобы GNU Traceroute использовал ICMP, как это делает Windows, используйте:
traceroute host -I