Назад | Перейти на главную страницу

Пинг одного и того же адреса несколько раз

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

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

В заголовке ICMP есть идентификатор и порядковый номер, которые используются именно для этой цели. Они занимают 5-7 байтов.

Видеть RFC792 стр. 15:

Идентификатор и порядковый номер могут использоваться отправителем эха для помощи в сопоставлении ответов с запросами. Например, идентификатор может использоваться как порт в TCP или UDP для идентификации сеанса, а порядковый номер может увеличиваться при каждом отправленном запросе. Адресат возвращает те же значения в ответе.

Стандарт ping(1) команда даже включает -f наводнение аргумент, который запрашивает отправку пакетов ping как можно быстрее; ping пытается сделать это как можно быстрее, не теряя пакетов. (Отличный инструмент, чтобы убедиться, что ваша сеть не в ужасном состоянии, просто не делайте этого между машинами OS X, они ограничивают скорость ответов ICMP, и вы задаетесь вопросом об ужасных потерях пакетов.)

Заголовок ICMP включает достаточно информации, чтобы отслеживать 2 ^ 16 ожидающих пакетов ICMP между двумя хостами. От моего /usr/include/linux/icmp.h:

struct icmphdr {
  __u8          type;
  __u8          code;
  __sum16       checksum;
  union {
        struct {
                __be16  id;
                __be16  sequence;
        } echo;
        __be32  gateway;
        struct {
                __be16  __unused;
                __be16  mtu;
        } frag;
  } un;
};