Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RealTime Web: WebSocket
Search
R.coffee
March 12, 2014
Technology
1
91
RealTime Web: WebSocket
a simple description of WebSocket via Node.js
R.coffee
March 12, 2014
Tweet
Share
Other Decks in Technology
See All in Technology
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
DevOps視点でAWS re:invent2024の新サービス・アプデを振り返ってみた
oshanqq
0
180
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
270
サイバー攻撃を想定したセキュリティガイドライン 策定とASM及びCNAPPの活用方法
syoshie
3
1.3k
どちらを使う?GitHub or Azure DevOps Ver. 24H2
kkamegawa
0
930
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
230
Storage Browser for Amazon S3
miu_crescent
1
250
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
110
オプトインカメラ:UWB測位を応用したオプトイン型のカメラ計測
matthewlujp
0
180
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
270
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
4 Signs Your Business is Dying
shpigford
181
21k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
99
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
The Invisible Side of Design
smashingmag
298
50k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Transcript
RealTime Web OMG! RealTime
Chapter 1 : WebSocket Revolution
RealTime 之路 • HTTP • HTTP ( with Cookies ,
Session )
HTTP Core of the web 在 B/S 的 web 架构模型中,
每次打开一个网页,浏览器都 至少发起一次 HTTP 请求去 从指定网络位置获取资源。
HTTP • 无状态协议: HTTP 协议对于事物处理没有 记忆能力。 • 无状态服务器: HTTP 服务器认为每一请求与
之前任何请求都无关。 • 通常 HTTP 请求是短连接
HTTP 由于这种服务器并不知道客户端是什么状态, 这就需要在每个请求上额外附加一些必要的标识信息, 即客户端的状态信息: + Cookies :用客户端保持状态信息 + Session :用服务器保持状态信息
Client——>Server
Client pull F5 ,泥妹的够了 *_* • Ajax ( client pull
) • JSONP ( cross domain )
Issues 1. But ! 要是我想在网页中一边浏览之前的新闻一边获取最新的消息? 和小伙伴讨论刚刚看到的新鲜事? 或者玩玩网页游戏? 再或者跟机油视频聊天? 若是炒股的想看看实时的股票行情?若是实时刷微博?…… 别想了,光靠一次简单的
HTTP 请求是绝对不够的!! !
Server push (Comet) • 轮询 • 长轮询 • 长连接
蛋疼的历史… 在 HTML5 平台出现之前, 开发人员通常需要使用这些技术来实现服务器推送( push ): “ 轮询”、“长轮询”、“长连接” 也就是说,
要想实现服务器推,全靠 hacking 得来 !
轮询工作: 在 Client 端 用计时器和 XMLHttpRequest 不断 的向 Server 端
发出请 求 。 长轮询—————— >>>
所谓的长连接 也是在 HTML 页面里 添加指向请求地址的 隐藏域 iframe 标签 , 以达到保
持浏览器 & 服务器 的持续连接状态。
Issues 2. • 轮询会产生过多无效的请求 • 长轮询会消耗系统资源,不仅增大 Server 的开销,且很麻烦 • iframe
实现的长连接导致网页永远处于加载状态 • 蛋疼的同源策略
later… 这种状况一直持续到 HTML5 新标准出现。 在新的标准中,可以通过 EventSource 实现服务器推的 comet 技 术,
web 开发者终于不用再费尽心思的 hack 了~
Issues 3. 但是无论怎样,这些所谓的 RealTime 都是单向连接,同一时刻只 能允许设备之间的单向通信。 或者说这些方法实现的通信属于“ half duplex” (半双工)
OMG! WebSocket! 直到这货诞生…… “ 将 TCP 的 Socket 与无状态的 HTTP
协议共同使用, 从而使通信双方建立起一个保持在活动状态的连接通道, 并且通信属于‘ full duplex (全双工)’”。 ————from Wikipedia
设计哲学 • Minimum data • Frame • TCP • NameSpace
• share port with HTTP Server
TCP or HTTP ? WebSocket 是基于 TCP 的独立的协议。 和 HTTP
的唯一关联就是 : HTTP 服务器需要把 WebSocket Client 发出的握手动作升级为 “ Upgrade” 请求并进行解析。 WebSocket 也属于长连接
Advance 不受同源策略限制 更快、更强、更专业,做到了真正的 RealTime 通信 传输数据量最小化
How does it works? Hand shake, first ( Via HTTP
)
Hand Shake 1 客户端请求头 : Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key:
************==
Hand Shake 2 “Sec-WebSocket-Key” 字段 它是个经过 base64 编码的随机字符串,在握手过程中特重要: 当 Server
接收到来自浏览器的“ upgrade” 请求时,便会将请求 中的“ Sec-WebSocket-Key” 字段提取出来,追加一个固定 字符串“ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11” , 同时进行 SHA-1 加密,然后再次经过 base64 编码,生成一个新 的 KEY , 作为响应头中的“ Sec-WebSocket-Accept” 字段的内容返回 给浏览器:
Hand Shake 3 服务器响应头 : HTTP/1.1 101 Switching Protocols Upgrade
: websocket Connnection: Upgrade Sec-WebSocket-Accept: ******
Frame WebSocket 传输的数据都是以 Frame (帧)的形式存在的, 就像 TCP/UDP 协议中的报文段 Segment WebSocket
协议是基于 Frame 而非 Stream 的。 每个 Frame 都定义了严格的数据结构,因此所有的信息就在这个 Frame 载体中。
Frame
Masking key Masking-key (掩码)如果存在,则一定是一个 32bit 的值。 如果消息是从客户端发送到服务器,那么 mask 一定是 1
。 如果是从服务器发送到客户端, mask 为 0 。 作用:当 mask 字段的值为 1 时, payload-data 字段的数据需要 经这个掩码进行解密。
Decode 在一个 WS 通信中,当消息到 WS 达服务器后,服务器程序就开始以 byte 为单位逐步读取这个帧。当读取到 payload-data 时,首先将数
据按 byte 依次与 Masking-key 中的 4 个 byte 按照如下算法做异或运 算: for (i = 0; i < len; i++) { j = i % 4; data[offset + i] ^= masking_key[j]; } // data : Payload-data, len : Payload 字节数 ; // masking_key : 4byte 的 mask 掩码组成的数组 // offset :跳过 Payload-data 之前的字节数
Chapter 2: Let's do it! We'll coding in Node.js~ that's
a very cool thing~
Future 尽管 WebSocket 解决了 web 页面全双工通信的问题,但是一个真 正的 RealTime 互联网远不止于此。 Google
在 2010 年获得了 WebRTC 技术,这是一个允许浏览器之 间进行 P2P 通信的技术集合,利用 WebRTC 可以构建实时音频 视频等多媒体信息通信的应用程序。 不过这并不代表 WebSocket 就没有价值了。
Where & How In Trello In TeamChat BitCoin In BlockChain
V.S.
Principle 没有银弹
after 这个 Slide 已上传至 SpeakerDeck : https://speakerdeck.com/abbshr/realtime-web-websocket-and-node demo 代码在这个 Repo
中: https://github.com/abbshr/websocket_talk 涉及到的解码和编码代码可在 Github Gist 上找到: https://gist.github.com/abbshr/7511731 https://gist.github.com/abbshr/7511762 详细学习 WebSocket ,移歩 http://abbshr.github.io/2013/11/05/new46.html 和 http://abbshr.github.io/2013/11/10/new47.html 了解 Node 底层实现(尚未完工,正在填坑),移歩 https://github.com/abbshr/abbshr.github.io/issues