MSS
TCPの1つのセグメントに含められるデータ部分の最大長を表す値である。TCPヘッダーとIPヘッダーの長さは含めない。接続開始時に自分が受け取れる上限を相手へ通知し、相手が送る量を調整するために使う。
イマシルちゃんの解説
TCPで大きなファイルなどを送るときは、内容を小さく分けて送るんだ。
ただし相手が1つのまとまりで受け取れる量には限度があるよ。
そこで通信を始めるときに、自分が受け取れる上限をMSSという値で相手に知らせるんだ。
ここで数えるのは、ファイルなどの内容を運ぶ部分の長さだよ。
実際の送信では、宛先や順番を伝えるIPヘッダーとTCPヘッダーも付け加えるんだ。
ヘッダーもデータの一種だけれど、MSSにはこの2つのヘッダーの長さを含めないよ。
送信側は相手のMSSを超えない量に分けて送ることで、受け取れる大きさに合わせられるんだ。
この解説はわかりやすかったですか?
より深い解説
定義
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の大きさのセグメントがいくつも入る関係にある。