2016-08-02 2 views
2

Мы все знаем, что протокол TCP является потоковым протоколом.Как TCP фрагментирует свои данные

В отличие от UDP, который гарантирует, что все сообщение клиента будет доставлено на сервер в виде единой дейтаграммы (мы говорим о транспортном уровне, поэтому избегайте MTU на данный момент), TCP может фрагментировать одно «сообщение» (данные, которые был передан функции send) в несколько меньших пакетов, поэтому мы должны использовать наши собственные разделители как границы сообщений.

Вопрос в том, как TCP выбирает, какие данные должны быть фрагментированы и по каким размерам? Существуют ли общие/стандартные методы, которые он использует?

+0

@ Robᵩ Итак, нет общих правил или стандартных методов фрагментации? – FrozenHeart

+0

Нет, которые можно наблюдать из прикладной программы. Какую проблему ты пытаешься решить? –

+0

@ Robᵩ Это более теоретический вопрос, чем практический. Интересно знать о таких вещах – FrozenHeart

ответ

2

TCP использует параметр с именем Maximum Segment Size:

Максимальный размер сегмента (MSS) является параметром поля опций заголовка TCP, который определяет наибольшее количество данных, указанный в байтах, что компьютер или устройство связи может принимать в одном сегменте TCP. Он не учитывает заголовок TCP или IP-заголовок. IP-датаграмма, содержащая сегмент TCP, может быть автономной внутри одного пакета или может быть реконструирована из нескольких фрагментированных фрагментов; в любом случае предел ПСС применяется к общему объему данных, содержащихся в окончательном, восстановленном сегменте TCP.

Максимальный размер сегмента TCP по умолчанию - 536. Если хост хочет установить максимальный размер сегмента на значение, отличное от значения по умолчанию, максимальный размер сегмента указан как параметр TCP, первоначально в пакете TCP SYN во время рукопожатие TCP. Значение не может быть изменено после установления соединения.

Если включено path MTU discovery, MSS устанавливается на этот минус размер заголовков TCP.

На Linux TCP_MAXSEG опции сокета управляет параметром:

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

+0

Я считаю, что объяснения сетевых протоколов, таких как TCP, чрезвычайно интересны :) – pjcognetta

+0

Итак, он может быть фрагментирован на более мелкие пакеты как на уровне TCP (каждый пакетный максимум до MSS), так и на уровне IP (каждый пакет макс. MTU), правильно? – FrozenHeart

+2

@FrozenHeart Yep, TCP разбивает данные на сегменты, IP-слой на фрагменты. –

Смежные вопросы