Проблемы с диапазоном полей идентификации IPv4

Я использовал сокет UDP (IPv4), отправляя пакет размером 64 КБ в конечную систему. Когда я захватил пакеты конечной системы с помощью Wireshark, я обнаружил, что поле IP-идентификации повторно собранной IP-дейтаграммы находится в диапазоне от 0x0000-0x7fff(0-32767), т. Е. Когда конечная система получила дейтаграмму с ID 0x7fff, следующая дейтаграмма содержит значение id 0x0000, а не 0x8000.

Это меня сильно смутило. Почему не 0x0000-0xffff(0-65536)?

Моя программа-отправитель написана с использованием кода C #, работающего в Windows7. Марка сетевой карты - Intel.

Пожалуйста помоги.


person S Lee    schedule 05.06.2018    source источник


Ответы (1)


Значение поля идентификации выбирается отправителем. Он может быть размещен любым способом, который нравится отправителю. RFC 791 говорит об этом следующее (курсив мой):

Поле идентификации используется для отличия фрагментов одной дейтаграммы от фрагментов другой. Модуль исходящего протокола интернет-дейтаграммы устанавливает в поле идентификации значение, которое должно быть уникальным для этой пары источник-получатель и протокола на время, пока дейтаграмма будет активна в интернет-системе. Исходный протокол Модуль полной дейтаграммы устанавливает флаг more-fragments в ноль и смещение фрагмента в ноль.

Таким образом, отправляющая система может ограничивать свои identification значения до 0 - 0x7fff, пока любая дейтаграмма "уникальна ... на время, пока дейтаграмма будет активной".

person Gil Hamilton    schedule 05.06.2018
comment
Спасибо за Ваш ответ! Есть ли способ заставить систему отправки ограничить значения идентификации до 0x0000-0xffff? Я отправлял пакеты Udp с высокой скоростью, поэтому произошла ошибка, упомянутая в RFC4963 : «Если отправитель оборачивает поле идентификатора за время, меньшее, чем таймаут повторной сборки, становится возможным некорректное объединение фрагментов из разных дейтаграмм (неправильное связывание) , и доставляется протоколу верхнего уровня ». Windows хранит фрагменты, которые не собираются повторно, в буфере в течение 60 с. Если я могу заставить отправителя использовать полное значение идентификатора диапазона, это явление будет уменьшено - person S Lee; 06.06.2018
comment
Я сомневаюсь, что есть способ заставить это сделать. Если есть, это будет специфично для Windows. Я бы порекомендовал вам сохранять размер датаграмм достаточно маленьким, чтобы их не нужно было фрагментировать. Учтите, что если вы отправляете дейтаграмму UDP размером 64 КБ, она разбивается на N меньших IP-фрагментов (в пределах MTU интерфейса - обычно 1500 байтов, то есть обычно 44 фрагмента). Если какой-либо из них будет отброшен или поврежден, вся дейтаграмма UDP никогда не будет доставлена ​​получателю. Если дейтаграммы не фрагментированы, содержимое поля идентификации не имеет значения. - person Gil Hamilton; 06.06.2018
comment
Я понял. Спасибо за совет! - person S Lee; 07.06.2018