Оригинал тут http://www.cyberguru.ru/networks/protocols/ip-fragmentation-page3.html
Максимальный Размер TCP Сегмента (MSS) определяет максимальное количество данных, которые хост желает принимать в единственной TCP/IP датаграмме. Эта TCP/IP датаграмма может быть фрагментирована в уровне IP. Значение MSS посылают как опциию TCP заголовка только в сегменте TCP SYN. Каждая сторона на TCP соединении сообщает свое значение MSS другой стороне. Хост отправитель обязан ограничивать размер данных в единственном TCP сегменте в значение, меньшем или равном MSS, о котором сообщает хост получатель.Первоначально, значение MSS означало, сколько памяти нужно выделить (больше или равной 65496 КБ) на станции получателя, чтобы в состоянии хранить TCP данные, содержавшиеся в пределах единственной IP датаграммы. MSS был максимальным сегментом (кусочком) данных, которые желал принимать TCP получатель. Этот TCP сегмент мог быть огромным, примерно до 64 КБ (максимальный размер IP датаграммы), и его необходимо было фрагментировать на уровне IP, чтобы передать по сети к хосту получателю. Принимающий хост повторно должен был собрать IP датаграмму прежде, чем передать полный TCP сегмент на уровень TCP.
Рассмотрим ниже несколько показательных сценариев, от том как установливаются и используются значения MSS, чтобы ограничить размеры TCP сегмента, и соотвественно, размеры IP датаграммы.
Сценарий 1 иллюстрирует способ, которым реализовывлся MSS ранее. Хост A имеет буфер 16 КБ а Хост B - буфер 8 КБ. Они посылают и получают свои МSS значения и корректируют их чтобы послать данные друг другу. Заметьте, что Хост A и Хост B должны фрагментировать IP датаграммы, которые по размеру больше чем MTU интерфейса, но все еще меньше чем посылаемый MSS, потому что стек TCP может передать 16 КБ или 8 КБ данных в IP стек. В случае Хоста B, пакеты могут быть фрагментированы дважды, один раз, чтобы дойти до Token Ring LAN и еще раз, чтобы добраться до сети Ethernet.
- Хост А посылает свое MSS значениеХ в 16К Хосту B
- Хост B принимает значение MSS 16K от Хоста A
- Хост B устанавливает MSS посылки в значение 16K
- Хост B посылает свое значение MSS в 8K хосту A
- Хост A принимает значение MSS 8K от Хоста B
- Хост A устанавливает MSS посылки в значение 8K
Способ которым теперь работает MSS это то, что каждый хост сначала сравнивает свой MTU исходящего интерфейса с его собственным буфером и выберет самое низкое значение в качестве MSS, для посылки. Затем хосты сравнят полученный размер MSS, с их собственным MTU интерфейса и снова выберут меньшее из двух значений.
Сценарий 2 иллюстрирует этот дополнительный шаг, сделанный отправителем, чтобы избежать фрагментации на локальных и удаленных каналах. Посмотрите, как принимается во внимание MTU исходящего интерфейса каждым хостом (прежде, чем хосты пошлют друг другу свои значения MSS), и как это помогает избежать фрагментации.
- Хост A сравнивает свой MSS буфер (16 КБ) и свой MTU (1500 - 40 = 1460) и использует наименьшее значение как MSS (1460), чтобы послать его Хосту B.
- Хост B получает MSS (1460) который послал хост A, и сравнивает его со значением MTU своего исходящего интерфейса - 40 (4422).
- Хост B устанавливает наименьшее значение (1460) как MSS для того, чтобы послать IP датаграммы Хосту A.
- Хост B сравнивает свой MSS буфер (8 КБ) и свой MTU (4462-40 = 4422) и использует 4422 как MSS, чтобы послать его Хосту A.
- Хост A получает MSS от хоста B (4422), и сравнивает его со значением MTU своего исходящего интерфейса -40 (1460).
- Хост А устанавливает наименьшее значение (1460) как MSS для того, чтобы посылать IP датаграммы Хосту B.
В Сценарии 2, фрагментация не происходит, потому что хостами были приняты во внимание MTU обоих интерфейсов. Пакеты могут все еще фрагментироваться в сети между Router A и Router B, если они встретят линк с более низким MTU.