MS Windows ネットワーキング

Windows および Sun のシステムでの IP MTU、TCP MSS、および PMTUD の調整

2009 年 7 月 17 日 - ライター翻訳版
その他のバージョン: PDFpdf | 機械翻訳版 (2013 年 8 月 21 日) | 英語版 (2005 年 8 月 10 日) | フィードバック

目次


概要

このドキュメントでは、Solaris 10(および以前のバージョン)、HP-UX 9.x、10.x、11.x、IBM AIX、Linux、Windows 95/98/ME、Windows NT 3.1/3.51、Windows NT 4.0、および Windows 2000/XP で、IP Maximum Transmission Unit(MTU; 最大転送ユニット)、TCP Maximum Segment Size(MSS; 最大セグメント サイズ)、および IP Path MTU Discovery(PMTUD; パス MTU ディスカバリ)を調整するための設定ノードの例を紹介しています。



前提条件

要件

このドキュメントの読者は次の項目に関する知識が必要です。



使用するコンポーネント

このドキュメントは、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。



表記法

ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。



背景説明

ネットワーク ハードウェアの動作不良、設定の誤り、またはソフトウェアの不具合があっても、小さな TCP データ転送は問題なく動作する可能性があります。ただし、最大長パケットを伴う大きなデータ転送では、ハングした後にタイムアウトする状況が発生します。回避方法としては、送信ノードを設定して、次の処理のどちらかまたは両方を実施します。

  • PMTUD をディセーブルにする。

  • 最大パケット サイズを小さくするために、TCP MSS や IP MTU を縮小する。



問題の説明と考えられる原因

一部の IP パスでは、TCP/IP ノードで少量のデータ(通常、1500 バイト未満)は問題なく送信できるのに、大容量のデータを送信しようとするとハングし、タイムアウトが発生することがあります。これは、大容量のデータ転送が 1 つの方向では成功し、反対の方向では失敗する、片方向の問題として発生することがよくあります。この問題の原因としては、TCP MSS 値、PMTUD の障害、異なる LAN メディア タイプ、またはリンクの障害が考えられます。以降のサブセクションでは、この問題を説明しています。



TCP MSS 値

TCP MSS チャネルは、ローカル システムで受け入れる(再構成する)ことができる単一の IP データグラム内の TCP データの最大容量を指定します。IP データグラムは、送信時に複数のパケットにフラグメント化される可能性があります。理論上、この値は最大 65495 にすることができますが、このように大きな値が使用されることはありません。通常、エンド システムは、レポートされる MSS として、「発信インターフェイス MTU」から 40 を引いた値を使用します。たとえば、イーサネット MSS 値は、1460(1500 - 40 = 1460)です。



PMTUD の障害

PMTUD とは、RFC 1191 で規定され、最近の TCP/IP スタックで実装されたアルゴリズムです。このアルゴリズムでは、IP パスを通じてフラグメント化なしで送信できる最大の IP データグラムの検出が試みられ、データ転送のスループットが最大化されます。

PMTUD は、IP 送信元に IP ヘッダーの「Don't Fragment」(DF)フラグを設定させることによって実装されます。このフラグを設定した IP パケットが、次のホップ リンクの MTU が小さすぎてフラグメント化なしでパケットを送信できないルータに到達した場合、そのルータはパケットを破棄し、ICMP「Fragmentation needed but DF set」エラーを IP 送信元に送信します。IP 送信元では、この Internet Control Message Protocol(ICMP; インターネット制御メッセージ プロトコル)メッセージを受信すると、この宛先に送信するパケットでより小さな IP MTU を使用する必要があることが認識され、後続のパケットは宛先まで届きます。

さまざまな問題が PMTUD アルゴリズムの障害の原因となることがあります。IP 送信元でより小さいパスの MTU を使用する必要があることが認識されず、再送信がタイムアウトするまで、大きすぎるパケットが再送信され続けることがあります。一部の問題を次に示します。

  • 次のホップ パスが小さすぎるルータでは、必要な ICMP エラー メッセージの生成が失敗する。

  • 小さな MTU のルータと IP 送信元間の逆経路にあるルータでは、IP 送信元に到達する前に、ICMP エラー メッセージが破棄される。

  • 受信した ICMP エラー メッセージが無視される IP 送信元のスタック内での混乱。

