Определение пути 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 хостов, остальные неизвестны.
У такого способа есть три недостатка:
- Ограничение на количество router'ов до 9 в пути пакета.
- Некоторые router'ы могут игнорировать или портить опциональную часть.
- Мы узнаем путь только тогда, когда пакет успешно дойдет до адресата и вернётся обратно.
Рассмотрим другой способ установления пути, лишеный этих недостатков.
Второй способ: программа 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 пакета и возвратом ошибки.
* означает, что сообщение об ошибке не пришло. Это могло произойти из-за плохой связи, или из-за того, что сообщение об ошибке не может быть отправлено (или переслано) в результате каких-либо настроек промежуточных хостов.