配信されないことが多い ICMP エラーに依存せずに、パス MTU 検出を実行します。
このプログラムは、RFC 4821 で説明されているパケット化層パス MTU 検出を実行します。これは、ICMP ブラック ホールが存在する場合に MTU サイズを検出するためのより信頼性の高い方法です。
TCP 接続は、さまざまな指標 (ネットワーク パフォーマンス、パケット損失、ICMP エラー メッセージなど) に応じて時間の経過とともに MTU サイズを自動的に調整しますが、コネクションレス プロトコルの場合はそうではありません。
パフォーマンスが重要な場合、ストリームのパフォーマンスを最適化するために、スループット、パケットの断片化、およびルートの信頼性が分析すべき 3 つの重要な指標となります。ルートの信頼性は常に依存するわけではないため、パフォーマンスを大幅に低下させる可能性があるパケットの断片化を実行せずに、スループットを最大化するよう努める必要があります[1] 。
パス MTU ディスカバリの最初の提案は、 Don't Fragmentフィールドが設定された IPv4 パケットが伝播するには大きすぎる場合に、 ICMP Fragmentation Needed
パケットの配信に依存していました。残念ながら、一部のルーターはこの種のエラーを生成せず、代わりに大きなパケットを黙って無視することを選択します。クライアントにはパケット損失の原因を判断する方法がありません。
すべてのホストは ICMP_ECHO クエリをサポートすることが義務付けられているため、ICMP メッセージが任意の量のデータを受け入れ、さまざまなサイズのパケットをサーバーに送信できるという事実を利用できます。 IPv4 パケットのDon't Fragmentフィールドをオンにして応答を待機すると、事実上、この MTU サイズが有効であることを確認する ACK (ICMP_ECHOREPLY パケットの形式) を待っていることになります。
ここで、このルートでサポートされる最大 MTU サイズを見つけるために、パケットのサイズに関して二分検索を実行する必要があります。
ICMP モードの場合、さまざまなサイズのいくつかのICMP_ECHOリクエストが生成されます。
ICMP Fragmentation Needed
) が受信された場合、その MTU サイズは無効であると宣言され、しきい値が引き下げられます。ICMP モードの唯一の要件は、ホストが ping メッセージに応答できる必要があることです。
同じアルゴリズムが UDP パケットに適用されますが、確認メッセージを送り返すには、受信ホスト上でサーバー ( udp_server.py ) を実行する必要があります。
このプログラムは、ほとんどの Linux ディストリビューションおよび OSX で正常に動作するはずです。
gcc -Wall -Wextra mtu_discovery.c mtu.c -o plpmtu
警告/エラーは報告されません。その場合は、問題を開いてください。
ICMP モードで実行する場合は、次のように入力します。
sudo ./plpmtu -p icmp -s <server-ipaddr>
代わりにUDP モードを実行する場合は、次のようにします。
sudo ./plpmtu -p udp -s <server-ipaddr:port>
raw ソケットを使用するには管理者権限が必要です。
指定子 | 説明 |
---|---|
-p {icmp/udp} | どのモードで動作するかを選択します。 |
-s <アドレス[:ポート]> | サーバーのアドレスを指定します。 UDP モードで実行している場合は、「:port」を追加して宛先ポートも指定する必要があります (例-s 8.8.8.8:12345 ) |
-l <アドレス:ポート> | オプション。どのアドレスをバインドするかを選択します(); UDP モードで使用されます。削除される可能性があります。 |
-t <タイムアウト> | オプション。サーバーからの応答を待つ最大時間を選択します。デフォルトは 1 秒です。時間はミリ秒単位で表されます。 |
-r <最大要求数> | オプション。 MTU サイズが無効であると宣言するために必要な試行失敗の最大数を選択します。デフォルトは 3 試行です。 |
sudo ./plpmtu -p icmp -s 184.12.26.131
184.12.26.131 で MTU 検出 (ICMP モード) を実行します。
sudo ./plpmtu -p udp -s 184.12.26.131:24000 -t 1500 -r 5
ポート 24000 で 184.12.26.131 を使用して MTU 検出 (UDP モード) を実行します。応答が 5 回連続して 1.5 秒以内に受信されない場合は、MTU しきい値を下げます。