Сети TCP/IP > traceroute

Определение пути IP-пакета

Иногда бывает необходимо определить путь, по которому IP-пакеты идут от одного компьютера к другому. Это нужно, например, для того, чтобы узнать как далеко находится хост, или вычислить узел, на котором происходит обрыв связи. Рассмотрим два возможных способа узнать путь.

Первый способ: Record Route (RR)

Record Route (записывать путь) – опция IP-пакета, которая позволяет записывать IP-адрес router'а. Когда пакет с такой опцией проходит через router, в опциональную часть его header'а дописывается IP-адрес.

Опциональная часть IP-header'а имеет в этом случае длину 39 байт и выглядит следующим образом:

1 байт
тип опции
1 байт
длина опции
1 байт
отступ
4*9 байт
IP-адреса router'ов

Тип опции будет равен 7, что означает Record Route. Длина опции – 39 байт.

В самом начале отступ равен 4. При прохождении пакета через router, в опциональную часть будет дописываться IP-адрес, начиная с отступа, а сам отступ будет увеличиваться на 4. Когда отступ станет равным 40, опциональная часть перестанет изменяться. Таким образом, количество IP-адресов будет не больше 9. Остальные останутся неизвестными.

Послать такой IP-пакет можно, например, при помощи команды ping с ключом -R.

$ /bin/ping -R ioffe.ru
PING ioffe.ru (194.85.224.33): 56 data bytes
64 bytes from 194.85.224.33: icmp_seq=0 ttl=61 time=3.0 ms
RR:     station18.school.ioffe.ru (192.168.5.118)
	ape.school.ioffe.ru (194.85.238.98)
	ioffe2-gw-e0.ioffe.rssi.ru (194.85.224.3)
	ioffe-bbn-fa0-7.ioffe.rssi.ru (194.85.224.62)
	relay.ioffe.rssi.ru (194.85.224.33)
	ioffe-bbn-fa0-3.ioffe.rssi.ru (194.85.224.10)
	gateway.edu.ioffe.ru (194.85.238.1)
	192.168.5.1
	station18.school.ioffe.ru (192.168.5.118)
64 bytes from 194.85.224.33: icmp_seq=1 ttl=61 time=3.5 ms      (same route)
64 bytes from 194.85.224.33: icmp_seq=2 ttl=61 time=3.1 ms      (same route)
64 bytes from 194.85.224.33: icmp_seq=3 ttl=61 time=3.2 ms      (same route)
64 bytes from 194.85.224.33: icmp_seq=4 ttl=61 time=3.0 ms      (same route)

--- ioffe.ru ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 3.0/3.1/3.5 ms

На первый взгляд кажется, что путь пакета "туда" отличается от пути "обратно". Различие может означать, что пути физически разные. Но в данном случае это не так. Различие в путях объясняется тем, что каждый router имеет две сетевые карты с разными IP-адресами. При проходе в одну сторону вписывается один IP-адрес, при проходе в другую – другой. По стандарту должен вписываться IP-адрес сетевой карты, с которой отправляется пакет, но это не всегда выполняется.

А вот пример, когда на пути пакета больше 9 router'ов:

$ /bin/ping -R linux.ru.net
PING linux.ru.net (62.118.250.6): 56 data bytes
64 bytes from 62.118.250.6: icmp_seq=0 ttl=240 time=1460.9 ms
RR:	station18.school.ioffe.ru (192.168.5.118)
	ape.school.ioffe.ru (194.85.238.98)
	ioffe-gw.runnet.ru (194.85.36.146)
	20.201.ATM1-0.201.spb-gw.RUN.Net (193.232.80.106)
	ru-gw.RUN.net (193.10.252.42)
	fi-gw.nordu.net (193.10.68.42)
	s-gw.nordu.net (193.10.68.37)
	dk-gw2.nordu.net (80.77.65.26)
	sl-gw10-cop-14-0.sprintlink.net (80.77.64.38)
64 bytes from 62.118.250.6: icmp_seq=1 ttl=240 time=487.1 ms    (same route)
64 bytes from 62.118.250.6: icmp_seq=2 ttl=239 time=1172.5 ms   (same route)
64 bytes from 62.118.250.6: icmp_seq=3 ttl=240 time=174.9 ms    (same route)
64 bytes from 62.118.250.6: icmp_seq=5 ttl=239 time=328.7 ms    (same route)
64 bytes from 62.118.250.6: icmp_seq=4 ttl=240 time=1383.1 ms   (same route)

