UDP нічого не знає про MTU. Пакети UDP можуть мати будь-який розмір від 8 до 65535 байт. Рівні протоколів нижче UDP або можуть надсилати пакет певного розміру, або відмовлятимуть надсилати цей пакет з помилкою, якщо він занадто великий.
Шаром нижче UDP зазвичай є IP, або IPv4, або IPv6. І IP-пакет може мати будь-який розмір від 20 (IPv4) / 40 (IPv6) до 65535 байт, це той самий максимум, що і UDP. Однак IP підтримує механізм, який називається фрагментація . Якщо IP-пакет має більші розміри, ніж те, що може перенести шар нижче, IP може розділити один пакет на кілька пакетів, званих фрагментами. Кожен фрагмент насправді є власним пакетом IP (має власний IP-заголовок), а також самостійно надсилається до місця призначення; Тоді завдання призначення зібрати всі фрагменти і відновити повний пакет з них перед передачею отриманих даних на наступний більш високий рівень (наприклад, UDP).
Протокол Ethernet може транспортувати лише кадри з корисним навантаженням між 46 і 1500 байтами (є винятки, але це виходить за межі цієї відповіді). Якщо дані про корисне навантаження менше 46 байт, вони додані до 46 байт. Якщо дані корисної навантаження перевищують 1500 байт, інтерфейс відмовиться приймати їх. Якщо це трапиться, зараз вирішуватиметься будь-який фрагмент пакету, щоб жоден фрагмент не перевищував 1500 байт або повідомляв про помилку на наступному більш високому шарі, якщо фрагментація була вимкнена або заборонена для цього конкретного з'єднання.
Фрагментації, як правило, слід уникати, як
- - це відходи ресурсів на стороні відправника.
- він витрачає ресурси на стороні приймача.
- це збільшує накладні витрати протоколу на стільки ж даних корисного навантаження.
- якщо один фрагмент втрачено, втрачається весь пакет.
- якщо один фрагмент пошкоджений, весь пакет зіпсований.
- у разі повторного надсилання всі фрагменти повинні бути відреаговані.
Ось чому TCP інтелектуально приймає розмір кадру, щоб пакети ніколи не потребували IP для їх фрагментації. Це можна зробити, заборонивши IP для фрагментації пакетів, і якщо IP повідомляє, що пакет занадто великий, щоб його надсилати, TCP зменшує розмір кадру та намагається повторити, поки більше не повідомляється про помилку.
Для UDP, однак, це було б завданням самої програми, оскільки UDP - це "німий" протокол, він не має власної логіки управління, що робить його дуже гнучким, швидким та простим.
Єдиний розмір UDP, на який можна розраховувати, щоб він завжди передавався, це 576 мінус 8 байт заголовка UDP і мінус 20 (v4) / 40 (v6) байт IP-заголовка, оскільки стандарт IP вимагає, щоб кожен IP-хост міг отримувати IP-пакети з загальний розмір 576 байт. Ваша реалізація протоколу не була б стандартною відповідності, якщо вона не може приймати пакети принаймні такого розміру. Однак зауважте, що стандарт не каже 576 без фрагментації, тому навіть IP-пакет 576 байт може роздроблено між двома хостами.
Єдиний розмір пакета, на який ви можете розраховувати, що він може бути переносним без фрагментації, - це 24 байти для IPv4 і 56 байт IPv6, оскільки найменші заголовки IP для фрагмента - 20/48 байт (v4 / v6), а фрагмент повинен мати не менше 4/8 дані про корисне навантаження в байтах (v4 / v6). Таким чином, транспортна система нижче рівня IP, яка не може транспортувати принаймні пакети розмірів тез, не може використовуватися для транспортування IP-трафіку.
І перш ніж хтось коментує, що заголовок IPv6 містить лише 40 байт: Це правильно, але, на відміну від заголовка IPv4, стандартний заголовок IPv6 не має заголовкових полів для фрагментації. Якщо пакет має бути фрагментований, то слід заголовку розширення фрагментації додати нижче базового заголовка IPv6, а цей заголовок розширення становить 8 байт. Також, на відміну від IPv4, зсуви фрагментації в IPv6 рахуються в 8 байтах, а не в 4 байтових одиницях, таким чином, фрагмент може нести корисне навантаження, кратне 8 байтам у випадку IPv6.