web-dev-qa-db-ja.com

WebSocket、UDP、およびベンチマーク

HTML5 websocketsは現在、TCP communication。の形式を使用しています。ただし、リアルタイムゲームの場合、TCPはカットしません(使用する大きな理由です)プロジェクトを続行するにはUDPが必要な可能性が高いので、HTML6の仕様などがUDPをサポートするかどうかを知りたいのですが。

また、WSプロトコルを低レベルの直接ソケットプロトコルと比較するWebSocketの信頼できるベンチマークはありますか?

55
bobbybee

LANでは、200マイクロ秒(ブラウザーJSからWebSocketサーバーへ、およびその逆)のWebSocketを介したメッセージの往復時間を取得できます。これは、生のICMP pingと同様です。 MANでは、約10ミリ秒、WAN(同じ国のサーバーへの住宅ADSL経由)約30ミリ秒、そして3.5G経由で最大約120-200ミリ秒です。ポイントは:WebSocketが追加しますネットワークに基づいて、とにかく得るものへの実質的に待ち時間はありません。

WebSocketのワイヤレベルオーバーヘッド(未加工TCPと比較)は、メッセージごとに2オクテット(長さが<126オクテットのマスクされていないペイロード)から14オクテット(長さが> 64kのマスクされたペイロード)の間ですWebSocketフレーム)。とても低い。

WebSocketワイヤレベルのオーバーヘッドの詳細な分析については、こちらをご覧ください ブログ投稿-これには、WebSocket以外のレイヤーをカバーする分析が含まれますまた。

さらに:ストリーミング処理が可能なWebSocket実装を使用すると、(最初のWebSocketハンドシェイク後に)各方向で1つのWebSocketメッセージとフレームを開始し、オーバーヘッドなしで最大2 ^ 63オクテットを送信できます。基本的に、これはWebSocketを生のTCPの素晴らしいプレリュードにします。警告:仲介者は、独自の判断でトラフィックを断片化する場合があります。ただし、WSS(安全なWS = TLS)を実行する場合、仲介者は干渉できません。HTTP互換プレリュード(WSハンドシェイク)を使用した生のTCPです。

WebRTCは、メディア転送にRTP(= UDPベース)を使用しますが、さらにWebSocketなどのシグナリングチャネルが必要です。RTPは、寛容なリアルタイムmediaトランスポート「リアルタイムゲーム」とは、メディアではなくプレイヤーの位置などを転送することを意味することがよくあります。

注:WebRTCトランスポートは、RTPであるか、SRTPを介して保護されている場合があります。「RTPプロファイル」 ここ を参照してください。

194
oberstet

ローカルの有線ネットワークでWebSocketを使用してゲームを開発し、WebRTC Data Channel APIが利用可能になったら移行することをお勧めします。 @oberstetが正しく指摘しているように、WebSocketの平均レイテンシは基本的にraw TCPまたはUDP、特にローカルネットワーク上で同等であるため、開発段階では問題ありません。WebRTCData Channel APIは設計されています(接続が確立されると)WebSocketに非常に似ているため、広く利用可能になったら統合するのはかなり簡単です。

あなたの質問は、UDPがおそらく低レイテンシーのゲームに必要なものであり、真実があることを意味しています。ゲームを書いているので、これを既に知っているかもしれませんが、そうでない人のために、TCP vs UDP時間ゲーム:

TCPはインオーダーで信頼できるトランスポートメカニズムであり、UDPはベストエフォートです。 TCPは、送信されたすべてのデータを、送信された順序で配信します。UDPパケットは、到着時に送信され、順序が狂っている場合があります。 、UDPパケットはTCPパケット)の前にドロップされます。TCPは大きな改善のように聞こえます。ほとんどのタイプのネットワークトラフィック向けですが、これらの機能はコスト:パケットの遅延またはドロップにより、後続のすべてのパケットも遅延します(順序どおりの配信を保証するため)。

リアルタイムゲームは一般に、TCPソケットに起因する遅延のタイプを許容できないため、ほとんどのゲームトラフィックにUDPを使用し、ドロップおよびアウトオブ-データを注文します(たとえば、ペイロードデータにシーケンス番号を追加します。数ミリ秒後に別の位置の更新を受信するため、敵プレイヤーの1つの位置の更新を見逃しても大した問題ではありません(おそらく気付かないでしょう) 。しかし、500ミリ秒間の位置の更新を取得せずに、突然一度すべてを更新すると、ひどいゲームプレイが発生します。

つまり、ローカルの有線ネットワークでは、パケットはほとんど遅延またはドロップされないため、TCPは初期開発ターゲットとして完全に問題ありません。WebRTCData Channel APIが利用可能になったら、現在の提案には、再試行またはタイマーに基づいて構成可能な信頼性があります。

以下に参考文献を示します。

38
kanaka

簡単に言えば、TCPをマルチプレイヤーゲームに使用する場合は、アダプティブストリーミングテクニック)と呼ばれるものを使用する必要があります。つまり、クライアント間でゲームワールドを同期するために送信されるリアルタイムデータの量は、各クライアントで現在利用可能な帯域幅と待機時間によって管理されていることを確認する必要があります。

動的な調整、融合、デルタ配信、その他のメカニズムは適応ストリーミング技術であり、魔法のようにTCP UDPほど効率的ではありませんが、いくつかのタイプのゲームで十分に使用可能にします。

私は記事でこれらのテクニックを説明しようとしました:ウェブ上のマルチプレイヤー3Dゲーム同期の最適化http://blog.lightstreamer.com /2013/10/optimizing-multiplayer-3d-game.html )。

また、先月サンフランシスコでHTML5開発者カンファレンスでこのトピックに関する講演を行いました。このビデオはYouTubeで公開されました: http://www.youtube.com/watch?v=cSEx3mhsoHg

19

WebsocketのUDPサポートはありません(実際にあるはずです)が、UDPのような通信にはWebRTCのRTCDataChannel APIを使用できるようです。ここに良い記事があります:

http://www.html5rocks.com/en/tutorials/webrtc/datachannels/

RTCDataChannelは、実際には、構成可能な信頼性と順序付き配信を備えたSCTPを使用します。メッセージを順不同で配信するように指示し、再送信の最大数を0に設定することにより、UDPのように動作させることができます。

しかし、私はこれを試したことはありません。

2
Timmmm

HTML6などの仕様がUDPをサポートするかどうかを知りたいのですが?

WebSocketsはサポートしません。 WebSocketの利点の1つは、 既存のHTTP接続をピギーバックする です。これは、プロキシとファイアウォールにとってWebSocketがHTTPのように見えるため、ブロックされないことを意味します。

セキュリティの問題 のため、任意のUDP接続がWeb仕様の一部になることはありません。あなたが求めているものに最も近いものは、おそらく WebRTC の一部として提供され、関連する JSEPプロトコル です。

信頼できるベンチマークはありますか?.... WSプロトコルを低レベルの直接ソケットプロトコルと比較しますか?

私が知っていることではありません。私は手足に出て、WebSocketsが遅くなると予測します;)

1
robertc