これらの問題の回避方法として、PMTUD をディセーブルにするように IP 送信元を設定します。これにより、IP 送信元は DF フラグをクリアして、データグラムを送信します。大きなパケットが MTU の小さなルータに到達した場合、ルータはパケットを複数の小さなデータにフラグメント化します。この小さなフラグメント化されたデータは、宛先に到達すると、元の大きなパケットに再構成されます。



異なる LAN メディア タイプ

同じルーティング ネットワーク上で、LAN メディア タイプ(イーサネット、トークン リング、および Fiber Distributed Data Interface(FDDI; ファイバ分散データ インターフェイス))が異なる 2 つのホストでは、動作が異なる可能性があります。イーサネットに接続したシステムは正しく動作し、トークン リングまたは FDDI に接続したシステムでは障害が発生する可能性があります。この障害の原因は、イーサネット システムでは 1460 の MSS 値がレポートされるのに対して、トークン リングと FDDI に接続したシステムでは、約 4400 の MSS 値がレポートされることです。リモート サーバでは、相手側からレポートされた MSS 値を越えることができないため、トークン リングおよび FDDI 接続システムと通信する場合よりも、イーサネット接続システムと通信する場合の方が、より小さなパケットが使用される可能性があります。



「ダンベル」ネットワーク トポロジ

PMTUD の問題は、「ダンベル」ネットワーク トポロジ(たとえば、ネットワーク パスの内部リンクの MTU が通信ホストのインターフェイスよりも小さいトポロジ)で生じることがあります。たとえば、IP(Generic Routing Encapsulation(GRE; 総称ルーティング カプセル化))トンネルを使用する場合、トンネル インターフェイスの MTU は、対応する物理インターフェイスの MTU よりも小さくなります。ICMP フィルタリングまたはホスト スタックの問題のために PMTUD に障害が発生した場合、大きなパケットはトンネルを通過できませんCisco Bug ID CSCdk15279登録ユーザ専用)を取り込んだ Cisco IOS ソフトウェア リリースでの回避方法では、トンネル IP MTU を 1500B に増加させます。
一部ツールについては、ゲスト登録のお客様にはアクセスできない場合がありますことを、ご了承ください。



リンクの障害

ルータに大きい(1500 バイト)MTU のリンクが接続されていても、ルータではそのリンクを通じてそのサイズのデータグラムを配信できないことがあります。ルータでは、「Fragmentation needed but DF set」ICMP エラーが送信元に返信されません。これは、実際にはリンクの MTU が小さいわけではないからです。ところが、大きなデータグラムはリンクを通過できません。したがって、PMTUD は役に立たず、このリンクを経由するすべての大きなパケットの送信試行は失敗します。

小さすぎる MTU、小さすぎるバッファリング、channel service unit(CSU; チャネル サービス ユニット)または data service unit(DSU; データ サービス ユニット)またはリピータの動作不良、仕様に適合していないケーブル、ソフトウェアやファームウェアの不具合を伴うフレーム リレー回線などのリンクの下位レイヤの問題が原因となっていることがあります。

次の表に、関連するソフトウェア障害を示します。
一部ツールについては、ゲスト登録のお客様にはアクセスできない場合がありますことを、ご了承ください。

リンクの他の下位レイヤの問題は、IP レイヤ フラグメント化を実行できない規格外の FDDI とイーサネット間ブリッジの使用が原因です。問題のあるリンクに接続されているルータ インターフェイスで、より小さな MTU を設定することによって、問題を回避できる可能性があります。ただし、このオプションを利用できなかったり、十分な効果が得られないこともあります。たとえば、次のセクションで説明するように、IP エンド ノードでより小さな 1500 の MTU を設定することもできます。



エンド ノードで PMTUD をディセーブルにし、より小さな MTU/MSS を設定する方法

以降の例では、Solaris 10(およびそれよりも前のバージョン)HP-UX 9.x、10.x、および 11.xIBM AIXLinuxWindows 95/98/MEWindows NT 3.1/3.51Windows NT 4.0、および Windows 2000/XP で、1500 の IP MTU または 1460 の TCP MSS を設定しています。1500 の IP MTU 値を設定する場合と 1460 の TCP MSS 値を設定する場合では、通常同じ効果を生じます。これは、通常 TCP セグメントには 40 バイトの IP/TCP ヘッダーが付加されるためです。

