Открыть сервис

Максимальный размер сегмента

Максимальный размер сегмента (англ. Maximum Segment Size, MSS) — параметр протокола управления передачей (TCP), определяющий наибольшее количество байт данных, которое может быть передано в одном сегменте TCP без учёта заголовков транспортного и сетевого уровней. Значение MSS указывается в байтах и используется для предотвращения фрагментации IP-пакетов на пути следования, что повышает эффективность передачи данных и снижает вероятность потери пакетов. MSS является одним из ключевых параметров настройки TCP-соединения, влияющим на производительность сети.

История и происхождение

Параметр MSS был введён в спецификацию протокола TCP в 1981 году в RFC 793 (Transmission Control Protocol). Изначально TCP предполагал, что максимальный размер сегмента может быть любым, но на практике для обеспечения совместимости с различными сетевыми технологиями потребовалось стандартизировать это значение. В ранних реализациях TCP MSS часто устанавливался равным 536 байтам (стандартный размер для сетей с минимальным MTU — 576 байт, за вычетом 20 байт заголовка IP и 20 байт заголовка TCP). Позднее, с развитием сетей Ethernet (MTU 1500 байт), распространённым значением MSS стало 1460 байт (1500 − 20 − 20). В 1992 году RFC 1191 (Path MTU Discovery) предложил механизм автоматического определения MSS на основе максимального размера передаваемого блока (MTU) по пути следования пакетов, что позволило динамически адаптировать размер сегмента к конкретной сети.

Определение и расчёт

MSS вычисляется как разность между максимальным размером передаваемого блока (MTU) сетевого уровня и суммарным размером заголовков IP и TCP. Для IPv4 заголовок IP обычно составляет 20 байт (без опций), заголовок TCP — 20 байт (без опций). Таким образом, стандартная формула: MSS = MTU − 40. Для IPv6 заголовок IP равен 40 байтам, поэтому формула принимает вид: MSS = MTU − 60. В реальных сетях MTU может варьироваться в зависимости от технологии (Ethernet — 1500, PPPoE — 1492, FDDI — 4352, Wi-Fi — 1500, но с возможностью увеличения до 2304 байт). При использовании туннелей (VPN, GRE, IPsec) MTU уменьшается, что требует соответствующего снижения MSS.

Примеры расчёта MSS для различных технологий

ТехнологияMTU (байт)MSS для IPv4 (байт)MSS для IPv6 (байт)
Ethernet150014601440
PPPoE149214521432
FDDI435243124292
Wi-Fi (802.11)150014601440
Token Ring446444244404

Передача и согласование MSS

При установлении TCP-соединения (трёхэтапное рукопожатие) каждый участник может указать значение MSS в опции TCP-заголовка синхронизации (SYN). Согласно RFC 793, если сторона не указывает MSS, по умолчанию принимается значение 536 байт. Указанное значение MSS не может превышать MTU интерфейса отправителя, но может быть меньше. После согласования MSS стороны используют наименьшее из двух значений, чтобы избежать фрагментации на пути следования. Однако MSS не гарантирует отсутствия фрагментации на промежуточных маршрутизаторах, если MTU на каком-либо участке меньше, чем указанное значение. Для решения этой проблемы применяется механизм Path MTU Discovery (PMTUD), описанный в RFC 1191.

Path MTU Discovery

PMTUD позволяет определить минимальный MTU по всему пути следования пакетов от отправителя к получателю. Отправитель отправляет пакет с установленным флагом «Don't Fragment» (DF) и размером, равным предполагаемому MTU. Если пакет превышает MTU на каком-либо маршрутизаторе, тот отправляет ICMP-сообщение «Fragmentation Needed» (тип 3, код 4) с указанием нового MTU. Отправитель уменьшает MSS и повторяет попытку. Этот процесс повторяется до тех пор, пока пакет не достигнет получателя без фрагментации. PMTUD является стандартным механизмом для большинства современных TCP-реализаций, включая Linux, Windows и macOS.

Влияние на производительность сети

Выбор значения MSS напрямую влияет на эффективность использования пропускной способности канала. Слишком маленький MSS увеличивает накладные расходы на заголовки (соотношение полезных данных к служебным ухудшается), что снижает реальную скорость передачи. Слишком большой MSS может привести к фрагментации IP-пакетов, что увеличивает вероятность потери пакетов и требует повторной передачи, снижая производительность. Оптимальное значение MSS обычно соответствует максимальному MTU по пути следования, определённому с помощью PMTUD. В сетях с высоким уровнем потерь (например, спутниковые каналы) рекомендуется уменьшать MSS для снижения вероятности фрагментации и повторных передач.

Пример расчёта эффективности

