
Окружение: Я пишу клиент-серверное приложение UDP. MTU пути между клиентом и сервером составляет 1500 байт (между ними только беспроводное соединение, поэтому это значение довольно стабильно). Моя система по умолчанию установила бит не фрагментации, и как на клиенте, так и на сервере SO_SENDBUF равен 16384, а SO_RECVBUF = 87380.
Вопрос: Клиент использует sendto для отправки 8192 байт на сервер за один раз. Я использую Wireshark, чтобы посмотреть, как эти 8192 байта будут отправлены в нескольких пакетах, и обнаруживаю, что каждый пакет содержит только 1023 байта данных UDP максимум. Но учитывая MTU пути = 1500, разве я не должен иметь возможность отправлять 1500-20(заголовок IP)-8(заголовок UDP) = 1472 байта данных в каждом пакете? Когда я делаю то же самое с TCP, результат тот, что я ожидал. Каждый пакет TCP может содержать до 1448 байт, что составляет 1500-20(заголовок IP)-32(заголовок TCP с опцией отметки времени). У меня вопрос: почему UDP не помещает 1472 байта в каждый пакет вместо 1023 байт? Это просто незначительная деталь реализации? Или я упустил какие-то системные ограничения?
Примечание: тот же результат можно наблюдать даже при проведении эксперимента на той же машине (с 127.0.0.1 на интерфейсе loopback).
решение1
Вы просто вычитаете накладные расходы для уровней L4(UDP) и L3(IP). Я предполагаю, что накладные расходы в кадре Ethernet (L2) с преамбулой, MAC-адресацией, полем типа и контрольной суммой составят остальное?
http://www.doc.ic.ac.uk/~nd/surprise_97/journal/vol4/mhl/ether01.gif