Мне просто интересно, можно ли пинговать один и тот же 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;
};