Почему фрагментация выполняется по IP, а не по TCP/UDP
Я ищу причину, почему фрагментация выполняется на уровне IP, но не для TCP/UDP.
Предположим, что мой кадр выглядит следующим образом: MAC|IP|TCP| Полезная нагрузка |FCS. полный размер, скажем, например: 1600. Здесь происходит PathMTU, почему фрагментация реализована на уровне IP - мой вопрос, и почему не реализована на уровне / коде TCP/UDP.
Заранее спасибо.
5 ответов
Это именно то, для чего предназначены несколько уровней в стеке TCP/IP и в модели ISO/OSI. TCP/UDP являются транспортными протоколами, и они не должны заботиться о фрагментации - это не их проблема. Уровень IP имеет дело с сетью и имеет дело с фрагментацией, так как размер фрагмента зависит от свойств сети. Слой, который имеет наилучшие условия для решения проблемы, решает ее.
Некоторые реализации TCP также определяют MTU и размер своих сегментов, чтобы избежать фрагментации. Это повышает надежность в условиях с потерями, поскольку любой полученный TCP-сегмент может быть подтвержден и не передан повторно. Только потерянные сегменты TCP передаются повторно. Напротив, если какой-либо фрагмент дейтаграммы IP потерян, полезная информация не принимается.
Уровень 4 (TCP/UDP) появляется только в конечных точках (отправитель / получатель). Уровень 3 (IP) входит в число изображений для каждого перехода.
MTU является свойством ссылки, но фрагментация на основе этого свойства ссылки (MTU) всегда выполняется на уровне IP на маршрутизаторе (прыжок).
Теперь связь между каждым переходом может иметь различную пропускную способность, поэтому на каждом этапе необходимо решить, как переслать пакет в пункт назначения. Поскольку MTU - это максимальный объем данных, который может быть передан на канал, и если он меньше размера пакета, который нужно отправить, нужно разбить его на более мелкие куски, чтобы разместить на ссылке.
Поскольку фрагментация и повторная сборка имеет много недостатков, таких как: 1. небольшое увеличение нагрузки на процессор и память 2. больше накладных расходов на пакет из-за добавления заголовков фрагментов 3. если один фрагмент потерян, отправитель должен передать весь пакет
Для решения вышеуказанных проблем: 1. Можно использовать Path MTU Discovery. 2. На уровне 4 может использоваться TCP MSS-зажим.
Если фрагментация была выполнена на более высоких уровнях (TCP, UDP и т. Д.), То это привело бы к избыточной реализации фрагментации / повторной сборки (один раз для протокола); если фрагментация была выполнена на более низком уровне (Ethernet, ATM и т. д.), то это потребовало бы, чтобы фрагментация / повторная сборка выполнялась на каждом переходе (это могло быть довольно дорогостоящим) и осуществлялась с избыточностью (один раз для протокола канального уровня). Таким образом, уровень IP является наиболее эффективным для фрагментации.
Фрагментировать TCP имеет меньше смысла, чем фрагментировать UDP. Так как TCP обеспечивает надежный механизм сегментации / повторной сборки / повторной передачи, можно просто отправлять меньшие сегменты TCP и избегать всей необходимости фрагментации (именно об этом говорит d3jones).
Однако в UDP фрагментация все еще имеет смысл. Вы можете отправить один сегмент UDP больше по длине, чем MTU. Уровень IP будет фрагментировать его правильно и незаметно. Разработчик приложения не должен определять MTU или что-либо в сети, чтобы кодировать протокол уровня приложения.