Фрагментация IP: Это все еще норма, верно?
С тех пор, как я занимался программированием сокетов на PDP/11, был случай, когда IP-фрагментация позаботится о случае, когда дейтаграмма IP (такая как дейтаграмма UDP) больше, чем позволяет MTU для сегмента.
Таким образом, я могу отправить дейтаграмму UDP размером 30 кБ, и она может фрагментировать до 20 сегментов по 1,5 кБ по Ethernet, а затем фрагментировать каждый на три сегмента по <576 байтов позже для некоторой конкретной беспроводной линии и до тех пор, пока все фрагменты переходят на другой конец, UDP-датаграмма - на другой конец.
Затем я наткнулся на документацию для сокета UDP в файле node.js, в котором утверждается, что маршрутизаторы будут сбрасывать дейтаграммы, которые не соответствуют MTU следующего сегмента. Я думал, что это относится только к дейтаграммам с битом "не фрагментировать", установленным в заголовке, но учитывая, что node.js должен быть высококачественным продуктом с некоторым авторитетом в сетевых кругах, мне интересно что-то пропустили, и многие маршрутизаторы теперь будут обрабатывать все дейтаграммы, как будто они не фрагментированы?
Вот ссылка: http://nodejs.org/api/dgram.html#dgram_socket_send_buf_offset_length_port_address_callback
Вот цитата:
generally sending a datagram greater than the (receiver) MTU
won't work (the packet gets silently dropped, without informing
the source that the data did not reach its intended recipient).
Итак, я что-то пропустил или нужно обновить документацию по node.js?
2 ответа
Итак, получается, что ответ немного более нюансированный. Фрагментация по-прежнему является частью IPv4 и в значительной степени поддерживается Интернетом в целом. IPv6 удаляет фрагментацию и вместо этого обращается к приложению для обнаружения MTU. Таким образом, документация, которая заставила меня подвергнуть сомнению мои предположения, не столько "неправильна", сколько "живет в будущем, где, так или иначе, большинство людей перешли на IPv6".
Ваше понимание верно в отношении IPv4. Здесь они могут говорить о MTU приемника, т.е. MTU принимающего конца ссылки. MTU можно настроить для каждого порта. Связь - это соединение между двумя портами. Например, в Ethernet вы можете иметь неправильно настроенную локальную сеть, как это
ПОРТ-А (МТУ 1000) <----------> ПОРТ-Б (МТУ 800)
В этом случае отправитель (порт A) будет считать, что MTU канала должен соответствовать MTU, настроенному на нем, и, следовательно, отправит пакет размером 1000 байтов. Когда порт B получает пакет, он, скорее всего, отбросит его, поскольку он больше, чем MTU, настроенный для этого порта.