Рассмотрим передачу данных через Ethernet (MTU 1500, MSS 1460). Заголовки IP и TCP составляют 40 байт, что даёт накладные расходы 40/1500 ≈ 2,67%. Если MSS уменьшить до 536 байт (например, из-за ограничений PPPoE), накладные расходы возрастут до 40/576 ≈ 6,94%, что снижает полезную пропускную способность примерно на 4,3%. При передаче больших объёмов данных (например, 1 ГБ) разница во времени передачи может составлять несколько секунд.

Применение в различных протоколах и технологиях

Параметр MSS используется не только в TCP, но и в некоторых других протоколах, основанных на TCP, например, в HTTP/2 и HTTP/3 (через QUIC). В HTTP/2 MSS влияет на размер фреймов данных, а в QUIC — на размер пакетов. В протоколе SCTP (Stream Control Transmission Protocol) также существует аналогичный параметр — максимальный размер сообщения. В VPN-туннелях (OpenVPN, WireGuard) часто требуется уменьшать MSS для предотвращения фрагментации внутри туннеля, что реализуется через настройку MSS clamping (принудительное изменение MSS на маршрутизаторе или шлюзе).

MSS clamping

MSS clamping — это техника, при которой маршрутизатор или межсетевой экран (файрвол) изменяет значение MSS в TCP-пакетах, проходящих через него, чтобы соответствовать MTU интерфейса. Это особенно актуально для PPPoE-соединений (MTU 1492), где стандартное MSS 1460 может привести к фрагментации. MSS clamping устанавливает MSS на уровне 1452 (1492 − 40) для IPv4. В современных операционных системах (Linux, Windows) MSS clamping может быть настроен через iptables (Linux) или через реестр (Windows). В роутерах эта функция часто включается автоматически при обнаружении PPPoE.

Проблемы и ограничения

Одной из основных проблем, связанных с MSS, является несовместимость с некоторыми сетевыми устройствами, которые блокируют ICMP-сообщения, необходимые для PMTUD. В таких случаях PMTUD не работает, и отправитель может использовать слишком большой MSS, что приводит к фрагментации или потере пакетов. Для решения этой проблемы применяется статическая настройка MSS или использование механизма PLPMTUD (Packetization Layer Path MTU Discovery, RFC 4821), который не требует ICMP. PLPMTUD использует пробные пакеты с различными размерами и определяет MTU по успешности доставки.

Другая проблема — использование MSS в сочетании с опциями TCP (например, Timestamps, SACK), которые увеличивают размер заголовка TCP. В таких случаях MSS может быть уменьшен на размер опций, чтобы избежать превышения MTU. Например, при использовании опции Timestamps (10 байт) заголовок TCP увеличивается до 30 байт, и MSS для Ethernet становится 1450 байт (1500 − 20 − 30). В современных реализациях TCP это учитывается автоматически.

Значение в современных сетях

В современных высокоскоростных сетях (10 Гбит/с и выше) MSS остаётся важным параметром, но его влияние на производительность снижается благодаря использованию механизмов, таких как TCP Segmentation Offload (TSO) и Large Receive Offload (LRO), которые позволяют сетевой карте обрабатывать большие сегменты (до 64 КБ) без фрагментации на уровне ядра. Однако на уровне протокола MSS по-прежнему ограничивает размер сегмента, и TSO/LRO лишь эмулируют передачу больших блоков, разбивая их на сегменты с MSS на аппаратном уровне. В сетях с низкой задержкой (например, в дата-центрах) MSS может быть увеличен до 9000 байт (Jumbo Frames) для повышения эффективности, но это требует поддержки на всех устройствах по пути следования.

Интересные факты

  • В RFC 879 (1983) было рекомендовано использовать MSS не менее 536 байт для обеспечения совместимости с любыми IP-сетями.
  • В некоторых реализациях TCP (например, в Linux) значение MSS может быть изменено динамически на основе статистики потерь пакетов, что позволяет адаптироваться к изменяющимся условиям сети.
  • MSS не следует путать с максимальным размером передаваемого блока (MTU) — MSS относится к транспортному уровню, а MTU — к сетевому.
  • В протоколе TCP существует также параметр «Maximum Segment Lifetime» (MSL), который не связан с размером сегмента, а определяет время жизни сегмента в сети.

Источники

  • RFC 793 — Transmission Control Protocol (1981)
  • RFC 879 — The TCP Maximum Segment Size and Related Topics (1983)
  • RFC 1191 — Path MTU Discovery (1990)
  • RFC 4821 — Packetization Layer Path MTU Discovery (2007)
  • Стивенс У. Р. «TCP/IP. Иллюстрированное руководство. Том 1. Протоколы» (2003)
  • Козьерок Д. «Сети TCP/IP. Принципы, протоколы и архитектура» (2018)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →