PSOをADSL(又は光ファイバー)でやる場合の注意

どんな現象が起こるか

簡単にいうと、以下の状況でフリーズします。
 ・最初のメニューでシップを選択した後、ワープ先に人がいるとワープ画面でフリーズ。
 ・ダウンロードのダウンロードクエストを選ぶとフリーズ。
ここでいうフリーズというのは、画面が完全に止まることで、この状態になると、PSOが 反応しなくなり、ソフトウェアリセットも効かない状態になります。



なぜ起こるか

ほんとは、TCP/IP、PPP、Ethernet、PPPoE、NATなどの知識を導入してもらうと説明しやすいんですけど、 ここではある程度に知識でもわかるように説明しているつもりです。
何かわからないことでもあれば、掲示板にでも書いてください。

ADSLというのはPPPoEという仕組みを使っています。PPPoEがわからない人は、ADSLや光ファイバーで ユーザー認証(ユーザー名とパスワードと調べる)するためのしくみだと思っておいてください。
PPPoEある情報を、送られてくるデーターにつけます。
本来、ネットワークは1500バイトのデーターを1度に送ることができるのですが、8バイトのある情報を余分につけるため、 1492バイトのデーターしか1度に送ることができなくなってしまいます。

ネットには、1度にどれくらいの量を送ることができるか知らせる機能があります。
もちろん、ドリームキャストにもその機能はついているのですが、本当だったら「1492バイト送れるよ」と伝えるはずが、 間違えて「1500バイト送れるよ」と伝えてしまいます。
これが、フリーズする原因です。

サーバーがドリームキャストに「これからデーターを送る」という信号を送るのですが、 その後に来るデーターが「1500バイトのデーター」を1度に送ってしまうので、ADSLは「1492バイトのデーター」 しか1度に通す(送る)ことができないので、そのデーターを捨ててしまいます。
その結果、ドリームキャストはその送られたデーターを受け取ることができなくなって、 「信号は送られてきてるのにデーターが送られてこない」という状況になってしまい、その結果フリーズしていると考えられます。

一部のルーターは、「1500バイト送れるよ」を、強制的に書き換えて送っているようで、そういうルーターなら大丈夫です。
また、Windowsの接続共有をルーターにしている人も、設定により回避することができるようです。

ワープ先のロビーに人がいない場合にはフリーズしないのは、送られるデーター量が少なく、1500バイトに満たないためだと考えられます。



どうすればいいか

DC側が対応してくれればいいのですが、それは今のところ期待できないので、 対処療法として「1500バイト送れるよ」という情報を強制的に書き換えてばうまくいきます。

一部のルータは、「1500バイト送れるよ」を、強制的に書き換えて送っているので、大丈夫です。
Windowsパソコンをルーターにしている人も、設定をかえれば書き換えてくれるらしいので、大丈夫です(未確認)。
FreeBSDなどのUNIX系では、書き換えてくれるソフトがあるようです。
ルーターの場合はファームウェアのバージョンアップを待つしか方法はないです。



どうすればいいか(ルーター編)

どうしようもありません(w
ルーターのファームウェアのバージョンアップを待ってください。

それを待つのがいやなら、メーカーにこのページを教えて改善してもらうのがいいでしょう。
「このページの意味がわからない」とメーカ言われたら、メーカーが馬鹿か、このページの作成者の国語力がないだけなので、 そんな会社の作ったルータか、このページのどちらかを豆腐の角にぶつけてこわしてください(w。



どうすればいいか(Win9x ルーター編)

レジストリをいじれば直るかもしれません。
レジストリがわからない人はあきらめてください。

 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0000\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0001\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0002\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0003\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0004\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0005\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0006\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0007\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0008\MaxMTU
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0009\MaxMTU
の値を全部、「1410」にしてみてください。
「1450」、「1464」、「1492」でもいけるかもしれません。
この数字はなるべく多い方がいいので、できる限り大きくしておきましょう。
小さいままでも、(極端に小さくしない限り)ほとんど問題はありません。

これでもうまくいかない場合は、  HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCPPMTU\BlackHoleDetect = 1
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCPPMTU\PMTUDiscovery = 1
 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\MSTCPPMTU\MaxMTU = 1410
あたりも設定するとうまくいくかもしれません。
自分でやったわけではないので、未確認です。
「こうすればできるかもしれない」と思っただけです。
パソコンを壊すのが心配な人は、人柱を待ちましょう。

あと、自己責任でお願いします。


どうすればいいか(Win2000 ルーター編)

レジストリをいじれば直るかもしれません。
同じようにレジストリがわからない人はあきらめましょう(w。

HKLM,System\CurrentControlSet\Services\Class\NetTrans\0000\MaxMTU,0,"1492"
が「0」だったら、「1」にして、再起動してもう1度試してください。
もし、「1」でうまくいかなかったらすぐに「0」に戻しましょう。

これでもうまくいかない場合は、MTU関係をいじってみてください。

あと、こっちも未確認なので自己責任でお願いします。


どうすればいいか(FreeBSD ルーター編)

PPPoEクライアントに、iij-ppp(ユーザーPPP)の2.3以上を使っているなら、ppp.confに 「enable tcpmssfixup」を追加してみてください。
iij-ppp(ユーザーPPP)の古いやつをつかっているか、PPPoEクライアントに他のソフトを 使っている場合は、portsにある「tcpmssd」というのをやってみてください。

FreeBSD以外のUNIXは、できるらしいですが方法はわかりません。
MLにでもなげてみたらわかるかも。


参考にもの

 ・FreeBSD-users-jpのみなさん
 ・FreeBSD-FAQ
 ・Microsoft Knowledge Base Q158474, Q120642
 ・DC BbA 掲示板
 ・PSO japan ML


あとがき(?

本当にこれが原因かはわかりません。