Пинговать один и тот же адрес несколько раз
Мне просто интересно, можно ли пинговать один и тот же IP-адрес из одного и того же источника несколько раз (то есть достаточно быстро, чтобы они передавались по конвейеру) и все же получить действительный результат. Под верным результатом я имею в виду, что вы записываете правильное время приема-передачи для всех пакетов ping.
Я имею в виду, что существует вероятность того, что пакеты могут быть смешаны, поэтому получатель не знает, какой пакет какой, и, следовательно, записанное время прохождения сигнала туда и обратно не будет точным. Существуют ли механизмы с ICMP или IP, которые нумеруют пакеты пингования, чтобы их можно было отличить от других пингов по тому же адресу.
2 ответа
В заголовке 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;
};