注:インターフェイス MTU(ルータまたはエンド ノード)を変更する場合、同じブロードキャスト ドメインに接続しているすべてのシステム(ワイヤおよびハブ)では、同じ MTU で稼働している必要があります。同じブロードキャスト ドメインの 2 つのシステムが同じ MTU 値を使用していない場合、(小さな MTU よりも大きく、大きな MTU よりも小さい)パケットが、大きな MTU のシステムから小さな MTU のシステムに送信されたときに問題が生じます。



Solaris 10(およびそれよりも前のバージョン)

PMTUD をディセーブルにします。

$ ndd -set /dev/ip ip_path_mtu_discovery 0

最大 MSS を 1460 に設定します。

$ ndd -set /dev/tcp tcp_mss_max 1460

出典:TCP/IP の説明:プロトコル、第 1 巻、付録 E、著者:W. Richard Stevens および Gary R. Wright.



HP-UX 9.x、10.x、および 11.x

PMTUD をディセーブルにします。

HP-UX 9.X は、パス MTU ディスカバリをサポートしていません。

HP-UX 10.00、10.01、10.10、10.20、および 10.30 は、パス MTU ディスカバリをサポートしています。デフォルトでは、TCP に対してオン(1)で、UDP に対してオフ(0)になっています。オン/オフは、nettune コマンドで切り替えることができます。

# nettune -s tcp_pmtu 0
   
# nettune -s udp_pmtu 0

HP-UX 11 では PMTU ディスカバリがサポートされ、デフォルトでイネーブルになっています。これは、ndd setting ip_pmtu_strategy コマンドで制御します。

# ndd -h ip_pmtu_strategy 0

パス MTU ディスカバリのストラテジを設定します。0 はパス MTU ディスカバリをディセーブルにし、1 はストラテジ 1 をイネーブルにし、2 はストラテジ 2 をイネーブルにします。詳細は、HP-UX 11 システムで ndd -h コマンドを使用してください。

出典Hewlett Packard

最大 MSS を 1460 に設定します。

HP-UX 10.x:

# lanadmin -M 1460 <NetMgmtID> 
/usr/sbin/lanadmin [-a] [-A station_addr] [-m] [-M mtu_size] 
[-R] [-s] [-S speed] NetMgmtID -M mtu_size

NetMgmtID に対応するインターフェイスの新しい MTU サイズを設定します。mtu_size 値は、リンク固有の範囲内にする必要があります。設定にはスーパーユーザ特権が必要です。

出典:HP-UX バージョン 10.2 の man ページ

HP-UX 11.x:

# ndd -set /dev/tcp tcp_mss_max 1460

詳細は、HP-UX 11 システムの ndd に関するマニュアルのページを参照してください。



IBM AIX Unix

PMTUD をディセーブルにします。

AIX 4.2.1 にパス MTU ディスカバリが追加されました。デフォルト = オフ。AIX 4.3.3 以降、デフォルト = オン。

# no -o tcp_pmtu_discover=0

出典: IBM

最大 MSS の設定:

AIX 4.2.1 以降では、パス MTU ディスカバリがイネーブルでないか、パス MTU ディスカバリがパス MTU の検索に失敗した場合にだけ、tcp_mssdflt が使用されます。デフォルト:512 バイト。範囲:1 〜 1448

# no -o tcp_mssdflt=1440

MTU サイズが異なるアダプタが複数存在する場合でも、1 つの値しか設定できません。この値を変更すると、システム全体に影響します。

出典: IBM



Linux

PMTUD をディセーブルにします。

パス MTU ディスカバリは、ファイル ip_no_pmtu_disc の内容を「0」または「1」に変更すると、それぞれイネーブルまたはディセーブルにすることができます。PMTUD をディセーブルにするには、次のコマンドを使用します。

# echo  1  >/proc/sys/net/ipv4/ip_no_pmtu_disc

インターフェイス MTU の設定:

インターフェイスの MTU 値は、ifcfg-<name> ファイルを編集して、「MTU」パラメータを変更すると修正できますが、この場合 <name> はコンフィギュレーション ファイルによって制御されるデバイスの名前です。たとえば、イーサネット インターフェイスの設定を修正するには、名前が「ifcfg-eth0」のファイルを修正します。このファイルにより、システム内の 1 番目の network interface card(NIC; ネットワーク インターフェイス カード)が制御されます。

出典: RedHat Linux manual



Windows 95/98/ME

注:Windows 95 TCP/IP パラメータの修正には、レジストリの編集が含まれています。編集に誤りがあるとシステムをブートできなくなるため、経験のあるシステム管理者以外はレジストリの編集を行わないようにしてください。レジストリに変更を加えた後に、変更を適用するには再度ブートします。

