Как собираются IP-пакеты
Допустим, у нас есть IP-пакет с общим размером 12000 байтов, и мы отправляем этот пакет со станции A на станцию B через канальный уровень. Один кадр Ethernet может нести до 1500 байт данных полезной нагрузки, поэтому в целом нам потребуется 8 кадров Ethernet для передачи IP-пакета размером 12000 байт, правильно?
Давайте предположим, что первый кадр Ethernet (несущий заголовок IP) искажается во время передачи, а поле TotalLength заголовка IP больше не содержит фактическую длину, а лишь какое-то бессмысленное значение. Даже если станция B понимает, что контрольная сумма заголовка больше не действительна и отбрасывает кадр, как станция B может знать, где начинается следующий IP-пакет во входящем потоке данных? Он не знает, сколько байт полезной нагрузки имел первый IP-пакет, верно?
Или размер IP-пакета эффективно ограничен максимальной длиной полезной нагрузки, которую может обрабатывать базовый кадр канала передачи данных?
2 ответа
Хорошо, после более глубокого исследования, это действительно тот случай, когда максимальный размер IP-пакета определяется максимальной единицей передачи (MTU) канала передачи данных.
Для тех, кто заботится, этот сайт разбивает его довольно хорошо: http://aa.net.uk/kb-broadband-mtu.html
Размер IP-фрагмента ограничен MTU, размер IP-пакета ограничен полем размера заголовка IP. Получатель может понять общий размер и то, является ли полученный фрагмент IP первым, или нет, используя поля "Общая длина" и "Смещения фрагмента". Если сборка не удалась, то контрольная сумма следующего слоя скажет вам это, или вы начнете получать фрагменты, которые будут покрывать дублированные смещения. Это для IPv4. Для IPv6 это работает иначе с обязательным обнаружением MTU и почти запрещенной фрагментацией IP-пакетов.