昨今、Massively Multiplayer Online Role-Playing Game(MMO PRG)が好評を得ている。本屋でMMOの作り方の本(韓国語からの翻訳版?)が置いてあったのでチラ見したら、はじめの方にTCPとUDPに関する説明とnagleアルゴリズムについての解説があった。
ネットワークの実用的なプロトコルの中で最も制御の難しいものの1つにMMOのネットワークプログラミングがあると日ごろから考えている。その理由は以下の通りだ。
- MMOは時間課金する場合があるため品質にシビア
- アイテム課金する場合には、落ちているアイテムを誰が取得したのか等々
- 格闘系やアクション、リアルタイムRPGならいかにラグを小さくするのか
- UDPは使えない場合が多いのでTCPのみ?
- 瞬断、パケットロス、無線などにどのように対応するか
これらの問題のうち、TCPに着目した場合、パケットロス、nagleアルゴリズムの問題は顕著だ。
課金やアイテム取得ではない、パケットロスしても良い素材情報の配信であればTCPよりもUDPの方が良い。しかしながらNATの関係上TCPにせざる得ない。TCPの場合、パケットロスした箇所が到着するまで、その先を送ることができない。
どうするべきか…と考えると、1つアイディアが浮かんだ。複数コネクション張れば片方でパケットロスが発生しても、片方で情報を伝えることは出来そうだ。しかし、これが有効かどうかは実験してみなければ分からない。
nagleアルゴリズムについては、MSSに満たないセグメントを生成するようなプログラムを書くと影響する。MMOのパケットをキャプチャしたことはないので分からないが、ほとんどがMMS以下のセグメントを生成しているのではなかろうか。その場合、nagleアルゴリズムによってACKが到着するまでは送信できなくなる。
MMOゲーマーのTIPSにはnagleアルゴリズムを無効化することでRTTが50ms〜100ms早くなったとする結果もあるようだ。
これらのMMOネットワークプログラムに対するTCPやUDPの振る舞いはMMOに限らずリアルタイム性を要求するアプリケーションに対して意味あるものだと考えられる。学術的にも、MMOが要求する品質とそれを満たすプロトコルの工夫についてより議論されていくべきではなかろうか。
# NGNの品質管理によるネットワークゲーム応用には期待していたりする。