Websocket の原則についての深い理解
この記事は、Websocket の原理を詳しく説明するものであり、困っている友人に役立つことを願っています。
1. Websocket と http
WebSocket は HTML5 から生まれたもの (プロトコル) です。つまり、HTTP プロトコルは変更されていない、または重要ではありませんが、HTTP は永続的な接続 (長時間接続) をサポートしていません。周期的な接続はカウントされません)
まず第一に、HTTP には 1.1
と 1.0
があり、これはいわゆる keep-alive
です。これは複数の HTTP リクエストを 1 つにマージしますが、Websocket
は実際には HTTP プロトコルとは何の関係もありません。つまり、既存のブラウザのハンドシェイク仕様との互換性だけを目的としています。 、それは HTTP プロトコルの補足です。 -0.png" alt=""/>1.1
和 1.0
之说,也就是所谓的 keep-alive
,把多个HTTP请求合并为一个,但是 Websocket
其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解
有交集,但是并不是全部。
另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=
再简单来说,层级不一样。
二、Websocket是什么样的协议,具体有什么优点
首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
HTTP的生命周期通过 Request
来界定,也就是一个 Request
一个 Response
,那么在 HTTP1.0
中,这次HTTP请求就结束了。
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response
, 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。
教练,你BB了这么多,跟Websocket有什么关系呢?_(:з」∠)_好吧,我正准备说Websocket呢。。
首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
首先我们来看个典型的 Websocket
握手(借用Wikipedia的。。)
GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13Origin: http://example.com
熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。
Upgrade: websocketConnection: Upgrade
这个就是Websocket的核心了,告诉 Apache
、 Nginx
等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 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 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=Sec-WebSocket-Protocol: chat
这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~
Upgrade: websocketConnection: Upgrade
依然是固定的,告诉客户端即将升级的是 Websocket
协议,而不是mozillasocket,lurnarsocket或者shitsocket。
然后, Sec-WebSocket-Accept
这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key
。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。
后面的, Sec-WebSocket-Protocol
2. Websocket とはどのようなプロトコルであり、その具体的な利点は何ですか?
Request
、つまり 1 つの Request
と 1 つの Response
によって定義され、その後、HTTP1.0 で定義されます。
で、この HTTP リクエストは終了します。 🎜🎜 HTTP 1.1 ではキープアライブができるように改良が加えられ、1 つの HTTP 接続で複数のリクエストを送信し、複数のレスポンスを受信できるようになりました。ただし、Request = Response
に注意してください。これは HTTP では常に当てはまります。つまり、リクエストには 1 つの応答しか含めることができません。さらに、この反応も受動的であり、能動的に開始することはできません。 🎜🎜コーチ、あなたはたくさんの BB を持っていますが、Websocket と何の関係があるのですか? _(:з ∠)_さて、Websocket について話そうとしたところです。 。 🎜🎜まず第一に、Websocket は HTTP プロトコルに基づいているか、HTTP プロトコルを借用してハンドシェイクの一部を完了します。 🎜🎜まず、典型的な Websocket
ハンドシェイクを見てみましょう (Wikipedia から借用...)🎜rrreee🎜 HTTP に詳しい人は、次のようなハンドシェイク リクエストが他にもいくつかあることに気づいたかもしれません。 HTTPプロトコルのこと。ちなみに機能について説明します。 🎜rrreee🎜これは Websocket のコアです。Apache
や Nginx
などのサーバーに通知します。対応するアシスタントを見つけるのを手伝ってください。昔ながらの HTTP です。 🎜rrreee🎜 まず第一に、Sec-WebSocket-Key
は Base64 エンコード
値であり、ブラウザによってランダムに生成され、サーバーに次のように伝えます。 Ni が本当に Websocket アシスタントであるかどうかを確認するためです。 🎜🎜次に、Sec_WebSocket-Protocol
は、同じ URL 内のさまざまなサービスで必要なプロトコルを区別するために使用されるユーザー定義の文字列です。簡単な理解: 今夜 A にサービスを提供したいのですが、間違えないでください~🎜🎜 最後に、Sec-WebSocket-Version
は、使用されている Websocket Draft
(プロトコル バージョン) をサーバーに伝えます。当初、Websocket プロトコルはまだ Draft
段階にあり、さまざまな種類の奇妙なプロトコルがあり、Firefox と Chrome では同じバージョンが使用されていませんでした。など、Websocket プロトコルが多すぎることが当時大きな問題でした。 。でも、もう大丈夫、決まった〜みんなが使っているもの〜 脱水症状:ウェイター、13 歳の→_→が欲しいです🎜🎜その後、サーバーは以下のものを返します。リクエストが受信され、Websocket が正常に確立されました。 🎜rrreee🎜これは HTTP を担当する最後の領域です。プロトコルの切り替えに成功したことをクライアントに伝えます~🎜rrreee🎜これはまだ修正されており、今後のアップグレードが Websocket
プロトコルであることをクライアントに伝えます。 mozillasocket、lurnarsocket、shitsocket ではありません。 🎜🎜そして、Sec-WebSocket-Accept
は、サーバーによって確認され、暗号化された Sec-WebSocket-Key
です。サーバー: わかりました、わかりました、証明するために私の ID カードをお見せしましょう。 。 🎜🎜 の後の Sec-WebSocket-Protocol
は、使用される最終プロトコルを表します。 🎜🎜この時点で、HTTP はすべての作業を完了しました。次のステップは、Websocket プロトコルに完全に従うことです。具体的な合意についてはここでは説明しません。 🎜🎜————テクニカル分析パート完了——————🎜🎜🎜🎜長い間 BBB を続けてきましたが、Websocket は何に使うのですか? http ロング ポーリング
や ajax ポーリング
ではリアルタイムの情報送信を実現できません。 http long poll
,或者ajax轮询
不都可以实现实时信息传递么。
好好好,年轻人,那我们来讲一讲Websocket有什么用。来给你吃点胡(苏)萝(丹)卜(红)
三、Websocket的作用
在讲Websocket之前,我就顺带着讲下 long poll
和 ajax轮询
的原理。
ajax轮询
ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
场景再现:
客户端:啦啦啦,有没有新信息(Request)
服务端:没有(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:没有。。(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:好啦好啦,有啦给你。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:。。。。。没。。。。没。。。没有(Response) —- loop
long poll
long poll
其实原理跟 ajax轮询
差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
场景再现:
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:额。。 等待到有消息的时候。。来 给你(Response)
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop
从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。
何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。
简单地说就是,服务器是一个很懒的冰箱(这是个梗)(不会、不能主动发起连接),但是上司有命令,如果有客户来,不管多么累都要好好接待。
说完这个,我们再来说一说上面的缺陷(原谅我废话这么多吧OAQ)
从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。
ajax轮询 需要服务器有很快的处理速度和资源。(速度)long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)
所以 ajax轮询
和 long poll


3. Websocket の役割
Websocket について話す前に、ロング ポーリング
と ajax ポーリングの原理について説明します。 コード>。 <p></p>ajax ポーリング<p></p> ajax ポーリングの原理は非常に簡単で、ブラウザが数秒ごとにリクエストを送信して、新しい情報があるかどうかをサーバーに問い合わせます。 <h3></h3>シーン再現: <p></p>クライアント: ラララ、新しい情報はありますか(リクエスト) <p></p> サーバー: いいえ(応答) <p></p>クライアント: ラララ、新しい情報はありますか(リクエスト)<p></p> サーバー:いいえ。 。 (応答)<p></p>クライアント:ラララ、何か新しい情報はありますか(要求)<p></p>サーバー:迷惑ですね、違います。 。 (応答)<p></p>クライアント: ラララ、何か新しいメッセージはありますか? (リクエスト)<p></p>サーバー: 分かった、分かった。 (応答)<p></p>クライアント: ラララ、新しいメッセージはありますか? (要求)<p></p>サーバー:。 。 。 。 。それなし。 。 。 。それなし。 。 。いいえ (応答) —- ループ<p></p>ロングポーリング🎜🎜<code>ロングポーリング
実際、原理はどちらもポーリングを使用しますが、ブロックを使用します。 (電話をかけ続け、電話を受けられない場合は電話を切らないでください)、つまり、クライアントが接続を開始した後、メッセージがない場合、応答はクライアントに返されません。メッセージがあるまで戻りません。戻った後、クライアントは再び接続を確立し、サイクルが再び開始されます。 🎜🎜シーンの再現: 🎜🎜クライアント: ラララ、何か新しい情報はありますか? ない場合は、入手できるまで待ってから返してください (リクエスト)🎜🎜 サーバー: うーん。 。 ニュースがあるまで待ちます。 。来てください (応答)🎜🎜 クライアント: ラララ、何か新しい情報はありますか? ない場合は、入手できるまで待ってから返してください (要求) - ループ🎜🎜 上記からわかるように、実際、これら 2 つのメソッドは両方とも、常に HTTP 接続を確立し、サーバーがその接続を処理するのを待ちます。これは、HTTP プロトコルのもう 1 つの特性である受動性を反映している可能性があります。 🎜🎜パッシブとは何ですか? 実際、サーバーはクライアントに能動的に接続することはできず、クライアントによってのみ開始できます。 🎜🎜簡単に言うと、サーバーは非常に怠惰な冷蔵庫です(これは冗談です)(積極的に接続を開始することはできません)が、上司には注文があり、顧客が来た場合は、それをうまく受け取らなければなりません。彼はどれほど疲れているのだろう。 🎜🎜これについて話した後、上記の欠点について話しましょう (OAQ さん、くだらない話をしてごめんなさい)🎜🎜 上記の 2 つは、何はともあれ、非常にリソースを消費することが簡単にわかります。 🎜🎜ajax ポーリングでは、サーバーに高速な処理速度とリソースが必要です。 (速度) 長いポーリングには高い同時実行性、つまり顧客を同時に受信できる機能が必要です。 (会場の規模)🎜🎜 したがって、これは ajax ポーリング
と long polling
で発生する可能性があります。 🎜🎜クライアント: ララララ、何か新しい情報はありますか? 🎜🎜サーバー: 毎月の回線が混雑しています。後でもう一度お試しください (503 サーバーが利用できません) 🎜🎜クライアント:。 。 。 。さて、ラララ、何か新しい情報はありますか? 🎜🎜サーバー: 毎月の回線が混雑しています。後でもう一度お試しください (503 サーバーが利用できません) 🎜🎜クライアント: それから、サーバー側が非常に混雑しています: 冷蔵庫、もっと冷蔵庫が欲しいです!もっと。 。もっと。 。 (私は間違っていました...これはまた冗談です...) 🎜🎜Websocket について話しましょう🎜🎜 上記の例を通して、これら 2 つの方法はどちらも最良の方法ではなく、多くのリソースを必要とすることがわかります。 🎜🎜より高速な速度が必要な場合は、より多くの「電話」が必要です。これらはいずれも「電話」の需要の増加につながります。 🎜🎜ああ、ところで、HTTP は依然としてステートフル プロトコルであることを忘れていました。 🎜🎜平たく言えば、サーバーは毎日あまりにも多くの顧客を受け入れなければならないため、電話を切るとすぐに、彼はあなたのものをすべて忘れ、すべてを捨てます。 2 回目もサーバーに通知する必要があります。 🎜🎜この場合、Websocket が登場しました。彼は HTTP のこれらの問題を解決しました。まず、受動性です。サーバーがプロトコルのアップグレード (HTTP->Websocket) を完了すると、サーバーはクライアントに情報をアクティブにプッシュできるようになります。したがって、上記のシナリオは次のように変更できます。 🎜🎜クライアント: ラララ、Websocket プロトコルを確立したい、必要なサービス: チャット、Websocket プロトコル バージョン: 17 (HTTP リクエスト) 🎜🎜サーバー: OK、確認されました、Websocket プロトコル (HTTP プロトコル スイッチド) にアップグレードされました🎜 🎜クライアント: 情報をお持ちの場合は、私にプッシュしてください。 。 🎜🎜サーバー: わかりました、時々お話します。 🎜🎜サーバー: バラバラバラバラ🎜🎜サーバー: バラバラバラバラ🎜Server side: Hahahahahahahahahahahahahaha
Server side: I'm laughing so hard hahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaha
It becomes like this, only one HTTP request is needed, and a steady stream of information can be transmitted. (プログラミングでは、この種の設計はコールバックと呼ばれます。つまり、私が毎回尋ねるために愚かに実行する代わりに、情報を入手したら通知してください)
このようなプロトコルは、上記の同期の遅延を解決し、また非常に便利ですリソースを消費します。では、なぜ彼はサーバー上のリソースを消費するという問題を解決したのでしょうか?
実際、私たちが使用するプログラムは 2 層のプロキシを通過する必要があります。つまり、HTTP プロトコルが Nginx などのサーバーによって解析され、対応するハンドラー (PHP など) に送信されて処理されます。簡単に言うと、問題を対応する Customer Service (Handler)
に転送する責任を負う非常に高速な Operator (Nginx)
がいます。 接线员(Nginx)
,他负责把问题转交给相应的 客服(Handler)
。
本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
这样就可以解决客服处理速度过慢的问题了。
同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info
(鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了
至于怎么在不支持Websocket的客户端上使用Websocket。。答案是: 不能
但是可以通过上面说的 long poll
和 ajax 轮询
ロング ポーリング
と ajax ポーリング
を通じて同様の効果をシミュレートできます🎜🎜関連する推奨事項: 🎜🎜 🎜Baidu ホームページの HTML 模倣🎜🎜🎜🎜 HTML ページにおけるメタの役割とページのキャッシュと非キャッシュ設定の分析🎜🎜以上がWebsocket の原則についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

インターネット技術の継続的な発展に伴い、リアルタイムビデオストリーミングはインターネット分野における重要なアプリケーションとなっています。リアルタイムのビデオ ストリーミングを実現するための主要なテクノロジには、WebSocket と Java が含まれます。この記事では、WebSocket と Java を使用してリアルタイムのビデオ ストリーミング再生を実装する方法を紹介し、関連するコード例を示します。 1. WebSocket とは WebSocket は、単一の TCP 接続で全二重通信を行うためのプロトコルであり、Web 上で使用されます。

インターネット技術の継続的な発展により、リアルタイム通信は日常生活に欠かせないものになりました。 WebSocket テクノロジーを使用すると、効率的で低遅延のリアルタイム通信を実現できます。また、インターネット分野で最も広く使用されている開発言語の 1 つである PHP も、対応する WebSocket サポートを提供します。この記事では、PHP と WebSocket を使用してリアルタイム通信を実現する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は単一の

golangWebSocket と JSON の組み合わせ: データ送信と解析の実現 現代の Web 開発では、リアルタイムのデータ送信がますます重要になっています。 WebSocket は双方向通信を実現するために使用されるプロトコルで、従来の HTTP リクエスト/レスポンス モデルとは異なり、WebSocket を使用すると、サーバーがクライアントにデータをアクティブにプッシュできます。 JSON (JavaScriptObjectNotation) は、簡潔で読みやすいデータ交換用の軽量形式です。

PHP と WebSocket: リアルタイム データ転送のベスト プラクティス方法 はじめに: Web アプリケーション開発では、リアルタイム データ転送は非常に重要な技術要件です。従来の HTTP プロトコルは要求応答モデルのプロトコルであり、リアルタイムのデータ送信を効果的に実現できません。リアルタイム データ送信のニーズを満たすために、WebSocket プロトコルが登場しました。 WebSocket は、単一の TCP 接続上で全二重通信を行う方法を提供する全二重通信プロトコルです。 Hと比べて

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

Java と WebSocket を使用してリアルタイム株価プッシュを実装する方法 はじめに: インターネットの急速な発展に伴い、リアルタイム株価プッシュは投資家の注目の 1 つとなっています。従来の株式市場のプッシュ方式では、遅延が大きい、更新速度が遅いなどの問題があり、投資家にとって最新の株式市場情報をタイムリーに入手できないことは、投資判断の誤りにつながる可能性があります。 Java と WebSocket に基づくリアルタイムの株価プッシュはこの問題を効果的に解決し、投資家が最新の株価情報をできるだけ早く入手できるようにします。

JavaWebsocket はオンライン ホワイトボード機能をどのように実装しますか?現代のインターネット時代では、人々はリアルタイムのコラボレーションと対話の経験にますます注目しています。オンラインホワイトボードは、Websocketをベースに実装された機能で、複数のユーザーがリアルタイムで共同作業して同じ描画ボードを編集し、描画や注釈などの操作を完了できるようにし、オンライン教育、リモート会議、チームコラボレーション、他のシナリオ。 1. 技術的背景 WebSocket は HTML5 で提供される新しいプロトコルです。