PMTUD をディセーブルにします。

キーに次のレジストリ値を追加します。

Hkey_Local_Machine\System\CurrentControlSet\Services\VxD\MSTCP
 
PMTUDiscovery = 0 or 1 
 
Data Type: DWORD

この値では、Microsoft TCP/IP が、RFC 1191 で指定されているようにパス MTU ディスカバリを試行するかどうかが指定されます。「1」はディスカバリをイネーブルにし、「0」はディスカバリをディセーブルにします。デフォルトは 1 です。

値:Windows 98 では、データ型は文字列値です。

インターフェイス MTU を 1500 に設定します。

このセクションのエントリは、次のレジストリ キーに追加する必要があります。「n」は、特定の TCP/IP とネットワーク間のアダプタ バインディングを表します。

Hkey_Local_Machine\System\CurrentControlSet\Services\Class\netTrans\000n
 
MaxMTU = 16-bit integer
 
Data Type: String

このレジストリ キーは、メディア ドライバに渡すことができる最大サイズ データグラム IP を指定しています。Subnetwork Access Protocol(SNAP; サブネットワーク アクセス プロトコル)と(メディアで使用される場合は)送信元ルーティング ヘッダーは、この値に含まれません。たとえば、イーサネット ネットワークで、MaxMTU のデフォルト値は 1500 です。使用される実際の値は、このパラメータで指定した値とメディア ドライバによってレポートされる値の最小値です。デフォルトは、メディア ドライバによってレポートされるサイズです。

出典: Microsoft のサポート技術情報 Q158474



Windows NT 3.1/3.51

注:Windows NT TCP/IP パラメータの修正には、レジストリの編集が含まれています。編集に誤りがあるとシステムをブートできなくなるため、経験のあるシステム管理者以外はレジストリの編集を行わないようにしてください。レジストリに変更を加えた後に、変更を適用するには再度ブートします。

PMTUD をディセーブルにします。

PMTU ディスカバリはデフォルトでイネーブルになっていますが、レジストリに次の値を追加して制御できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip\parameters
\EnablePMTUDiscovery
 
PMTU Discovery:  0 or 1 (Default = 1)
 
Data Type:   DWORD

「1」はディスカバリをイネーブルにし、「0」はディスカバリをディセーブルにします。PMTU ディスカバリがディセーブルになっている場合、すべての非ローカル宛先 IP アドレスで 576 バイトの MTU が使用されます。TCP MSS では 536 です。

出典: Microsoft のサポート技術情報 Q136970

インターフェイス MTU を 1500 に設定します。

TCP/IP の各パラメータは、個々のネットワーク アダプタ カードに固有なものです。これらのパラメータは、次のレジストリ パスに表示されます。「adapterID」は、特定のアダプタ カードのサービス サブキーを参照しています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\adapterID\Parameters\Tcpip
 
MTU: REG_DWORD (Number in octets)
 
Default: 0 (That is, use the value supplied by the adapter.)

この値は、インターフェイスの MTU サイズを指定しています。TCP/IP によって使用される各インターフェイスには、異なる MTU 値を指定できます。通常、MTU は下位ドライバとのネゴシエーションを通じて決定されます。ただし、下位ドライバの使用の値は上書きできます。

RouterMTU REG_DWORD Number in octets
 
Default: 0 (That is, use the value supplied by the lower interface.)

この値は、宛先 IP アドレスが異なるサブネットにある場合に使用する必要がある MTU サイズを指定しています。TCP/IP によって使用される各インターフェイスには、異なる RouterMTU 値を指定できます。多くの実装では、RouterMTU の値は 576 オクテットに設定します。これは IP ノードでサポートする必要がある最小サイズです。通常、比較的新しいルータは、576 オクテットよりも大きい MTU を処理できるため、このパラメータのデフォルト値は、MTU によって使用される値と同じです。

出典:Microsoft のサポート技術情報 Q102973



Windows NT 4.0

注:Windows NT TCP/IP パラメータの修正には、レジストリの編集が含まれています。編集に誤りがあるとシステムをブートできなくなるため、経験のあるシステム管理者以外はレジストリの編集を行わないようにしてください。レジストリに変更を加えた後に、変更を適用するには再度ブートします。

PMTUD をディセーブルにします。

