3

В учебных материалах часто изображается один сегмент TCP, который находится внутри одной дейтаграммы IP, которая находится в одном кадре канального уровня.

Это всегда так?

Есть ли гарантия, что сегмент TCP является атомарным и содержится в одной IP-датаграмме?

Применимо ли это к датаграмме и фрейму?

Я имею в виду следующее:

1.

TCP |Segment 1| Segment 2 | Segment 3 |
IP  |Datagram 1   |  Datagram 2 | Datagram 3 |

Таким образом, в основном IP обрабатывает входные данные транспортного уровня как простые байты (как транспортный уровень обрабатывает данные прикладного уровня)

2. Или возможный случай, когда границы IP и TCP совпадают, но в одной дейтаграмме IP находятся больше сегментов TCP, которые нацелены на один и тот же хост, но содержащиеся сегменты TCP являются частью разных TCP-соединений.

TCP |Segment 1 | Segment 2 | Segment 3| Segment 4| Segment 5 | Segment 6|
IP  |Datagram 1            |Datagram 2|Datagram 3                       |

2 ответа2

1

Краткий ответ: нет.

Предполагается, что уровни стека IP не зависят от других уровней. Уровень IP может работать через Ethernet или 802.11 или любой другой протокол уровня канального уровня. Эти уровни могут фрагментировать данные любым способом, необходимым для работы протокола. Теоретически они могли бы посмотреть на заголовок протокола более высокого уровня и настроить их фрагментацию, чтобы соответствовать, но нет никаких требований для этого.

1

Я предполагаю, что вы спрашиваете, может ли произойти поток данных, который выглядит так:

 TCP:       |     SEGMENT 1          |   SEGMENT 2    |   ...
 IP:        |  FRAGMENT 1   |   FRAGMENT 2   |   FRAGMENT 3    | ...

... то есть IP-фрагмент 1 содержит первую часть TCP-сегмента 1; Фрагмент IP 2 содержит последнюю часть сегмента TCP 1 и первую часть сегмента TCP 2; и т.п.

Вы можете получить это? Да. Что этому мешает? Если вы создаете принимающую реализацию, вы должны быть готовы ко всему, что мир может бросить на вас.

Это действительно? Да, также. IP-пакеты могут быть фрагментированы при передаче, тогда как TCP-сегментация должна происходить только в конечных точках. Я думаю, что очень маловероятно, что одна передающая ОС когда-либо будет передавать данные, которые сегментированы и фрагментированы, но если реализация TCP сегментирует данные вообще и передает по сети IP, то данные IP могут быть фрагментированы при передаче, и вышеуказанное поведение наблюдается.

Более подробная информация в RFC 791, https://www.ietf.org/rfc/rfc791.txt, см. Раздел «Фрагментация».

Что касается пакета и фрейма, существуют аналогичные соображения, хотя у меня нет материала для цитирования. Реализация IP не должна заботиться о том, как она получает IP-пакеты, если только она может восстановить границы пакетов, что она может и должна делать без информации о границах от канального уровня.

Во многих случаях есть преимущества для обеспечения того, чтобы полезные данные помещались в одном блоке передачи. Если вы знаете MTU (максимальную передаваемую единицу) между вами и вашим пунктом назначения, то вы можете максимизировать отношение пропускной способности данных к издержкам протокола, подгоняя ваши данные к MTU. Но это лучший вариант, а не общий случай.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .