研究

SlideShareで「ネットワークゲームにおけるTCPとUDPの使い分け」を読みました

スライドシェアで見つけたとても興味のある分野に関するスライドを読みました。モノビットさんのスライドです。

基本的にTCPとUDPに関する基本的なことが書かれており、たまにゲームを絡めたりtipsが入っていたりという構成になっています。

前半はインターネットに関すること(プロトコルの階層構造とかパケットとか)の話だったので省略します。

TCPとUDP

TCP

Transmission Control Protocolの略。トランスポート層で動きます。

IPから上がってきたパケットに「シーケンス番号」「ACK番号」「ウインドウサイズ」を追加して正確な受信順序、ロスした際の再送、輻輳制御を実現します。

問題点としてはウインドウサイズの設計によりスロースタート現象やストールが発生してしまったりします。

その解決策としてGoogle BBRなどの新しいアルゴリズムやMPTCP(複数のIPアドレス/インタフェースを同時に使用して通信することで、通信のスループットを向上させるという機能*参考)を用いることでスループットの向上やストールの解消が見込めます。

UDP

User Datagram Protocolの略。こちらもトランスポート層で動きます。

IPから上がってきたパケットに「ポート番号」のみを追加するもので、最低限の役割しか果たしません。ただTCPと比べて通信遅延が小さかったりサーバのCPU消費が小さかったりします。

問題点としてはパケットロスを検知も解決もできないところです。

その解決策としてUDPにTCPの機能の一部を追加したRUDP(Reliable UDP)があります。これは信頼性の必要なパケットとそうでないパケットを区別し、大事なパケットは順序や再送を保証するというものです。

比較

UDPは速いですが信頼性が担保できないので、UDPとTCPの切り替えが可能な通信ミドルウェアを使用すればUDPが最良になりうります。

ネットワークゲームにおいて

このスライドで僕が一番注目したのは61ページです。

1フレームが1/60秒(約16ms)であることを考えるとFPSや格ゲーでは1,2フレームくらいの遅延で抑えたいというのは切実な課題だろうなと思いました。

感想

まずゲームの通信にもTCPとかUDPとかっていうのがちゃんと使われてるんだなーっていうのが本職の方のスライドで知れてよかったです。

スライドの富山東京間での実験データをみるとTCPでは70msくらいUDPでは35msくらいの遅延があり、オンライン対戦ゲームではUDPを使いたいけどトラブルが怖いなどの葛藤があるのかなと思いました。

もしUDPが理想的に動けばだいたい2,3フレームくらいで送信できるということなので、往復で5フレームくらいになります。これをさらに改善する方法があるのかどうかは僕にはわかりませんが、できたら最高だなと思います。

またUDPでパケットロスが生じてしまったときの対応策をきちんと考えれば操作が飛ぶこともなく快適にプレイできそうです。素人の頭では時系列の入力を記憶しておき通信が届かなかった際には機械学習などで操作を補完したりできたらすごいのになあとか妄想しました。