公開:

PMTUD(Path MTU Discovery)とは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


PMTUD(Path MTU Discovery)とは

PMTUDはPath MTU Discoveryの略称で、インターネット経路上で最適なパケットサイズを見つけるプロトコルです。PMTUDは、IPプロトコルの機能の一つであり、送信元ホストと宛先ホストの間のパス上にある最小のMTU(Maximum Transmission Unit)を発見するために使用されます。

PMTUDは、パケットの断片化を防ぐために重要な役割を果たします。MTUより大きいパケットを送信すると、途中のルータでパケットが分割されることがあり、これによってパフォーマンスが低下する可能性があります。PMTUDを使用することで、パケットを最適なサイズに調整し、断片化を回避することができます。

PMTUDの動作原理は、送信元ホストが大きなMTUでパケットを送信し、そのパケットがMTUより大きい場合、ICMPエラーメッセージ(「Fragmentation Needed and Don't Fragment was Set」)が送信元ホストに返されます。送信元ホストは、このエラーメッセージを受信すると、パケットサイズを減らして再送信します。この過程を繰り返すことで、最適なMTUが発見されます。

PMTUDは、IPv4IPv6の両方で使用されています。IPv6では、断片化がルータではなく送信元ホストで行われるため、PMTUDがより重要な役割を果たします。また、PMTUDは、TCPやUDPなどの上位層プロトコルにも影響を与えます。

PMTUDを使用する際は、いくつかの注意点があります。まず、PMTUDはICMPに依存しているため、ICMPがブロックされている環境では正常に動作しない可能性があります。また、PMTUDはブラックホールという問題を引き起こす可能性があります。これは、ICMPエラーメッセージが送信元ホストに返されない場合に発生し、通信が途絶えてしまう現象です。

PMTUDの動作メカニズム

PMTUDの動作メカニズムに関して、以下3つを簡単に解説していきます。

  • PMTUDの基本的な動作原理
  • PMTUDにおけるICMPの役割
  • PMTUDの問題点とその対策

PMTUDの基本的な動作原理

PMTUDの基本的な動作原理は、送信元ホストが大きなMTUでパケットを送信し、そのパケットがMTUより大きい場合にICMPエラーメッセージが返されることです。送信元ホストは、このエラーメッセージを受信すると、パケットサイズを減らして再送信します。この過程を繰り返すことで、最適なMTUが発見されます。

具体的には、送信元ホストは、宛先ホストへのパスのMTUを推測し、そのサイズでパケットを送信します。パケットがMTUより大きい場合、途中のルータからICMPエラーメッセージ(「Fragmentation Needed and Don't Fragment was Set」)が返されます。送信元ホストは、このエラーメッセージを受信すると、パケットサイズを減らして再送信します。この過程を繰り返すことで、最適なMTUが発見されます。

PMTUDは、パケットの断片化を防ぐために重要な役割を果たします。MTUより大きいパケットを送信すると、途中のルータでパケットが分割されることがあり、これによってパフォーマンスが低下する可能性があります。PMTUDを使用することで、パケットを最適なサイズに調整し、断片化を回避することができます。

PMTUDにおけるICMPの役割

PMTUDにおいて、ICMPは非常に重要な役割を果たします。ICMPは、インターネット制御メッセージプロトコルの略称で、ネットワーク層のプロトコルです。ICMPは、ネットワーク上のエラーや状態を通知するために使用されます。

PMTUDでは、ICMPの「Fragmentation Needed and Don't Fragment was Set」メッセージが使用されます。このメッセージは、パケットがMTUより大きく、断片化が必要であるが、パケットのDFビット(Don't Fragment)がセットされている場合に、ルータから送信元ホストに送信されます。送信元ホストは、このメッセージを受信すると、パケットサイズを減らして再送信します。

ICMPは、PMTUDの動作に不可欠な役割を果たしています。ICMPがブロックされている環境では、PMTUDが正常に動作しない可能性があります。したがって、PMTUDを使用する際は、ICMPが適切に機能していることを確認する必要があります。

PMTUDの問題点とその対策

PMTUDには、いくつかの問題点があります。その一つが、ブラックホールという現象です。ブラックホールは、ICMPエラーメッセージが送信元ホストに返されない場合に発生します。この場合、送信元ホストはパケットサイズを減らすことができず、通信が途絶えてしまいます。

ブラックホールを防ぐためには、いくつかの対策があります。一つは、PMTUDの代わりにPMTUD対策のためのプロトコルを使用することです。例えば、TCP MSS(Maximum Segment Size)を使用して、TCPセグメントのサイズを調整することができます。また、UDPでは、アプリケーション層でパケットサイズを調整することができます。

もう一つの対策は、PMTUDのタイムアウト値を適切に設定することです。タイムアウト値が短すぎると、一時的なネットワーク障害によってPMTUDが失敗する可能性があります。逆に、タイムアウト値が長すぎると、ブラックホールが発生した場合に通信が長時間途絶えてしまう可能性があります。適切なタイムアウト値を設定することで、これらの問題を軽減することができます。

PMTUDとTCP/IPの関係

PMTUDとTCP/IPの関係に関して、以下3つを簡単に解説していきます。

  • TCPにおけるPMTUDの役割
  • UDPにおけるPMTUDの役割
  • PMTUD対策としてのTCP MSSの使用

TCPにおけるPMTUDの役割

TCPは、信頼性の高い通信を提供するトランスポート層のプロトコルです。TCPは、パケットの到達確認や再送制御、フロー制御などの機能を持っています。TCPにおいて、PMTUDは重要な役割を果たします。

TCPは、パケットを送信する際に、MSS(Maximum Segment Size)を使用してセグメントのサイズを決定します。MSSは、MTUからIPヘッダとTCPヘッダのサイズを引いたものです。TCPは、PMTUDを使用して、パス上の最小のMTUを発見し、それに基づいてMSSを決定します。これにより、TCPは最適なセグメントサイズでデータを送信することができます。

また、TCPは、PMTUDが失敗した場合にも対処することができます。TCPは、再送制御機能を持っているため、パケットが失われた場合でも、再送することができます。ただし、再送によってパフォーマンスが低下する可能性があるため、PMTUDが正常に動作することが望ましいです。

UDPにおけるPMTUDの役割

UDPは、TCPとは異なり、信頼性の低い通信を提供するトランスポート層のプロトコルです。UDPは、パケットの到達確認や再送制御、フロー制御などの機能を持っていません。UDPにおいても、PMTUDは重要な役割を果たします。

UDPは、パケットを送信する際に、アプリケーション層から受け取ったデータをそのまま送信します。このため、UDPではアプリケーション層でパケットサイズを調整する必要があります。PMTUDを使用することで、アプリケーション層では最適なパケットサイズを決定することができます。

ただし、UDPはTCPと異なり、再送制御機能を持っていません。このため、PMTUDが失敗した場合、パケットが失われてしまう可能性があります。アプリケーション層では、これを考慮してパケットサイズを決定する必要があります。

PMTUD対策としてのTCP MSSの使用

PMTUDには、前述したようにブラックホールという問題点があります。この問題を回避するために、TCP MSSを使用することができます。TCP MSSは、TCPセグメントの最大サイズを決定するためのオプションです。

TCP MSSを使用することで、パス上の最小のMTUを超えないセグメントサイズを決定することができます。これにより、パケットの断片化を回避することができます。また、TCP MSSを使用することで、PMTUDが失敗した場合でも、通信を継続することができます。

ただし、TCP MSSを使用する場合は、いくつかの注意点があります。まず、TCP MSSはTCPのオプションであるため、TCPを使用する場合にのみ有効です。また、TCP MSSを使用する場合、送信元と宛先の両方がTCP MSSを理解している必要があります。これらの点を考慮した上で、TCP MSSを使用することが望ましいです。

PMTUDの設定と注意点

PMTUDの設定と注意点に関して、以下3つを簡単に解説していきます。

  • PMTUDを有効にする方法
  • PMTUDのタイムアウト値の設定
  • PMTUDを使用する際の注意点

PMTUDを有効にする方法

PMTUDは、デフォルトでは有効になっています。ただし、何らかの理由でPMTUDが無効になっている場合は、手動で有効にする必要があります。PMTUDを有効にする方法は、OSやネットワーク機器によって異なります。

Linuxの場合、以下のようなコマンドを使用して、PMTUDを有効にすることができます。

sudo sysctl -w net.ipv4.ip_no_pmtu_disc=0

Windowsの場合、レジストリを編集することでPMTUDを有効にすることができます。ただし、レジストリの編集は慎重に行う必要があります。

PMTUDのタイムアウト値の設定

PMTUDのタイムアウト値は、PMTUDが失敗した場合に、再試行するまでの時間を決定します。タイムアウト値が短すぎると、一時的なネットワーク障害によってPMTUDが失敗する可能性があります。逆に、タイムアウト値が長すぎると、ブラックホールが発生した場合に通信が長時間途絶えてしまう可能性があります。

Linuxの場合、以下のようなコマンドを使用して、タイムアウト値を設定することができます。

sudo sysctl -w net.ipv4.route.mtu_expires=600

上記の例では、タイムアウト値を600秒(10分)に設定しています。ただし、最適なタイムアウト値は、ネットワーク環境によって異なります。したがって、ネットワーク管理者と相談の上、適切なタイムアウト値を設定することが望ましいです。

PMTUDを使用する際の注意点

PMTUDを使用する際は、いくつかの注意点があります。まず、PMTUDはICMPに依存しているため、ICMPがブロックされている環境では正常に動作しない可能性があります。したがって、PMTUDを使用する際は、ICMPが適切に機能していることを確認する必要があります。

また、PMTUDはブラックホールという問題を引き起こす可能性があります。これは、ICMPエラーメッセージが送信元ホストに返されない場合に発生し、通信が途絶えてしまう現象です。ブラックホールを防ぐために、以下のような対策を講じることが重要です。

さらに、PMTUDは経路上のMTUが変更された場合に再計算が必要となるため、動的な環境では効率が低下する可能性があります。このような環境では、定期的にPMTUを再確認するメカニズムを実装することが推奨されます。

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「コンピュータ」に関するコラム一覧「コンピュータ」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。