ユーザ用ツール

サイト用ツール


knowledge:mtu-mss.html


MTUとMSSで、パケットサイズを指定

MTUとMSSの概要

WANなどで、どこかの経路がMTUが小さい場合に、MTUを設定してあげる必要があります。

      MSS設定
       Fa0/0
[端末]--->[NW機器]---internet--->[NW機器]----->[端末]
               Fa0/1
               MTU設定

MTUはNW機器で調整しますが、MSSは端末同士で調整します。


MTUとは

  • MTUは、Maximum Transfer Unitの略
  • NW機器(ホスト)が1度に送受信できる、IPヘッダを含めた最大サイズ(バイト数)のこと
  • 一度に送信可能なパケットのデータ量
イーサーネットのMTUは、デフォルトでMTU=1500バイト
フレッツ網のMTUは、1454バイト
IPフラグメンテーション
  • NW機器がMTUに従ってパケットを分割すること
  • IPパケットのサイズがMTU値よりも大きい、かつ「DF bit」が0の場合に行います。
WindowsでMTU確認

C:\>netsh interface ipv4 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  6          25        1500  connected     イーサネット
 13          25        1500  disconnected  ローカル エリア接続* 3
 23          65        1500  disconnected  Bluetooth ネットワーク接続
 18          25        1500  disconnected  Wi-Fi 2
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 16          25        1500  connected     VirtualBox Host-Only Network #2
  9          25        1500  disconnected  ローカル エリア接続* 4
 15          35        1500  connected     VMware Network Adapter VMnet1
 21          35        1500  connected     VMware Network Adapter VMnet8
 26          25        1500  connected     VirtualBox Host-Only Network #3


MSSとは

  • MSSは、Maximum Segment Sizeの略
  • 端末が、TCPで通信を行う際に指定する、データの送信単位(セグメント)の最大値
  • TCPヘッダを含めない最大サイズ(バイト数)のこと
  • 端末は、送信するパケットがMSSより大きくなると、複数に分割(フラグメント)して送ります。
 MSS =  MTU - 40バイト(TCP/IPヘッダー)

 イーサネットの場合
    MSS =  1500バイト - 40バイト(TCP/IPヘッダー) = 1460バイト

TCPセグメンテーション

  • 端末が、MSS値を超えるデータを送る際に、端末のMSS値に従って複数パケットに分割します。

NW機器でのMSSの設定する理由

TCPの3way Handshakeのときに端末間でTCP MSS値の合意を取るのですが、
NW機器にMSSを指定することにより、NW機器がMSS値を書き換えることができます。
NW機器がMSS値を書き換えることにより、MTUを超えないようにします


小さなMTUを持つ経路を利用する方法

DFとは

DFは、Don't Fragmentの略で、
DF=0なら、パケットを断片化できる。
DF=1なら、パケットを断片化できない。


DF=0(断片化可能)の場合

経路のどこかがMTUが小さくても、ルーターやファイアウォールが、パケットを断片化して送り出してくれるので、
特に問題はありません。


DF=1(断片化不可)の場合

パケットを断片化できないので、断片化できるように処理をしてあげる必要があります。

方法1:3ウェイハンドシェイクのときにMSSを小さくする

一般的な方法です。

3ウェイハンドシェイクのTCPオプションヘッダーに含まれるMSS値を小さい値に書き換え、
セグメントサイズが出口のインターフェイスのMTUを超えないようにします。


方法2:ICMPでMTUを教えてもらう

  • 経路のどこかでICMPを拒否している場合、想定通りに動作しません。


方法3:DFビットを書き換える

  • DF=1をDF=0にして、断片化できるようにして、送信する方法です。


ping結果からMTUサイズを確認する方法

pingが成功したping成功最大値 + 8(ICMPヘッダ)+ 20(IPヘッダ)がMTUサイズになります。
1438まで成功し、1439でエラーになった場合、MTUサイズは、1438bytesです。

pingのオプション

    -l サイズ      送信バッファーのサイズです。
    -f             パケット内の Don't Fragment フラグを設定します (IPv4 のみ)。
    -n 要求数      送信するエコー要求の数です。

pingの実行例

ping -f -l 1472 -n 1 x.x.x.x  #OK
ping -f -l 1473 -n 1 x.x.x.x  #NG

MTUサイズは、1472 + 8 + 20 = 1500bytes
「1472(データ・サイズ)+8(ICMPヘッダ)+20(IPヘッダ)=1500bytes」
ping -f -l 1438 -n 1 x.x.x.x  #OK
ping -f -l 1439 -n 1 x.x.x.x  #NG
MTUサイズは、1438 + 8 + 20 = 1466bytes
「1438(データ・サイズ)+8(ICMPヘッダ)+20(IPヘッダ)=1466bytes」

http://www.atmarkit.co.jp/ait/articles/0512/17/news017.html


MTUとMSSの設定例

Cisco

Router(config)#interface FastEthernet 0/0
Router(config-if)#ip tcp adjust-mss 1414

Router(config)#interface FastEthernet 0/1
Router(config-if)#ip mtu 1448


Junos




参考


knowledge/mtu-mss.html.txt · 最終更新: 2018/11/12 21:48 by kurihara

ページ用ツール