1)なぜWebSocketsプロトコルの方が優れているのですか?
WebSocketは、特にクライアントからサーバーへのメッセージの待ち時間が短い場合に、待ち時間の短い通信が必要な状況に適しています。サーバーからクライアントへのデータの場合、長時間保持される接続とチャンク転送を使用して、レイテンシをかなり低くすることができます。ただし、これは、クライアントからサーバーへのメッセージごとに新しい接続を確立する必要があるクライアントからサーバーへの待ち時間には役立ちません。
48バイトのHTTPハンドシェイクは、多くのヘッダーとCookieデータを含む、要求の一部として(両方向に)数キロバイトのデータが送信されることが多い実際のHTTPブラウザー接続では現実的ではありません。Chromeを使用するためのリクエスト/レスポンスの例を次に示します。
リクエストの例(Cookieデータを含む2800バイト、Cookieデータなしの490バイト):
GET / HTTP/1.1
Host: www.cnn.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.68 Safari/537.17
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: [[[2428 byte of cookie data]]]
応答の例(355バイト):
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 13 Feb 2013 18:56:27 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: CG=US:TX:Arlington; path=/
Last-Modified: Wed, 13 Feb 2013 18:55:22 GMT
Vary: Accept-Encoding
Cache-Control: max-age=60, private
Expires: Wed, 13 Feb 2013 18:56:54 GMT
Content-Encoding: gzip
HTTPとWebSocketはどちらも同じサイズの初期接続ハンドシェイクを備えていますが、WebSocket接続では初期ハンドシェイクが1回実行され、その後、小さなメッセージのオーバーヘッドは6バイトだけになります(ヘッダーに2、マスク値に4)。レイテンシのオーバーヘッドは、ヘッダーのサイズからではなく、それらのヘッダーを解析/処理/格納するロジックから発生します。さらに、TCP接続セットアップの待ち時間は、各要求のサイズまたは処理時間よりもおそらく大きな要因です。
2)HTTPプロトコルを更新する代わりになぜ実装されたのですか?
SPDY、HTTP 2.0、QUICなど、HTTPプロトコルを再設計して、パフォーマンスを向上させ、レイテンシを短縮する取り組みがあります。これにより、通常のHTTPリクエストの状況が改善されますが、WebSocketやWebRTC DataChannelは、HTTPプロトコルよりもクライアントからサーバーへのデータ転送のレイテンシが低い可能性があります(または、WebSocketによく似たモードで使用されますいずれかの方法)。
更新:
以下は、Webプロトコルについて考えるためのフレームワークです。
- TCP:低レベル、双方向、全二重、および保証された順序トランスポート層。ブラウザーサポートなし(プラグイン/ Flashを除く)。
- HTTP 1.0:TCPに階層化された要求/応答トランスポートプロトコル。クライアントは1つの完全な要求を行い、サーバーは1つの完全な応答を返し、接続は閉じられます。要求メソッド(GET、POST、HEAD)には、サーバー上のリソースに対して特定のトランザクション上の意味があります。
- HTTP 1.1:HTTP 1.0の要求と応答の性質を維持しますが、複数の完全な要求/完全な応答(要求ごとに1つの応答)に対して接続を開いたままにすることができます。リクエストとレスポンスに完全なヘッダーが残っていますが、接続は再利用され、閉じられません。HTTP 1.1では、いくつかの追加の要求メソッド(OPTIONS、PUT、DELETE、TRACE、CONNECT)も追加されました。これらも特定のトランザクション上の意味を持っています。ただし、HTTP 2.0ドラフトプロポーザルの紹介で述べたように、HTTP 1.1パイプラインは広く展開されていないため、ブラウザーとサーバー間の遅延を解決するHTTP 1.1のユーティリティが大幅に制限されます。
- Long-poll:サーバーがクライアント要求にすぐに応答しない(またはヘッダーで部分的にのみ応答する)HTTP(1.0または1.1のいずれか)に対する一種の「ハッキング」。サーバーの応答後、クライアントはすぐに新しいリクエストを送信します(HTTP 1.1の場合は同じ接続を使用)。
- HTTPストリーミング:サーバーが単一のクライアント要求に複数の応答を送信できるようにするさまざまな手法(マルチパート/チャンク応答)。W3Cは、これをMIMEタイプを使用したサーバー送信イベントとして標準化しています
text/event-stream
。ブラウザーAPI(WebSocket APIとかなり似ています)は、EventSource APIと呼ばれます。
- コメット/サーバープッシュ:これは、ロングポーリングとHTTPストリーミングの両方を含む包括的な用語です。Cometライブラリは通常、複数の手法をサポートしており、クロスブラウザおよびクロスサーバーのサポートを最大限に活用しています。
- WebSockets:HTTPフレンドリーなアップグレードハンドシェイクを使用するトランスポート層の組み込みTCP。ストリーミングトランスポートであるTCPとは異なり、WebSocketはメッセージベースのトランスポートです。メッセージはネットワーク上で区切られ、アプリケーションに配信される前に完全に再構成されます。WebSocket接続は、双方向、全二重、長寿命です。最初のハンドシェイク要求/応答の後、トランザクションのセマンティクスはなく、メッセージごとのオーバーヘッドはほとんどありません。クライアントとサーバーはいつでもメッセージを送信でき、メッセージの受信を非同期で処理する必要があります。
- SPDY:Googleが提案した、より効率的なワイヤプロトコルを使用してHTTPを拡張する提案ですが、すべてのHTTPセマンティクス(要求/応答、Cookie、エンコーディング)を維持しています。SPDYは新しいフレーム形式(長さの接頭辞が付いたフレーム)を導入し、HTTP要求/応答ペアを新しいフレーム層にレイヤー化する方法を指定します。接続が確立された後、ヘッダーを圧縮して新しいヘッダーを送信できます。ブラウザとサーバーには、SPDYの実際の実装があります。
- HTTP 2.0:SPDYと同様の目標があります。HTTPのセマンティクスを維持しながら、HTTPの待ち時間とオーバーヘッドを削減します。現在のドラフトはSPDYから派生しており、ハンドシェイクとフレーミングに関するWebSocket標準と非常によく似たアップグレードハンドシェイクとデータフレーミングを定義しています。代替HTTP 2.0ドラフトプロポーザル(httpbis-speed-mobility)は実際にトランスポート層にWebSocketを使用し、SPDY多重化とHTTPマッピングをWebSocket拡張として追加します(WebSocket拡張はハンドシェイク中にネゴシエートされます)。
- WebRTC / CU-WebRTC:ブラウザ間のピアツーピア接続を可能にする提案。基になるトランスポートはTCPではなくSDP /データグラムであるため、これにより、平均遅延および最大遅延の通信が可能になる場合があります。これにより、パケット/メッセージの順不同の配信が可能になり、後続のすべてのパケットの配信を遅らせるドロップされたパケットによって引き起こされる遅延スパイクのTCP問題を回避します(順序どおりの配信を保証するため)。
- QUIC:TCPよりもWebレイテンシを減らすことを目的とした実験的なプロトコルです。表面的には、QUICはUDPに実装されたTCP + TLS + SPDYによく似ています。QUICは、HTTP / 2と同等の多重化とフロー制御、TLSと同等のセキュリティ、TCPと同等の接続セマンティクス、信頼性、および輻輳制御を提供します。TCPはオペレーティングシステムカーネルとミドルボックスファームウェアに実装されているため、TCPに大幅な変更を加えることはほぼ不可能です。ただし、QUICはUDPの上に構築されているため、そのような制限はありません。QUICは、HTTP / 2セマンティクス用に設計および最適化されています。
参照:
- HTTP:
- サーバー送信イベント:
- WebSockets:
- SPDY:
- HTTP 2.0:
- WebRTC:
- QUIC: