Вопрос по sockets, udp, networking, ipv4 – Какой самый большой размер безопасного UDP-пакета в Интернете
Я прочитал ряд статей о размерах пакетов UDP, но не смог прийти к выводу о том, что правильно.
Ряд сервисов ограничивает наибольший пакет UDP 512 байтами (например, днс)
Учитывая минимумМТУ в Интернете - 576, размер заголовка IPv4 - 20 байтов, а заголовка UDP - 8 байтов. Это оставляет 548 байт доступными для пользовательских данных.
Смогу ли я использовать пакеты размером до 548 без фрагментации пакета? Или есть что-то, о чем знали создатели DNS, и именно поэтому они ограничили его 512 байтами.
Могу ли я даже безопасно превысить 548 байт?
Это правда, чтоtypical Заголовок IPv4 составляет 20 байтов, а заголовок UDP - 8 байтов. Однако можно включить опции IP, которые могут увеличить размер заголовка IP до 60 байтов. Кроме того, иногда промежуточным узлам необходимо инкапсулировать дейтаграммы внутри другого протокола, такого какIPsec (используется для VPN и т.п.), чтобы направить пакет к месту назначения. Так что если вы не знаетеМТУ на вашем конкретном сетевом пути лучше оставить разумный запас для другой информации заголовка, которую вы, возможно, не ожидали. Обычно считается, что для этого используется полезная нагрузка UDP объемом 512 байт, хотя даже это не оставляет достаточно места для заголовка IP максимального размера.
В этой статье описывается максимальная единица передачи (MTU)http://en.wikipedia.org/wiki/Maximum_transmission_unit, В нем говорится, что IP-хосты должны иметь возможность обрабатывать 576 байтов для IP-пакета. Тем не менее, он отмечает, что минимальное значение равно 68. RFC 791: «Каждый интернет-модуль должен иметь возможность пересылать дейтаграмму из 68 октетов без дальнейшей фрагментации. Это связано с тем, что заголовок Интернета может содержать до 60 октетов, а минимальный фрагмент - 8 октетов. & Quot;
Таким образом, безопасный размер пакета 508 = 576 - 60 (заголовок IP) - 8 (заголовок udp) является разумным.
Как упомянуто пользователем 607811, фрагментация по другим сетевым уровням должна быть повторно собрана. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Сборка Уровень IP ДОЛЖЕН осуществлять повторную сборку дейтаграмм IP. Мы определяем самый большой размер дейтаграммы, который можно собрать EMTU_R («Эффективный MTU для приема»); это иногда называется «размер буфера повторной сборки». EMTU_R ДОЛЖЕН быть больше чем или равно 576
Теоретический предел (в Windows) для максимального размера пакета UDP составляет 65507 байт. Этозадокументировано здесь:
The correct maximum UDP message size is 65507, as determined by the following formula: 0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507
При этом большинство протоколов ограничиваются гораздо меньшим размером - обычно либо 512, либо иногда 8192. Вы можете часто подняться выше 548, если находитесь в надежной сети - но если вы вещаете через Интернет в целом, чем больше чем больше, тем больше вероятность того, что вы столкнетесь с проблемами и потерями при передаче пакетов.
Я прочитал несколько хороших ответов здесь; Однако есть небольшие ошибки. Некоторые ответили, что поле длины сообщения в заголовке UDP не более 65535 (0xFFFF); это технически верно. Некоторые ответили, что фактический максимум равен (65535 - IPHL - UDPHL = 65507). Ошибка заключается в том, что поле длины сообщения в заголовке UDP включает всю полезную нагрузку (уровни 5-7), а также длину заголовка UDP (8 байт). Это означает, что если поле длины сообщения составляет 200 байт (0x00C8), полезная нагрузка фактически составляет 192 байта (0x00C0).
Что сложно и быстро, так это то, что максимальный размер дейтаграммы IP составляет 65535 байт. Это число получается из суммы заголовков L3 и L4 плюс полезная нагрузка уровней 5-7. Заголовок IP + заголовок UDP + уровни 5-7 = 65535 (макс.).
Самый правильный ответ для того, какой максимальный размер UDP-данных имеет размер 65515 байт (0xFFEB), поскольку дейтаграмма UDP включает заголовок UDP. Самый правильный ответ для максимального размера полезной нагрузки UDP - 65507 байт, поскольку полезная нагрузка UDP не включает заголовок UDP.
The maximum safe UDP payload is 508 bytes. Это размер пакета 576 минус максимальный 60-байтовый заголовок IP и 8-байтовый заголовок UDP. Любая полезная нагрузка UDP такого размера или меньше гарантированно доставляется по IP (хотя не гарантируется, что она будет доставлена). Все, что больше, может быть удалено любым маршрутизатором по любой причине. За исключением маршрута только для IPv6, где максимальная полезная нагрузка составляет 1212 байт. Как уже упоминалось, дополнительные заголовки протокола могут быть добавлены в некоторых случаях. Вместо этого может быть предпочтительным более консервативное значение около 300-400 байт.
Any UDP packet may be fragmented. Но это не слишком важно, потому что потеря фрагмента имеет тот же эффект, что и потеря нефрагментированного пакета: весь пакет отбрасывается. С UDP это произойдет в любом случае.
Интересно, что максимальный теоретический размер пакета составляет около 30 МБ (1500 MTU Ethernet - 60 IP-заголовков x 65 536 максимальное количество фрагментов), хотя вероятность его прохождения будет бесконечно мала.
Источники: RFC 791, RFC 2460
Учитывая, что IPV6 имеет размер 1500, я бы сказал, что операторы связи не будут предоставлять отдельные пути для IPV4 и IPV6 (они оба являются IP с разными типами), заставляя их использовать оборудование для ipv4, которое будет старым, избыточным, более дорогим в обслуживании и менее надежный. Это не имело бы никакого смысла. Кроме того, это может легко рассматриваться как предоставление преференциального режима для некоторого трафика - нет, нет по правилам, о которых они, вероятно, не заботятся (если их не поймают).
Таким образом, 1472 должен быть безопасным для внешнего использования (хотя это не означает, что такое приложение, как DNS, которое не знает о EDNS, примет его), и если вы говорите по внутренним сетям, вы, скорее всего, знаете схему сети в этом случае. Размеры пакетов jumbo применяются для не фрагментированных пакетов (4096 - 4068 байт), а для карт Intel с 9014-байтовыми буферами размер пакета составляет ... подождите ... 8086 байт, было бы максимум ... совпадение?snicker
****ОБНОВИТЬ****
Различные ответы дают максимальные значения, разрешенные одним поставщиком ПО, или различные ответы, предполагающие инкапсуляцию. Пользователь не запрашивал наименьшее возможное значение (например, «0» для безопасного размера UDP), но наибольший безопасный размер пакета.
Значения инкапсуляции для различных слоев могут быть включены несколько раз. Поскольку после того, как вы инкапсулировали поток, ничто не запрещает, скажем, уровень VPN ниже этого уровня и полное дублирование уровней инкапсуляции выше этого уровня.
Поскольку речь шла о максимально безопасных значениях, я предполагаю, что они говорят о максимально безопасном значении для пакета UDP, который может быть получен. Поскольку UDP-пакет не гарантирован, при получении UDP-пакета самый большой безопасный размер будет 1 пакетом по IPv4 или 1472 байта.
Примечание. Если вы используете IPv6, максимальный размер будет 1452 байта, поскольку размер заголовка IPv6 составляет 40 байтов против размера 20 байтов IPv4 (и в любом случае, для заголовка UDP все равно необходимо разрешить 8 байтов) ,
576 этоminimum maximum reassembly buffer sizeкаждая реализация должна иметь возможность собирать пакетыat least этот размер. УвидетьIETF RFC 1122 для деталей.
IPv4minimum reassembly buffer size 576, IPv6 имеет 1500. Вычтите размеры заголовков отсюда. УвидетьСетевое программирование в UNIX У. Ричарда Стивенса :)