pingコマンドでMTUサイズを調べる

 通信回線ごとにMTUサイズが決まっているので、パケット長よりもMTUが小さい通信経路にパケットを通過させる場合、パケットを小さい側のMTUのサイズに合わせてフラグメンテーション(分割化処理)を行います。

 しかし、フラグメンテーションを行うと以下の問題が発生し、ネットワークの利用効率が悪化してしまいます。

  • フラグメンテーションのオーバヘッドが発生する。
  • パケットを分割するので、パケットの数が増加する。
  • 分割したパケットのいずれかが破損した場合は、分割する前の元のIPパケットが全てが台無しになる。

この問題を解決するには、経路の途中で分割されないサイズでパケットを送信する必要があります。

ping コマンドを使用すれば、宛先までの最適なMTU値を調査することができます。

ping コマンドの使用方法は以下の通りです。

Windowsの場合
【使用法】
ping [-t] [-a] [-n 要求数] [-l サイズ] [-f] [-i TTL] [-v TOS][-r ホップ数] [-s ホップ数] [[-j ホスト一覧] | [-k ホスト一覧]][-w タイムアウト] [-R] [-S ソースアドレス] [-4] [-6] ターゲット名
Windowsの場合

コマンドプロンプト上から、

C:\>ping -f -l [サイズ] <宛先>

サイズには、1,450、1,400など、数値を徐々に小さくしていきながら試して行きます。

 -f : パケットの断片化を行わないようにするオプション
 -l : パケットサイズを指定するオプション

 上の例では、フラグメント化が必要なので、まだ、小さいサイズを指定してping コマンドを試す必要があります。

そこで、pingが成功するまで、サイズを小さくして試してゆきます。

そうすると、今回は、サイズが「1,426」でping コマンドが成功しました。

1,426bytesのデータまでは正しく送受信できていることが分かります。

MTUサイズ = 1,426 + 8(ICMPヘッダ) + 20(IPヘッダ) = 1,454

最適なMTUサイズが、「1,454bytes」ということになります。

イーサネットのMTUサイズである1,500bytesよりも小さな値になっています。

 これは、PPPoE(ADSLやFTTH)のインターネット回線などを使用している場合、そのプロトコルの分だけ、MTUサイズが小さくする必要があるからです。

NTTのFLET'Sなどでは、PPPoEなどのヘッダ・サイズの分である46bytesが必要です。

その為、MTUサイズが「1,454bytes」となっています。

 ここまでの説明は、パケットの断片化を行わないようにDFフラグをセットしたIPパケットに対して、経路途中のルータや宛先コンピュータがエラーを返す場合が前提です。

 ルータやコンピュータの設定によっては、エラーを報告しないようにしている場合があります。また、経路途中のファイアウォールによってエラー報告がフィルタリングされている場合もあります。その場合には、最適なMTU値を調査することができません。

Path MTU Discover

 通信回線ごとにMTUが決まっているので、元のMTUサイズより、小さいMTUサイズの通信経路にパケットを通過させる場合、フラグメンテーション(分割化処理)を行わないと、通信回線を通過できなくなります。

フラグメンテーションを行うと以下の問題が発生し、ネットワークの利用効率が悪化してしまいます。

  • フラグメンテーションのオーバヘッドが発生する。
  • パケットを分割するので、パケットの数が増加する。
  • 分割したパケットの何れかが破損した場合は、元のIPパケットの全てが台無しになる。

この問題を解決するには、経路の途中で分割されないサイズでパケットを送信する必要があります。

 ルータは、大き過ぎるパケットを受信した場合、DFフラグがセットされていれば、そのパケットを破棄します。そして、ICMPのエラー通知(Type3 Code4)を送信元ホストへ送信するようになっています。

DFフラグがセットされていない場合は、フラグメンテーションを行いパケットを分割して送信します。

 ICMPのエラー通知(Type3 Code4)を受け取った送信元の端末は、通知されたMTUを経路MTUとして使用します。なお、この経路MTU値は、しばらくの間、キャッシュされるようになっています。

Type 3の場合のコード一覧を下の表に示します。

コード情報意味
0Netwrok Unreachableネットワークに到達不能
1Host Unreachable特定のホストに到達不能
2Protocol Unreachableプロトコルに到達不能
3Port Unreachableポートに到達不能
4Fragmentation Needed and DF setフラグメンテーションが必要
5Source Route Failedソースルート通りにルーティングできない。
6Destination Network Unknown宛先ネットワークを知らない。
7Destination Host Unknown宛先ホストを知らない。
8Source Host Isolated送信元が通信できない。
9Network Administartively Prohibited送信先ネットワークが拒否している。
10Destinantion Host Administartively Prohibited送信先ホストが拒否している。
11Network Unreachable For TOS要求したTOSでネットワークに到達不能
12Host Unreachable For TOS要求したTOSでホストに到達不能
13Communication Administratively Prohibited通信が拒否されている。

 エラー通知(Type3 Code4)は、「Fragmentation Needed and DF set」です。送信元にフラグメンテーションが必要であることを通知するためのものであることが分かります。

 しかし、経路の途中で、ICMPのエラー通知(Type3 Code4)がフィルタリングされている場合があります。その場合、適切なMTU値を送信元に通知することができません。この状態を「Path MTU Discovery Black Hole」と言います。

ネットワークの管理者は、ICMPをフィルタイングする際、ICMPを根こそぎ拒否の設定にしがちです。

Ciscoルータであれば、「deny icmp any any」と設定してしまいがちです。

 ICMPのフィルタリングでは、Code3の「Destination Unreachable」とCode11の「Time Exceeded」 は許可することが推奨されています。