これだけでは、はっきりしない部分も多いが、以下に該当する場合はPMTUDブラックホール問題の可能性が高い。
- サーバ側が、Yahooやusen、CATV等のLAN型接続で1454Byteより大きいMTU長の回線サービスを利用している。
- 自分と同じプロバイダのほか、問題が発生しないケースもあり、全てのクライアントで問題が出るわけではない。問題が発生するのは、クライアント側のMTUが自分より小さい(フレッツ等、PPPoEの場合は1454Byteのケースが多いはず。)場合に発生している。
- クライアントからサーバへの上り(MTUの小さいほうから大きいほう)は大丈夫であるが、下り方向で大きなデータを転送するケース(即ち、FTPサーバからのダウンロードやWWWアクセス)で問題が発生する。小さいコンテンツ(1KByte程度)では、問題は発生しない。
PMTUDブラックホール(PathMTUDiscovery Blackhole)については、検索すればインターネット上にいくらでも情報はあるので、ここでは簡単に。
PMTUDは、MTU長の異なるネットワーク間でうまく通信できるようにするための仕組みである。PMTUDでは、MTU長の大きいほうから小さい方向にパケットを中継するとき、物理的にそのままでは送れないのでフラグメント(1つのパケットを分割して送ること)しようとするが、フラグメントが許可されていない場合、送信元にMTU長を小さくするようにICMPを使って通過できるMTU長を通知する。このパケットがうまく送信元(ここでのケースではサーバ)に届かないと、送信元はいつまでも元のサイズで送ろうとするので、永遠に通信できなくなってしまう。サーバ側がBBR環境(NAT)の場合、送信したTCPとは異なるICMPで、しかも途中のルータからこのパケットが帰ってくるので、BBRでうまく送信元に中継してくれるものは皆無のはず。また、多くのBBRはICMPそのものを遮断するので、サーバにはこの情報が到達せずこの現象が発生しする。
[対 処]
本質はネットワークの問題なので手は打てないが、サーバ側でMTU長を調整してあげれば回避できる。MTU長としては、世の中の多くのPPPoE環境で使われている1454Byteで問題ない。MTU長は大きいほうがオーバヘッドが減るので、スループットが上がるが、サーバを建てていて相手に見えないのでは話にならないので、Yahooやusen、CATV等の1454Byteより大きいMTU長の回線サービスを使用してサーバ公開するなら、MTU長の調整は必須と思ったほうが間違いない。
- サーバでの対処
パケットを送出しているのはサーバなので、ここで明示的にMTUを1454Byteに設定する。Windowsなら、Dr.TCP等いろいろツールがあるので、それを使えば簡単に設定できる。こちらの情報はインターネット上にいくらでもあるので、検索してほしい。Linuxなら、ifconfigコマンドでインタフェースを指定して設定すればよい。
# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:288442 errors:0 dropped:0 overruns:0 frame:0
TX packets:356260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:44572672 (42.5 Mb) TX bytes:331743976 (316.3 Mb)
Interrupt:12 Base address:0x6c00 Memory:ef100000-ef100038
# ifconfig eth0 mtu 1454
# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1454 Metric:1
RX packets:288442 errors:0 dropped:0 overruns:0 frame:0
TX packets:356260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:44572672 (42.5 Mb) TX bytes:331743976 (316.3 Mb)
Interrupt:12 Base address:0x6c00 Memory:ef100000-ef100038 |
- ルータ(BBR)での対処
サーバでの設定が困難なら、BBRで設定しても大丈夫である。この場合、BBRがMTUの境界ルータになるが、家庭内は単なるレイヤ2の世界なのでサーバにICMPは届くので、サーバが自動的にBBRから通知された1454Byteに調整するので、問題は発生しない。BBRが2段になっている場合は、基本的にサーバが接続されているBBRで行うこと。
Top Pageへ 戻る