Сети TCP/IP &tg; traceroute

Определение пути, который проходит пакет

Иногда нужно узнать путь, который проходит пакет, прежде чем достигает – или не достигает – цели. Мы обсудим два метода.

Ping

Первый метод основан на добавлении в посылаемый IP-пакет опции RR (Record Route), в которой сохранятся адреса пройденных хостов (сколько поместится). Рассмотрим заголовок IP-пакета, содержащего эту опцию, поподробнее.

Первый байт опции ответственен за ее содержимое. Число 7, стоящее там (тот вариант, который нас сейчас интересует), и означает Record Route (RR). Второй байт отвечает за размер опции, так как максимальный ее размер – 40 байт, то берутся 39 из них, последний просто не нужен (длина IP-адреса равна 4-м байтам). В третьем хранится отступ - номер байта, с которого следует начинать писать следующий адрес, если там стоит 40 – значит, больше адресов не поместится.

Выходит, сохраняются девять адресов, остальные не запоминаются. Первый из них – адрес машины, пакет пославшей. Когда пакет проходит через роутер, тот записывает на выходе в опции свой адрес (соответсвенно, тот, который на выходе).

Именно так программа pingс ключом -R показывает путь вплоть до девяти адресов.

bash-2.05a$ ping -R www.ru
PING www.ru (194.87.0.50): 56 data bytes
64 bytes from 194.87.0.50: icmp_seq=0 ttl=58 time=24.3 ms
RR:	station15.school.ioffe.ru (192.168.5.115)
	ape.school.ioffe.ru (194.85.238.98)
	ioffe-gw.runnet.ru (194.85.36.146)
	spb-gw.runnet.ru (194.85.36.45)
	Moscow-M9-IX.RUN.Net (193.232.244.44)
	m9-3-g4-0-0-vl15.Demos.net (194.87.0.29)
	www.ru (194.87.0.50)
	iki-6-ge0-0.demos.net (194.87.0.86)
	M9-IX-100M.Demos.net (193.232.244.35)
64 bytes from 194.87.0.50: icmp_seq=3 ttl=58 time=5224.3 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=4 ttl=58 time=2227.7 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=5 ttl=58 time=5224.7 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=6 ttl=58 time=524.3 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=7 ttl=58 time=224.9 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=8 ttl=58 time=224.4 ms	(same route)
64 bytes from 194.87.0.50: icmp_seq=9 ttl=58 time=544.2 ms	(same route)
--- www.ru ping statistics ---
11 packets transmitted, 8 packets received, 27% packet loss
round-trip min/avg/max = 19.1/2050.8/5224.3 ms

Из примера видно, что, дойдя за шесть хопов до www.ru, пакет пошёл назад, и в запись пути на обратной дороге были помещены еще два адреса. Те два адреса, которые показаны после www.ru, отличаются от двух показанных перед www.ru, создавая иллюзию того, что назад пакет шел по другому пути. Реальная же причина различия состоит в том, что одна машина может иметь несколько адресов, а маршрутизаторы, адреса которых показаны в примере, являются посредниками между двумя сетями (каждая между своими), и два адреса – это адреса в разных сетях. У такого способа есть, по крайней мере, три недостатка:

  1. Малое количество сохраняемых адресов – обычно пакет проходит раза в два-три больше хостов.
  2. Несмотря на то, что опция является стандартом, она не всегда поддерживается роутерами.
  3. Невозможна диагностика ошибок. Если пакет не дойдет до места назначения, то он и не вернется.

Traceroute

Второй метод основан на том факте, что, когда TTL пакета обнуляется, маршрутизатор отсылает назад ICMP-пакет c сообщеним об ошибке. Этот метод реализован программой traceroute. На хост, о котором мы хотим получить информацию, посылаются UDP-пакеты. Три с TTL = 1, три с TTL = 2, три с TTL = 3, etc., пока какой-нибудь пакет не дойдет до пункта назначения. По дороге, как только TTL пакета обнуляется, маршрутизатор шлет назад в ICMP-пакете сообщение об ошибке – так traceroute узнает его – маршрутизатора – адрес. Максимальное количество хопов по умолчанию – 30, но его можно изменить посредством ключа -m.

bash-2.05a$ traceroute -m 10 www.ru
traceroute to www.ru (194.87.0.50), 10 hops max, 38 byte packets
 1  192.168.5.1 (192.168.5.1)  0.213 ms	 0.174 ms  0.154 ms
 2  gateway.edu.ioffe.ru (194.85.238.1)  0.744 ms * *
 3  * spb-gw.runnet.ru (194.85.36.145)  2.212 ms *
 4  m9-ix.runnet.ru (194.85.36.46)  14.797 ms  13.789 ms *
 5  M9-IX-100M.Demos.net (193.232.244.35)  16.173 ms  14.837 ms *
 6  * www.ru (194.87.0.50)  14.880 ms *

У него, однако, тоже есть свои минусы. Не обязательно, например, UDP- и TCP-пакеты идут по одному и тому же пути, поэтому путь, который покажет traceroute, для TCP-пакета может быть другим. К тому же, не все маршрутизаторы отвечают, так как у некоторых в целях безопасности перекрыт проход ICMP-пакетов.

Дмитрий Гутов