websocket / 使用 wireshark 分析 websocket 连接过程

一、连接过程时序图

在这里插入图片描述

二、wireshark 分析

上图是一个完整的进行 websocket 连接时产生的数据包。

根据时序图可知,前 3 行是 tcp/ip 握手过程,因为可以通过标志来看到,前 3 个标志(Flags)分别为 SYN、SYN ACK、ACK。这是建立 http 请求的需要,和 websocket 没有关系。


第 4 条就是 client 主动发给 server 的握手协议了,如下图所示:

细心的小伙伴可以发现,这套代码是基于 C++ 版的 websocketpp 实现的,大家可以参考下。

大家可以发现,websocket 的握手协议实际上是基于 http 协议实现的,client 告诉 server,我要升级为 websocket 了,不使用老土的 http 了。实现的方法就是 “Connection” 和 “Upgrade” 这两个字段,

我要升级(Connection : upgrade),

升级为 websocket (Upgrade : websocket),

websocket 的版本得是 v13 的!(Sec-WebSocket-Version 13)。


第 5 条是 server 回复 client 的协议了。

状态为 101,意味着协议切换成功。

这里 Sec-WebSocket-Accept 和 Sec-WebSocket-Key 是配套的,主要作用在于提供基础的防护,减少恶意连接、意外连接。

Sec-WebSocket-Accept 的计算方法是:

计算公式为:

将 Sec-WebSocket-Key 跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。

通过 SHA1 计算出摘要,并转成 base64 字符串。

伪代码如下:

toBase64( sha1( Sec-WebSocket-Key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 )  )

 

参考链接:

https://blog.csdn.net/henryhu712/article/details/85090194

https://blog.csdn.net/libaineu2004/article/details/82774638

 

(SAW:Game Over!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章