Якщо ми використовуємо ICMP ping
, ми знаємо TTL і round-trip time
зберігаємося в заголовку IP. На наведеній нижче карті заголовка IP ми знаємо місце TTL, але де час у зворотному напрямку ?
Чи зберігається він у Options
?
Якщо ми використовуємо ICMP ping
, ми знаємо TTL і round-trip time
зберігаємося в заголовку IP. На наведеній нижче карті заголовка IP ми знаємо місце TTL, але де час у зворотному напрямку ?
Чи зберігається він у Options
?
Відповіді:
Час поїздки в обидва кінці фактично нікуди не зберігається. Хост-відправник запам'ятовує час, коли він надсилає кожне повідомлення ICMP Echo Request, використовуючи 16-бітний ідентифікатор і поля послідовності ICMP. Коли він отримує відповідь ICMP Echo, він відзначає поточний час, знаходить час, коли він надіслав відповідний пакет запитів, ідентифікований відповіддю, обчислює різницю та повідомляє про це.
Зазвичай ping використовує поле ідентифікації ICMP для диференціювання декількох одночасних pings, а поле послідовності для диференціації окремих пакетів.
Залежно від реалізації вирішувати, де зберігати вихідний час для даного пакету: замість того, щоб зберігати його на хості в таблиці, він зазвичай надсилає його у вихідному запиті та використовує копію у відповіді для обчислення часу. (Дякую коментаторам, що вказали на це.) Він надсилається будь-яким зручним для реалізації способом, і, звичайно, слід довіряти дальній частині та будь-якому інтервенційному обладнання, щоб правильно скопіювати дані. Як відомо, деякі системи представляють час у 16 байтах з роздільною здатністю мікросекунд, деякі - 8 байт з роздільною здатністю мілісекунд.
Формат всередині data
частини пакету IP - це повідомлення ICMP Echo Request / Reply, скопійоване тут з RFC 792 "Формат повідомлення Internet Control" (p14).
Type
8 для запиту, 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 як опція, це не звичайний механізм для ping, оскільки дуже багато маршрутизаторів налаштовані не передавати певні параметри IP. Див. RFC 781 Специфікація параметрів часової мітки Інтернет-протоколу.
Нарешті, хоча все тут було написано з точки зору IPv4, за оригінальним запитанням; але ping в IPv6 надзвичайно схожий, див. ICMPv6 RFC 4443 .
ping
Linux є принаймні одна реалізація, яка зберігає часові позначки в Data
розділі корисного навантаження ICMP. Це призвело до досить цікавого повідомлення про помилку, коли відповіді ехо проходили через Інтернет-обмін, який трохи пошкоджував це місце у кожному пакеті.
Принаймні, за допомогою загальної ping
утиліти для Linux, час, коли пакет був відправлений, зберігається в частині даних пакету ехо-запиту, тобто після заголовків IP та ICMP. Частина даних залишається недоторканою, коли одержувач відповідає ехо-відповіддю, тому відправник може обчислити час зворотного шляху.
Це описано на головній сторінці ping
утиліти (у розділі "Деталі пакету ICMP"):
Якщо простір даних має розмір щонайменше за розміром
struct timeval
ping, то початкові байти цього простору включають часову позначку, яку він використовує під час обчислення часу кругової поїздки. Якщо простір даних коротший, час зворотної поїздки не задається.
На моїй машині 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 потребує деякої внутрішньої бухгалтерії, оскільки вона виявляє повторювані пакети.