Diarkis RUDP
概要
Reliable User Datagram Protocol (RUDP) はデータの到達が保証されるように実装された UDP 通信です。Diarkis クライアントはサーバーとの通信や P2P 通信において RUDP を用いてデータを送信することができ、ゲームの進行に必要不可欠な情報など重要なデータを確実に相手に届けることができます。このページでは Diarkis の RUDP の仕様と設定について説明します。
Diarkis RUDP の仕様
Diarkis RUDP が確立される組み合わせはサーバー - クライアント間とクライアント - クライアント間 (P2P 通信) があり得ます。一部の機能は P2P 通信でのみ使用が可能です。
Diarkis RUDP ではデータを受信した場合に Acknowledgement (ACK) を返すことでデータが到達したことを相手に知らせます。もし指定した時間以内に ACK の受信が確認できなければ Diarkis クライアントは同じデータを再送します。本ページではこの時間を RetryInterval と呼びます。また、同じデータを指定した回数だけ再送してもなお ACK の受信が確認できなければ、タイムアウトによって Diarkis クライアントは相手との通信を切断します。本ページではこの回数を RetryMaxCount と呼びます。
P2P 通信における RUDP に限りデータの到達保証に加えてデータの順番保証の切り替え機能を提供しています。順番保証機能を有効にすると、アプリケーションが受信するデータの順番が相手ユーザーが送信した順番と一致することが保証されます。Diarkis ライブラリはシーケンシャル番号通りにパケットが受信できるまでアプリケーションにデータを渡しません。順番保証機能を無効にした場合、Diarkis ライブラリはパケットを受信した順番にアプリケーションにデータを渡し、その順番はネットワークの状況や再送パケットの有無によって変わります。
サーバー - クライアント間の RUDP 通信では常に順番保証が有効になります。
Diarkis RUDP の設定
RetryInterval の設定
以下の関数を使用することで RetryInterval を調整することができます。
RetryInterval は minMs
で指定した時間 (ミリ秒) から始まり、クライアントが再送するたびに値が 2 倍になり、maxMs
で指定した時間まで上昇します。 例えば minMs=300ms、maxMs=1000ms、RetryMaxCount が 5 回の場合、RetryInterval は 300ms, 600ms, 900ms, 1000ms, 1000ms と変化します。5 回目の再送がタイムアウトした場合クライアントは通信を切断します。
RetryInterval を Exponential に変化させることでクライアントのネットワーク処理負荷を抑えることができます。もし RetryInterval を固定値にしたい場合は minMS
と maxMS
に同じ値を指定することでRetryInterval を再送回数にかかわらず常に一定にすることができます。
RetryMaxCount の設定
以下の関数を使用することで RetryMaxCount を調整することができます。
RetryMaxCount は count
で指定した値になります。
順番保証の設定
a. Diarkis Module を利用する場合は DiarkisP2PBase.h
に定義されている SendBroadcast
などの関数が持つ type
引数によって RUDP の動作を制御することができます。type
引数に列挙型 RudpType
の値を指定してください。
b. ライブラリを直接使用する場合は以下にある P2P 通信のデータ送信関数において bFixedOrder
フラグを true
にして実行します。
設定における注意事項
SetSendRetryInterval
とSetSendRetryMaxCount
はサーバーとの RUDP 通信に対して設定を行います。P2P 通信における設定はSetSendRetryIntervalP2P
とSetSendRetryMaxCountP2P
を使用してください。RetryInterval が非常に小さい場合や RetryMaxCount が大きい場合はクライアントは大量のパケットを送信しなければならず、ネットワークの処理負荷が大きくなるのでご注意ください。
最終更新