--- linux.ru.net ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 174.9/834.5/1460.9 ms

Как видно, записаны только первые 9 хостов, остальные неизвестны.

У такого способа есть три недостатка:

Рассмотрим другой способ установления пути, лишеный этих недостатков.

Второй способ: программа traceroute

Этот способ основан на наличии параметра TTL у IP-пакета. Дело в том, что когда TTL становится равным 0, пакет дальше не идёт. При этом с router'а высылается сообщение об ошибке на тот хост, с которого был послан пакет.

Программа traceroute работает следующим образом: сначала посылаются на требуемый хост 3 udp пакета с TTL, равным 1, затем туда же посылаются 3 udp пакета с TTL, равным 2, и т.д. Каждым следующим шагом узнается информация о следующем router'е.

$ /usr/bin/traceroute slackware.org
traceroute to slackware.org (12.246.148.57), 30 hops max, 38 byte packets
 1  192.168.5.1 (192.168.5.1)  0.274 ms  0.938 ms  0.547 ms
 2  gateway.edu.ioffe.ru (194.85.238.1)  1.151 ms  1.160 ms  1.053 ms
 3  * * spb-gw.runnet.ru (194.85.36.145)  2.140 ms
 4  * 20.201.ATM0-201.ru-gw.RUN.Net (193.232.80.105)  4.270 ms  3.751 ms
 5  fi-gw.nordu.net (193.10.252.41)  12.962 ms  10.103 ms  10.200 ms
 6  s-gw.nordu.net (193.10.68.41)  24.390 ms  15.888 ms  16.402 ms
 7  dk-gw2.nordu.net (193.10.68.38)  23.667 ms  24.498 ms  26.315 ms
 8  sl-gw10-cop-9-0.sprintlink.net (80.77.65.25)  26.351 ms  27.069 ms  24.969 ms
 9  sl-bb20-cop-8-0.sprintlink.net (80.77.64.37)  23.582 ms  24.007 ms  26.225 ms
10  sl-bb21-msq-10-0.sprintlink.net (144.232.19.29)  102.138 ms  102.750 ms  103.631 ms
11  sl-bb20-msq-15-0.sprintlink.net (144.232.9.109)  104.189 ms *  106.533 ms
12  * sl-bb20-nyc-11-3.sprintlink.net (144.232.9.102)  119.565 ms  112.268 ms
13  * 144.232.18.226 (144.232.18.226)  116.951 ms  116.535 ms
14  tbr2-p013802.n54ny.ip.att.net (12.122.12.53)  118.661 ms  121.789 ms  117.365 ms
15  tbr1-p012501.n54ny.ip.att.net (12.122.9.129)  124.477 ms  119.189 ms  116.692 ms
16  * tbr1-p012101.cgcil.ip.att.net (12.122.10.2)  133.425 ms  133.534 ms
17  * * *
18  gbr1-p10.sffca.ip.att.net (12.122.11.66)  191.031 ms  186.387 ms  185.373 ms
19  gbr3-p70.sffca.ip.att.net (12.122.1.161)  186.890 ms  187.010 ms  184.371 ms
20  gar1-p370.sc1ca.ip.att.net (12.122.2.245)  189.616 ms  189.238 ms  195.464 ms
21  12.244.73.33 (12.244.73.33)  187.824 ms  189.678 ms  189.903 ms
22  12.244.69.134 (12.244.69.134)  188.172 ms  189.751 ms  188.590 ms
23  12.244.118.2 (12.244.118.2)  191.495 ms *  187.297 ms
24  12-246-148-57.client.attbi.com (12.246.148.57)  206.639 ms  206.671 ms  225.522 ms

В первой строке написаны адрес host'а, до которого устанавливается путь, максимальное количество шагов (hop'ов) (максимальный TTL, с которым отправляются пакеты) и размер посылаемого UDP-пакета.

В каждой следующей – номер шага, адрес router'a, время в между отправкой UDP пакета и возвратом ошибки.

* означает, что сообщение об ошибке не пришло. Это могло произойти из-за плохой связи, или из-за того, что сообщение об ошибке не может быть отправлено (или переслано) в результате каких-либо настроек промежуточных хостов.

Сергей Немировский