Де в заголовку IP зберігається "час обертання" Пінга?


9

Якщо ми використовуємо ICMP ping, ми знаємо TTL і round-trip timeзберігаємося в заголовку IP. На наведеній нижче карті заголовка IP ми знаємо місце TTL, але де час у зворотному напрямку ?

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

Чи зберігається він у Options?

Відповіді:


23

Час поїздки в обидва кінці фактично нікуди не зберігається. Хост-відправник запам'ятовує час, коли він надсилає кожне повідомлення ICMP Echo Request, використовуючи 16-бітний ідентифікатор і поля послідовності ICMP. Коли він отримує відповідь ICMP Echo, він відзначає поточний час, знаходить час, коли він надіслав відповідний пакет запитів, ідентифікований відповіддю, обчислює різницю та повідомляє про це.

Зазвичай ping використовує поле ідентифікації ICMP для диференціювання декількох одночасних pings, а поле послідовності для диференціації окремих пакетів.

Залежно від реалізації вирішувати, де зберігати вихідний час для даного пакету: замість того, щоб зберігати його на хості в таблиці, він зазвичай надсилає його у вихідному запиті та використовує копію у відповіді для обчислення часу. (Дякую коментаторам, що вказали на це.) Він надсилається будь-яким зручним для реалізації способом, і, звичайно, слід довіряти дальній частині та будь-якому інтервенційному обладнання, щоб правильно скопіювати дані. Як відомо, деякі системи представляють час у 16 ​​байтах з роздільною здатністю мікросекунд, деякі - 8 байт з роздільною здатністю мілісекунд.

Формат всередині dataчастини пакету IP - це повідомлення ICMP Echo Request / Reply, скопійоване тут з RFC 792 "Формат повідомлення Internet Control" (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 як опція, це не звичайний механізм для ping, оскільки дуже багато маршрутизаторів налаштовані не передавати певні параметри IP. Див. RFC 781 Специфікація параметрів часової мітки Інтернет-протоколу.

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


3
AIUI поле "ідентифікація" використовується для ідентифікації пакетів для складання фрагмента. Ехо-запити порівнюються з ехо-відповідями полями id та seq в заголовку ICMP.
Пітер Грін

Дякуємо, що вказали на це: я уточнив, що це ICMP не IP-ідентифікатор (та seq, як ви говорите).
jonathanjo

Я впевнений, що в pingLinux є принаймні одна реалізація, яка зберігає часові позначки в Dataрозділі корисного навантаження ICMP. Це призвело до досить цікавого повідомлення про помилку, коли відповіді ехо проходили через Інтернет-обмін, який трохи пошкоджував це місце у кожному пакеті.
kasperd

Ви, звичайно, маєте рацію, і я оновив відповідь, щоб сказати це; хоча, природно, це абсолютний час відправки відповідно до збереженого годинника відправника, а не самої RTT.
jonathanjo

3

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

Це описано на головній сторінці pingутиліти (у розділі "Деталі пакету ICMP"):

Якщо простір даних має розмір щонайменше за розміром struct timevalping, то початкові байти цього простору включають часову позначку, яку він використовує під час обчислення часу кругової поїздки. Якщо простір даних коротший, час зворотної поїздки не задається.

На моїй машині 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 потребує деякої внутрішньої бухгалтерії, оскільки вона виявляє повторювані пакети.


1
Схоже, це помилка в програмі, що вони не можуть відображати RTT, коли ви встановлюєте розмір даних менше 16. Але хороші бали.
canadadry

@canadadry, Що ж, розміщення часової позначки в самому пакеті просто очевидно: єдина ситуація, яка потрібна, це коли приходить пакет відповідей, тому немає необхідності зберігати його локально. Звичайно, здається, що програма походить від оригіналу BSD 80-х, тому вона може мати щось спільне і з часом. У всякому разі, я не зовсім впевнений, чому хто-небудь хотів би використовувати такі зайві невеликі пакети. Зауважте, що навіть мінімальний розмір кадру Ethernet є досить великим для розміщення заголовків Ethernet, IP та ICMP та 16-байтовою міткою часу. (Хоча з 2 байтами залишилось, тож мало місця для подальшого розширення.)
ilkkachu

@ilkkachu дякую, що нагадав, де часто зберігається час; Я оновив свою відповідь. Повторні пакети: багато мережевих проблем диференційовані за розміром пакету.
jonathanjo

@ikkachu Я поглянув на пінг-пакети Cisco: вони також мають час, оскільки 64-бітне число мілісекунд.
jonathanjo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.