A、WebSocketのとHTTP
HTML5のWebSocketは、HTTPプロトコルが変更されていないこと、またはそれは問題ではないことを意味もの(契約)、ですが、永続的なHTTP接続をサポートしていません(長い接続ではなく、ループ接続)
まず、HTTPあり 1.1
と 1.0
言った、いわゆる keep-alive
、複数のHTTPリクエストを1つに、しかし Websocket
実際にはHTTPプロトコルを使用して新しい契約ですが、基本的には、既存のブラウザと互換性の手の仕様を振るために、重要ではありません、それは言うことですこれは、図中の1つによって理解することができるHTTPプロトコルに補足です。
すべてではないが、交差しています。
さらに、HTML5は、新しいAPI、または新しい規範、新技術のシリーズを指します。HTTPプロトコル自体は1.0と1.1ですが、また、HTML形式自体に直接関係はありません。。人気の、あなたは、HTML以外HTTPプロトコルでデータを転送することができ、それはとても=です。=
要するに、その後、階層は同じではありません。
二、WebSocketの契約の種類、どのような具体的な利点
まず、WebSocketのプロトコルでは、このために、HTTPプロトコルに対して、永続的な非永続的です。現在説明してPHPのライフサイクルで広く使用されて、例を与えるために単純な。
HTTP経由のライフサイクル Request
を定義するには、それは Request
1 Response
、その後、 HTTP1.0
HTTPリクエストに終わりました。
HTTP1.1の改善そのようなキープアライブ、HTTP接続で複数の応答を受信し、リクエストを複数送信することができるされています。しかし、覚えている Request = Response
HTTPには、常に要求は一つだけ応答することができることを、とてもなります。そして、応答は受動的であり、開始することはできません。
コーチ、BBあなたそんなに、WebSocketのそれを行うには何がありますか?_(:З「∠)_まあ、私はのWebSocketそれを言うつもりでした。。
最初のWebSocketは、HTTPプロトコルに基づいて、またはHTTPプロトコルは、ハンドシェイクの一部を完了するために借りています。
まず、典型的に見て Websocket
、ハンドシェイク(Wikipediaのから借りました...)
GET /チャットHTTP / 1.1
ホスト:server.example.com アップグレード:のWebSocket 接続:アップグレード秒-のWebSocket-キー:x3JJHMbDL1EzLkh9GBhXDw == 秒-のWebSocket-プロトコル:チャット、superchat 秒-のWebSocket-バージョン:13 起源:のhttp:// example.com
子供用の靴に精通しているHTTPを発見したことがあり、これは、いくつかのより多くの事握手要求HTTPプロトコルに似ています。私は道の役割を説明します。
アップグレード:のWebSocket
接続:アップグレード
これは、のWebSocketのコアが伝えている Apache
、 Nginx
と他のサーバー:私は、対応する処理アシスタント見つけるために急いで、私はWebSocketの契約を立ち上げ、あなたに注意を払う-ない昔ながらのHTTPを。
SEC-WebSocketのキー:x3JJHMbDL1EzLkh9GBhXDw ==
秒-のWebSocket-プロトコル:チャット、superchat 秒-のWebSocket-バージョン:13
まず第一に、 Sec-WebSocket-Key
それは Base64 encode
、これはランダムに生成されたブラウザで、値がサーバーに指示します:泥炭、私はナイジェリアが実際のWebSocketアシスタントではないことを確認したい、巣を点滅しません。
その後、 Sec_WebSocket-Protocol
ユーザー定義の文字列は、URLが同じ、異なるサービスプロトコルのニーズを区別するために使用されます。シンプルで理解する:今夜は私がAにサービスを提供したい、間違いの友達を作るん〜
最後に、 Sec-WebSocket-Version
それが使用されているサーバ伝えることです Websocket Draft
初めて、WebSocketの契約はまだ、(プロトコルバージョン)を Draft
持っている奇妙なプロトコルのすべての種類、ステージが、奇妙なさまざまなものがたくさんあり、何のFirefoxとChrome 、との元契約は、あまりにもクラスのバージョンが、大きな問題のWebSocketありません。。しかし幸いにも、今、それが決定されました-何かを我々が使用するすべての-脱水: ウェイターが、私は13歳たいああ→_→
次に、サーバは、次のものを返し、それが正常にWebSocketを確立し、要求を受信したことを言いました!
HTTP / 1.1 プロトコルの切り替え101は、
アップグレード:のWebSocket 接続:アップグレード秒-のWebSocket-受け入れ:HSmrc0sMlYUkAGmm5OPpG2HaGWk = 秒-のWebSocket-プロトコル:チャットを
最後に、ここではHTTPを担当する領域であり、顧客に伝え、私は正常〜プロトコルの友人を切り替えています
アップグレード:のWebSocket
接続:アップグレード
アップグレードするクライアントを教えて、固定されたまま Websocket
ではなくmozillasocket、lurnarsocketまたはshitsocketよりプロトコルを、。
その後、 Sec-WebSocket-Accept
これはサーバーを介して、暗号化した後に確認されました Sec-WebSocket-Key
。サーバー:OK、OK、私はあなたは大丈夫証明するために自分のIDカードを見て、あなたを知っています。。
後者は、 Sec-WebSocket-Protocol
それがプロトコルの最終用途です。
これまでのところ、HTTPは、そのすべての作業を完了した次は、WebSocketの契約に従って完全にあります。この特定の契約に詳述されていません。
------ ------完全なテクニカル分析セクション
あまりにも長い間、最終的にどのようなゴーストのWebSocketの使用であり、そのためにあなたはTMDおよびBBB http long poll
またはajax轮询
ないリアルタイムの情報がそれを届け達成することができます。
[OK]を、若い人たちは、その後、私たちはどのような目的のWebSocketについて話しましょう。あなたが食べる与えるためには胡(蘇)ディル(ダン)BU(赤)
WebSocketを第三に、役割
WebSocketを前に言えば、私は便利だと思います下にスライド long poll
し、 ajax轮询
原則。
Ajaxの世論調査
Ajaxのポーリング原理は、数秒ごとに新しいメッセージのサーバーを頼む、ブラウザが要求を送信できるように非常に簡単です。
シーン再現:
クライアント:ラララ、新しい情報(リクエスト)がありません
サーバー:なし(レスポンス)
クライアント:ラララ、新しい情報(リクエスト)がありません
サーバー:なし。。(レスポンス)
クライアント:ラララ、新しい情報(リクエスト)がありません
サーバー:こんにちはファナ、ああありません。。(レスポンス)
クライアント:ラララ、新しいメッセージがない(リクエスト)
サーバー:OK、OK、友達があなたにあります。(レスポンス)
クライアント:ラララ、新しいメッセージがない(リクエスト)
サーバー:。。。。いいえ。。。。いいえ。。。いいえ(応答なし) - ループ
ロングポーリング
long poll
実際には、との原則 ajax轮询
ほぼすべてのポーリング方法が、ブロッキングモデルを採用した(ハングアップしませ受けなかった、と呼ばれている)、すなわち、クライアントがメッセージの接続を開始し、そうでない場合、それは戻りませんクライアントへの対応。メッセージが再び、何度も何度も接続を確立するために、クライアントが完了した後に返されるまで戻りませ。
シーン再現:
クライアント:ラララ、私だけに戻った新たな情報、他には何の言葉はありません(リクエスト)
サーバー:量。。ニュースを待つ時間。。(Response)をあなたに与えるために、
クライアント:ラララ、私だけ(要求)に戻った新たな情報、他には何の言葉はありません-loop
実際には、これは、上記の二つの方法から分かるように、常にHTTP接続を確立し、サーバー・プロセスのために待機している、他の特徴、受動HTTPプロトコルを反映することができます。
それの受動性が何であるか、実際には、サーバがクライアントに連絡するためのイニシアチブを取ることができない、唯一のクライアントが開始されます。
これは、単にサーバが怠惰な冷蔵庫は、(これはテリアである)(いいえ、接続を開始することはできません)ですが、関係なく、良好な受信を持ってどのように疲れて、顧客が存在しない場合ボスは、注文されています。
これを持って、のは、上記欠陥(そんなにナンセンスそれOAQ私を許して)について話しましょう
以上のことから、それがどちらの上に、とにかく、見やすいですが、非常にリソースを集中的です。
Ajaxのポーリングは、サーバが速い処理速度とリソースを持っている必要があります。(スピード)ロングポーリングが高い並列性を持っている必要があり、それは同時に、クライアントを受信する能力を言うことです。(会場の大きさ)
だから、 ajax轮询
および long poll
このような状況が発生する可能性があります。
クライアント:ラ・ラ・ラ・ラ、新たな情報もありますか?
サーバー:毎月ラインがビジー状態である、後でもう一度試してみてください(503サーバー利用不可)
クライアント:. 。。。まあ、ラララ、新しい情報はありますか?
サーバー:毎月ラインがビジー状態である、後でもう一度試してみてください(503サーバー利用不可)
クライアント:側で死んビジーサーバー:冷蔵庫、私は冷蔵庫のもっと欲しいです!もっと。。もっと。。(私が間違っていた。これは、他のテリア..です)
私たちのために、自宅に近いことのWebSocket
上記の例では、我々はそれは多くのリソースを必要とし、これらの二つのアプローチが最善の方法ではないことがわかります。
必要性の速い速度、必要より「電話」の。どちらも、ますます高く用の電話の需要につながることができます。
そうそう、私は状態またはHTTPプロトコルを言うのを忘れていました。
サーバーは毎日、あまりにも多くの顧客を受けなければならないので、と言って人気の、あなたがハングアップとして、彼はあなたを忘れ全部を取って、あなたが全部を失った、物忘れ幽霊です。二回目は、あなたが再びサーバーに伝える必要があります。
したがって、この場合に発生した、のWebSocketが現れました。彼はこれらの問題のHTTPを解決しました。まず第一に、受動的、サーバが完了したとき(HTTP->のWebSocket)プロトコルのアップグレード、サーバは、積極的にクライアントそれに情報をプッシュすることができます。以下のように上記のシナリオを変更することができます。
クライアント:ラララ、私は必要なのWebSocketプロトコル、サービスを構築したい:チャット、WebSocketのプロトコルバージョン:17(HTTP要求)
サーバー:OK、確認するには、(HTTPプロトコル交換)のWebSocketプロトコルにアップグレードされました
クライアント:ああ押されたときに、あなたが私に情報を与えることができます。。
サーバー:OK、時々私はあなたを教えてくれます。
サーバー:balabalabalabala
サーバー:balabalabalabala
サーバー:ああハッハッハハッハッハ
サーバー:ハッハッハハッハッハハッハッハ私を殺し
それはそう、あなただけが送信された情報の安定した流れを行うことができ、HTTPリクエストを通過する必要がありますになります。(プログラミングでは、この設計は、すなわち、コールバックと呼ばれて:あなたは情報を持っていますか、私はあなたを求めるようになったたびに来て、愚かな、私はありませんお知らせ)
この契約は、上記の同期遅延を解決するだけでなく、非常にリソースがこのケースを消費します。なぜ彼は、サーバー上のリソースの消費の問題を解決するのでしょうか?
実際には、我々は、nginxのサーバーを解析するには、プロキシ、HTTPプロトコル、などである二つの手順を経るために使用し、その後に対処するための適切なハンドラ(PHPなど)を送りました。簡単に言えば、我々は非常に高速を持って 接线员(Nginx)
、彼は適切に転送問題に責任があります 客服(Handler)
。
基本的には高速演算自体は十分ですが、顧客サービス(ハンドラ)、旧内のすべてのカードと顧客サービスプロセス遅すぎます。、顧客サービスに結果として得られる十分ではありません。顧客情報は、その後、統一クライアントでオペレータに転送オペレータに通知する方法を、見つけるために、ときにそのような問題を解決するためのWebSocketは、永続的な接続の確立は、オペレータとの直接確立することができます。
この問題は、顧客サービスプロセスを遅く、あまりにも解くことができます。
一方、伝統的な方法では、我々は、非HTTP、毎回再伝送の状態に、近くにHTTPプロトコルを確立し続けなければならない identity info
あなたは、サーバーを伝えるために(識別情報)。
オペレータは非常に高速ですが、このような杭を聞くたびに、効率が低下しますが、顧客サービスに顧客サービスに対処するための時間の無駄ではないだけに、この情報を入れて継続する必要がありますが、また、伝送ネットワークで消費が過度の流れ/時間。
通信処理の全体は、このように非HTTPの状態を避け、接続/状態に基づいてされるように、あなたがリクエストをシャットダウンするまでに一度、サーバは常にあなたの情報を知っていますが、WebSocketをHTTP握手だけで、これは解決するだろうオペレータは、繰り返しHTTPプロトコルを解析するだけでなく、アイデンティティ情報の情報を表示します。
同時に、お客様に依頼するためのイニシアチブをとる、情報が送信されるサーバー(プッシュ)に変換する(イニシアティブは上で情報を送信するための、もちろん、クライアントまたは待つ...)、何も情報がオペレータ(nginxの)に指定されていないとき、自身がスピードを取りません。遅い顧客サービス(ハンドラ)A
-------
サポートされていないのWebSocketクライアント上でのWebSocketを使用する方法については。。答えは: ありません
しかし、上記で述べた long poll
、と ajax 轮询
同様の効果をシミュレートするために、
ます。http://www.zhihu.com/question/20215561からの振替