Где в заголовке IP хранится «время прохождения» Ping?

9

Если мы используем ICMP ping, мы знаем TTL и round-trip timeсохраняем в заголовке IP. На приведенной ниже карте заголовка IP мы знаем местоположение TTL, но где время прохождения туда-обратно ?

Введите описание изображения здесь

Это хранится в Options?

самолет
источник

Ответы:

23

Время прохождения туда и обратно нигде не хранится. Хост-отправитель запоминает время отправки каждого сообщения эхо-запроса ICMP, используя 16-битные поля идентификатора и последовательности ICMP. Когда он получает эхо-ответ ICMP, он отмечает текущее время, находит время, когда он отправил соответствующий пакет запроса, идентифицированный ответом, вычисляет разницу и сообщает о ней.

Обычно ping использует поле идентификации ICMP, чтобы различать несколько одновременных пингов, и поле последовательности, чтобы различать отдельные пакеты.

Реализация решает, где хранить исходящее время для данного пакета: вместо того, чтобы хранить его на хосте в таблице, он обычно отправляет его в исходящем запросе и использует копию в ответе для вычисления времени. (Спасибо комментаторам за указание на это.) Он отправляется любым удобным для реализации способом и, конечно, должен доверять удаленному концу и любому промежуточному оборудованию, чтобы правильно копировать данные. Известно, что некоторые системы представляют время в 16 байтах с разрешением в микросекундах, а некоторые - в 8 байтов с разрешением в миллисекундах.

Формат внутри dataчасти IP-пакета - это сообщение эхо-запроса ICMP / ответа, скопированное сюда из RFC 792 «Формат сообщения управления Интернетом» (p14).

Type8 для запроса, 0 для ответа; Codeэто 0.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-

PS. Для ясности, поле идентификации заголовка IP обычно устанавливается на произвольное значение, отличающееся для каждого исходящего пакета, используется для повторной сборки любой фрагментации и не имеет того же значения, что и что-либо в теле ICMP.

Кроме того, хотя существует механизм, определенный для помещения меток времени в заголовок IP в качестве опции, это не является обычным механизмом для проверки связи, поскольку очень многие маршрутизаторы настроены так, чтобы не пропускать определенные параметры IP. См. RFC 781 Спецификация опции метки времени интернет-протокола.

Наконец, хотя все здесь было написано с точки зрения IPv4, согласно первоначальному вопросу; но ping в IPv6 чрезвычайно похож, см. ICMPv6 RFC 4443 .

jonathanjo
источник
3
AIUI поле «идентификация» используется для идентификации пакетов для повторной сборки фрагмента. Эхо-запросы сопоставляются с эхо-ответами по полям id и seq в заголовке ICMP.
Питер Грин
Спасибо за указание: я уточнил, что это ICMP, а не IP-идентификатор (и, как вы говорите, seq).
Джонатанджо
Я почти уверен, что в pingLinux есть хотя бы одна реализация, которая хранит метку времени в Dataразделе полезной нагрузки ICMP. Это привело к довольно интересному сообщению об ошибке, когда эхо-ответы проходили через интернет-обмен, который немного портился в этом месте в каждом пакете.
Касперд
Вы, конечно, правы, и я обновил ответ, чтобы сказать это; хотя, естественно, хранится абсолютное время отправки согласно часам отправителя, а не сам RTT.
Джонатанджо
3

По крайней мере, с помощью обычной pingутилиты в Linux время отправки пакета сохраняется в части данных пакета эхо-запроса, то есть после заголовков IP и ICMP. Часть данных остается неизменной, когда получатель отвечает эхо-ответом, поэтому отправитель может рассчитать время прохождения туда-обратно.

Это описано на странице man для pingутилиты (в разделе «ПОДРОБНЫЕ ПАКЕТЫ ICMP»):

Если пространство данных имеет размер struct timevalпинга, по крайней мере, использует начальные байты этого пространства, чтобы включить временную метку, которую он использует при вычислении времени прохождения туда-обратно. Если пространство данных короче, время прохождения туда и обратно не указывается.

На моей машине sizeof(struct timeval)16, поэтому установка размера пакетных данных на 15 не дает возможности pingпоказывать время прохождения туда-обратно:

$ ping -s 15 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 15(43) bytes of data.
23 bytes from 8.8.8.8: icmp_seq=1 ttl=121

Конечно, сохранение метки времени отправки в утилите, как описывает ответ @ jonathanjo, также будет возможной реализацией. Даже утилита Linux нуждается во внутренней бухгалтерии, так как она обнаруживает дубликаты пакетов.

ilkkachu
источник
1
Такое ощущение, что это программная ошибка, из-за которой они не могут отображать RTT, когда вы устанавливаете размер данных меньше 16. Но хорошие моменты.
canadadry
@canadadry, Ну, поместить метку времени в сам пакет просто очевидно: единственная ситуация, в которой он нужен, - это когда приходит ответный пакет, поэтому нет смысла хранить его локально. Конечно, программа, похоже, основана на оригинале BSD 80-х, так что она может иметь отношение и к временам. Во всяком случае, я не совсем уверен, почему кто-то хотел бы использовать такие сверхмалые пакеты. Обратите внимание, что даже минимальный размер кадра Ethernet достаточно велик для размещения заголовков Ethernet, IP и ICMP и 16-байтовой метки времени. (Хотя осталось 2 байта, так что места для дальнейшего расширения не так много.)
ilkkachu
@ilkkachu спасибо, что напомнили мне, где часто хранится время; Я обновил свой ответ. Крошечные пакеты: многие сетевые проблемы различаются по размеру пакета.
Джонатанджо
@ikkachu Я посмотрел на пинг-пакеты Cisco: у них также есть время, как 64-битный отсчет миллисекунд.
Джонатанджо