Я пишу приложение python клиент-сервер, часть которого использует UDP Multicast для связи. И сейчас меня беспокоит фрагментация.
RFC 791 (страница 24) говорит:
Каждый интернет-модуль должен иметь возможность пересылать датаграмму из 68 октетов без дальнейшей фрагментации. Это связано с тем, что заголовок Интернета может иметь длину до 60 октетов, а минимальный фрагмент - 8 октетов.
Читая вышесказанное, я понимаю, что у нас может быть PDU уровня приложения размером 8 байт, который может передаваться без фрагментации.
В Packet Tracer (приложении, в котором вы можете настраивать маршрутизаторы в виртуальной среде) минимально допустимый MTU составляет 64 (см. Изображение ниже). Это означает, что гарантированный размер PDU прикладного уровня может составлять 4 байта?
Возможно, я неправильно понял это, поэтому мне нужна ваша помощь.
Возникает вопрос: каков должен быть размер PDU прикладного уровня, чтобы содержащий его IP-пакет мог пройти без фрагментации? 4 или 8 байтов?
RFC791 Указывает только IP. Поскольку вы будете использовать UDP, вы должны прочитать RFC791 вместе с RFC768 который определяет UDP. Заголовок дейтаграммы UDP составляет 8 октетов, включая двухоктетное поле длины с минимальным значением 8 (длина заголовка).
При минимальном уровне PDU уровня 3 (IP) в 68 октетов, если вы используете UDP в качестве протокола уровня 4, самый большой пакет данных более высокого уровня, который вы можете передать без фрагментации (когда используется максимальная длина заголовка IP в 60 октетов), равен нулю. октеты - минимум 8 октетов были использованы заголовком дейтаграммы UDP!
Если вы хотите иметь пакет прикладного уровня из 8 октетов с использованием UDP через IP, и вы предполагаете, что заголовок IP регулярно достигает максимальной длины 60 октетов, вам понадобится канал с MTU 76 или более, чтобы гарантировать, что ваши пакеты не будут требуется фрагментация.
Однако следует отметить, что RFC791 также утверждает (стр. 13):
The maximal internet header is 60 octets, and a typical internet Header
is 20 octets
Если вы предполагаете типичный размер заголовка Интернета по (неправильно настроенному) каналу с MTU в 64 октета, вы все равно сможете передать пакет приложения размером 36 октетов до фрагментации:
MTU - IP_HDR - UDP_HDR
= 64 - 20 - 8
= 36 octets
Однако в большинстве реальных сценариев вам не следует сталкиваться с сетями с такими маленькими значениями MTU (если вы не разговариваете с ПЛК в мире Embedded / SCADA или другой аналогичной ограниченной среде).