はじめに
ネットワークの用語にMTUとMSSがあります。
それぞれMaximum Transmission Unit(最大送信単位)とMaximum Segment Size(最大セグメントサイズ)の略でどちらもTCP/IP通信でよく出てくる用語です。
本記事を読めば「MSSにTCPヘッダとIPヘッダを加えた長さがMTUに収まっていれば分断化せずに転送できる」という一見難解なネットワークの話が理解できるようになります。
執筆時期
- 2020年
MTUとは?
まずはMTUですが、通信において1回の転送で送信できるデータの最大値を示す伝送単位を指します。
これらはイーサネットや回線にて決められている値なので、A→B→Cにてデータ送付する際にA→Bの通信経路のMTUが1500バイトでB→Cの通信経路のMTUが1454バイトといったように違う可能性もあります。
一般的にMTUを超えたデータサイズが送られてくると断片化というパケットの分割処理を行います。
MSSとは?
MTUはヘッダを含めた長さで扱われますが、MSSはアプリケーションレベルのデータサイズを表しています。
例えば、pingコマンドではMSSのデータサイズを指定できます。
データサイズを1400バイトとした場合、ICMPヘッダが8バイトとIPヘッダが20バイトなので1428バイトのパケットが送付されることになります。
# ping -c1 -w1 -s1400 yahoo.co.jp PING yahoo.co.jp (183.79.135.206) 1400(1428) bytes of data.
上記は送付できていますが、失敗する場合はデータサイズを下げていきならがらエラーなく通信できるMTUを探っていくことができます。
MTUを超えた時に起こる断片化とは何か?
先ほども記載した通り、MTUが小さな通信経路があるとそのMTU以上のパケットの送付ができません。
よって断片化というパケット分割を行います。
1428バイト(1400+28)のパケットが1000バイトのMTUの経路を通る場合は1000バイト(972+28)と456バイト(428+28)に分割されるイメージです。
ただ、注意が必要なのは断片化ができないパケット(DF=1)の扱いです。
その場合は事前にICMPを利用して経路のMTUの最小値(ex 1000バイト)を情報として保持しておき、それに沿ってデータを送信して対応します。
終わりに
あまり意識することのないMTUやMSSですが、イーサネットのMTU(1500)より低い回線を通る場合にはパフォーマンスにも関わる部分なので頭の片隅に入れておくとトラブルシューティング時に役立ちます。
以上、ご参考になれば幸いです。