Размер TCP-сегмента MSS, maximum segment size — максимальный размер сегмента определяет то максимальное количество данных, которые желает принимать в единственной TCP/IP-датаграмме хост. Для этой датаграммы возможно фрагментирование на уровне IP. MSS посылают только в TCP-сегменте SYN флаг синхронизации номеров последовательности, как опциию TCP-заголовка. Любая из сторон на TCP соединении должна сообщить свое значение MSS другой стороне. В обязанности отправляющей стороны входит ограничивать объем данных в единственном TCP-сегменте значением, меньшим или равным MSS, сообщенным хостом-получателем.
Изначально, значение MSS говорило о том, сколько памяти нужно выделить сверх 64 Кбайт минус 40 байт на станции получателя, чтобы та была в состоянии хранить данные TCP, которые содержатся в пределах одной единственной IP-датаграммы. MSS указывал на максимальный блок данных, которые хотел принимать получатель TCP. Этот TCP-сегмент мог быть очень большим ограничивался только максимальным размером датаграммы IP — 64 КБ, из-за чего его надо было фрагментировать на IP-уровне, чтобы переслать по сети хосту-получателю. Принимающая сторона повторно должна была собрать датаграмму на уровне IP перед тем, как передать полный сегмент TCP на уровень TCP.
Давайте сейчас рассмотрим несколько сценариев установки и использования значения MSS для ограничения размеров TCP-сегмента и, соответственно, размеров IP-датаграммы.
Сценарий 1. Иллюстрация способа, с помощью которого ранее реализовывался MSS. У хоста A имеется буфер в 16 Кбайт, а у хоста B — буфер 8 Кбайт. Они обмениваются друг с другом значениями МSS, корректируют их, чтобы отсылать друг другу данные. При этом и хост A, и хост B должны фрагментировать датаграммы IP, превышающие размер интерфейса MTU, но меньше посылаемого MSS, т. к. стек TCP в состоянии передать 8 или 16 Кбайт данных в стек IP. В случае хоста B, пакет может быть фрагментирован дважды, один раз на пути к Token Ring LAN и еще раз, на пути к сети Ethernet.
1. Посылка хостом А своего значения MSS в 16 Кбайт хосту B.
2. Прием хостом B значения MSS от хоста A.
3. Установка хостом B MSS посылки в значение 16 Kбайт.
4. Посылка хостом B своего значения MSS в 8 Kбайт хосту A.
5. Прием хостом A значения MSS от Хоста B.
6. Установка хостом A MSS посылки в значение 8 Kбайт.
Для того, чтобы избежать IP-фрагментации, на концах TCP-соединения, значения MSS были заменены на значение минимального размера буфера и MTU исходящего интерфейса. MSS на 40 байт меньше MTU, ведь MSS, всего лишь, задает размер TCP-данных, и не включает в себя 20 байт заголовка IP и 20 байт заголовка TCP. MSS по умолчанию основан на значениях размера заголовков; т. е. стеку отправителя необходимо вычесть соответствующие значения IP- и TCP-заголовков зависит от используемой опции TCP или IP.
Сейчас MSS работает по другому: каждый хост сравнивает свой MTU исходящего интерфейса с его собственным буфером и выбирает минимальное значение в качестве MSS для посылки. После чего хосты сравнивают размер полученного MSS с собственным MTU интерфейса и также выбирают наименьшее из двух значений.
Сценарий 2. Здесь иллюстрируется дополнительный шаг отправителя для избежания фрагментации на локальных и удаленных каналах. Обратите внимание на то, как используется MTU исходящего интерфейса каждым отдельным хостом перед отправкой друг другу своих значений MSS, а также, как это способствует устранению фрагментации.
1. Сравнение хостом A своих MSS-буфера 16 Кбайт и MTU 1500 - 40 = 1460 и посылка наименьшего значения MSS хосту B.
2. Прием хостом B значения MSS 1460 от хоста A. Сравнение полученного MSS со значением MTU собственного исходящего интерфейса 4462 - 40 = 4422.
3. Установка хостом B наименьшего значения MSS 1460 для отправки IP-датаграммы хосту A.
4. Сравнение хостом B своих MSS-буфера 8 Кбайт и MTU 4462 - 40 = 4422. В качестве значения MSS используется 4422. Это значение отсылается хосту A.
5. Прием хостом A значения MSS 4422 от хоста B. Сравнение его со значением MTU собственого исходящего интерфейса 1500 - 40 = 1460.
6. Установка хостом А наименьшего значения MSS 1460 для отправки IP-датаграммы хосту B.
1460 — значение, выбранное обоими хостами в качестве МSS для отправки пакетов друг другу. Очень часто значение MSS будет таким же на каждой стороне соединения TCP.
В этом примере фрагментация не происходит из-за того, что хостами были учтены MTU обоих интерфейсов. Датаграммы все еще могут фрагментироваться в сети между роутерами A и B, если они встретят соединение с более низким MTU.