PMTU ディスカバリはデフォルトでイネーブルになっていますが、レジストリに次の値を追加して制御できます。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
\EnablePMTUDiscovery 
 
PMTU Discovery: 0 or 1 (Default = 1) 
 
Data Type:  DWORD

「1」はディスカバリをイネーブルにし、「0」はディスカバリをディセーブルにします。PMTU ディスカバリがディセーブルになっている場合、すべての非ローカル宛先 IP アドレスで 576 バイトの MTU が使用されます。TCP MSS では 536 です。

このパラメータを 1(True)に設定すると、TCP はリモート ホストへのパスで、最大転送ユニット(MTU または最大パケット サイズ)の検出を試行します。パスの MTU の検出と、TCP セグメントのこのサイズへの制限によって、TCP では、さまざまな MTU でネットワークに接続するパス上の各ルータで、フラグメント化をなくすことができます。フラグメント化は、TCP スループットとネットワーク輻輳に悪影響を与えます。

インターフェイス MTU を 1500 に設定します。

TCP/IP の各パラメータは、個々のネットワーク アダプタ カードに固有なものです。これらのパラメータは、次のレジストリ パスに表示されます。「adapterID」は、特定のアダプタ カードのサービス サブキーを参照しています。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\AdapterID\Tcpip\Parameters
 
MTU: Set it to equal the required MTU size in decimal (default 1500)
 
Data Type: DWORD

このパラメータは、ネットワーク インターフェイスのデフォルト MTU を上書きします。MTU とは、基本ネットワークで伝送されるバイト単位の最大パケット サイズです。このサイズには、トランスポート ヘッダーが含まれています。IP データグラムは、複数のパケットにわたる可能性があります。基本ネットワークのデフォルト値よりも大きい値は、ネットワークのデフォルト MTU を使用して転送されます。68 よりも小さい値は、68 の MTU を使用して転送されます。

出典:Microsoft のサポート技術情報 Q120642



Windows 2000/XP

注:Windows NT TCP/IP パラメータの修正には、レジストリの編集が含まれています。編集に誤りがあるとシステムをブートできなくなるため、経験のあるシステム管理者以外はレジストリの編集を行わないようにしてください。レジストリに変更を加えた後に、変更を適用するには再度ブートします。

PMTUD をディセーブルにします。

PMTU ディスカバリはデフォルトでイネーブルになっていますが、レジストリに次の値を追加して制御できます。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
\EnablePMTUDiscovery
  
PMTU Discovery:  0 or 1 (Default = 1)
 
Data Type:  DWORD

「1」はディスカバリをイネーブルにし、「0」はディスカバリをディセーブルにします。PMTU ディスカバリがディセーブルになっている場合、すべての非ローカル宛先 IP アドレスで 576 バイトの MTU が使用されます。TCP MSS では 536 です。

このパラメータを 1(True)に設定すると、TCP はリモート ホストへのパスで、最大転送ユニット(MTU または最大パケット サイズ)の検出を試行します。パスの MTU の検出と、TCP セグメントのこのサイズへの制限によって、TCP では、さまざまな MTU でネットワークに接続するパス上の各ルータで、フラグメント化をなくすことができます。フラグメント化は、TCP スループットとネットワーク輻輳に悪影響を与えます。

インターフェイス MTU を 1500 に設定します。

TCP/IP の各パラメータは、個々のネットワーク アダプタ カードに固有なものです。これらのパラメータは、次のレジストリ パスに表示されます。「adapter ID」は、特定のアダプタ カードのサービス サブキーを参照しています。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\ 
Interfaces\[Adapter ID] 
 
MTU: Set it to equal the required MTU size in decimal (default 1500)
 
Data Type:  DWORD

このパラメータは、ネットワーク インターフェイスのデフォルト MTU を上書きします。MTU とは、基本ネットワークで伝送されるバイト単位の最大パケット サイズです。このサイズには、トランスポート ヘッダーが含まれています。IP データグラムは、複数のパケットにわたることがある点に注意してください。基本ネットワークのデフォルト値よりも大きい値は、ネットワークのデフォルト MTU を使用して転送されます。68 よりも小さい値は、68 の MTU を使用して転送されます。

出典:Microsoft のサポート技術情報 Q314053




関連するシスコ サポート コミュニティ ディスカッション

シスコ サポート コミュニティは、どなたでも投稿や回答ができる情報交換スペースです。


関連情報




Document ID: 13709