MSS
TCPの1つのセグメントで送ることのできるデータ部分の最大長。TCPヘッダーとIPヘッダーは含まない。イーサネット(MTU 1,500オクテット)とIPv4では、通常1,460オクテット。
イマシルちゃんの解説
MTUが「箱の最大サイズ」なら、MSSは「箱に入れられる中身の最大量」なんだ。
箱(パケット)には、宛先を書いた伝票(IPヘッダー)と、中身の説明書き(TCPヘッダー)も入れないといけない。
だから、中身に使える量は、箱の大きさからその2つを引いた分になるんだよ!
より深い解説
定義
MSS(Maximum Segment Size:最大セグメント長)は、TCPが1つのセグメントで運べるアプリケーションのデータの最大長である。TCPの接続を確立するとき、3ウェイハンドシェイクのSYNのセグメントのオプションで、互いに自分が受け取れるMSSを相手に知らせる。
MTUとの関係
MSS = MTU − IPヘッダー長 − TCPヘッダー長
| 条件 | MTU | MSS |
|---|---|---|
| イーサネット、IPv4 | 1,500 | 1,500 − 20 − 20 = 1,460 |
| イーサネット、IPv6 | 1,500 | 1,500 − 40 − 20 = 1,440 |
| PPPoE、IPv4 | 1,492 | 1,492 − 20 − 20 = 1,452 |
ヘッダーにオプションが付く場合は、その分だけ実際に送れるデータは小さくなる。
混同しやすい長さの整理
イーサネットのMACヘッダー(14オクテット)とFCS(4オクテット)は、MTUの外側にあるので、MSSの計算では引かない。この取り違えが、計算問題でいちばん多い誤りである。
MSSクランプ
PPPoEやIPsecのトンネルを使う回線では、実際に通れるパケットの大きさが小さくなる。パスMTU探索がうまく働かない環境(ICMPが遮断されている場合など)では、大きなパケットが届かず、通信が途中で止まることがある。
そこで、ルータが、通過するTCPのSYNのセグメントのMSSの値を、トンネルに合わせた小さい値に書き換えることで、端末同士が最初から小さいセグメントで通信するようにする。これをMSSクランプ(TCP MSS調整)という。
MSSとウィンドウサイズの違い
ウィンドウサイズの中に、MSSの大きさのセグメントがいくつも入る関係にある。