ネットワーク用語/MSS(Maximum Segment Size)
MSS(Maximum Segment Size)とは
MSSは、1つのTCPセグメントで送信可能なデータの最大サイズのことです。
通信する端末は送信しようとしているデータをこのMSSのサイズに分割して送信します。
MSSとTCPセグメント
例としてHTTPを使用したWeb通信の際のフレームを見てみます。
図1 TCPセグメントとMSS
MSSはフレームからEthernetヘッダとFCS、IPヘッダ、TCPヘッダを引いた部分となります。
ちなみにフレームからEthernetヘッダとFCSを引いた部分がMTUとなります。
イーサネットの環境ではデフォルトでMTUが1500バイトとなっています。
拡張情報が無い場合、IPヘッダは20バイト、TCPヘッダも20バイトとなるためMSSのサイズは
1500-20-20=1460となります。
MSSの通知
TCPでは、データを送信する前に3wayハンドシェイクによってコネクションを確立します。
MSSのサイズはこの3wayハンドシェイクの際に、通信する機器が互いが通知します。
そしてお互いに通知した値の小さい方のMSSでデータの送受信を行います。
図2 3wayハンドシェイク
MSSを通知する際はTCPヘッダのオプション部分が利用されます。
MSSの通知は3wayハンドシェイクの際のSYNフラグが付いたパケットでのみ行うようになっています。
Webサーバとのパケットのやり取りをWireSharkでキャプチャしたものが以下になります。
図3 パケットキャプチャの結果
WireSharkの表示結果の上の方を見て下さい。
最初の3行が3wayハンドシェイクのやり取りとなります。SYNのフラグがセットされているのは最初の2行です。
192.168.1.133のPCから通知しているMSSは1460です。
Webサーバ(192.168.100.95)から通知しているMSSも1460となっています。
TCPヘッダ内を見てみるとオプションフィールドにMSSのサイズが格納されているのがわかります。
MSSで注意するべきこと
3wayハンドシェイクにより通知されたMSSのサイズで端末はデータを分割します。
このMSSのサイズは通信を行う端末が自身のMSSを通知するようになっています。
もし宛先までにもっと小さいMSSを使用する回線があったとしても、通信を行う機器は
そのサイズを知らないため、自身のMSSを相手に通知します。
図 MSSを未調整の場合
その結果、途中の回線のTCPセグメントで送信できるよりも大きなTCPセグメントのデータを
端末が送信してしまうことになります。
このデータは1回に送信できるサイズが小さい回線でフラグメントされることになります。
フラグメントを禁止しているようなルータではパケットが破棄されることになります。
そのため、インターネット接続する際やVPNを使用する際などはMSSのサイズを
調整する必要があります。
Ciscoルータでの調整コマンド/ip tcp adjust-mssへ