![46ccae85200a01a2d63129554916658e.png](https://i-blog.csdnimg.cn/blog_migrate/d29af8be0658341dce6fa571d69370fc.png)
在了解网络的通信模型之后,直接看协议,或者TCP/IP源码,很难有直观的感受。
需要抓取真实数据进行分析,便于理解。这里以wireshark工具为例,抓取websocket协议来进行分析,主要包含websocket以及TCP的三次握手。
1 wireshark
wireshark的官方下载网站:下载
![a15cd7d03aae1330547acd2825a38852.png](https://i-blog.csdnimg.cn/blog_migrate/bb72c3f9eb0a02e46e480cf914c4f8c3.jpeg)
wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。
也是开源软件,在github上有源码,想详细了解内部原理的,可以clone下来读一读。
关于具体的使用,可以看官方文档
这里只用到选择 以太网卡,以及过滤ip的简单功能。
2 websocket帧格式
WebSocket客户端、服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消息(message)。
- 发送端:将消息切割成多个帧,并发送给服务端;
- 接收端:接收消息帧,并将关联的帧重新组装成完整的消息;
先来看下WebSocket的数据帧格式。数据帧的格式。详细定义可参考 RFC6455 5.2节 。
![3259b44ed5eb9f26cd17a93162ba4549.png](https://i-blog.csdnimg.cn/blog_migrate/4713486552a303ad4a54004839cfe753.jpeg)
其中FIN 表示当前帧是否为消息的最后一帧。
操作码Opcode的值决定了应该如何解析后续的数据载荷(data payload)。可选的操作代码如下:
- %x0:表示一个延续帧。当Opcode为0时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片。
- %x1:表示这是一个文本帧(frame)
- %x2:表示这是一个二进制帧(frame)
- %x3-7:保留的操作代码,用于后续定义的非控制帧。
- %x8:表示连接断开。
- %x9:表示这是一个ping操作。
- %xA:表示这是一个pong操作。
- %xB-F:保留的操作代码,用于后续定义的控制帧。
其他的具体可以参考RFC6455。
3 建立连接
可以查看我另一篇文章:websocket通信
4 wireshark抓取实时数据
步骤:
- wireshark 开始捕获
2. 浏览器打开html
3. 通信10秒钟
4. 关闭浏览器
实时数据:(约定 A主机为192.168.10.200; B主机为192.168.10.30 )
![9cdae04f04ba4b79e63f7cae75a3f895.png](https://i-blog.csdnimg.cn/blog_migrate/07710536d6bec02b2f2954d2e563947a.jpeg)
可以看到,1-3就是TCP的三次握手:ACK = Seq + 1
1:A发送 SYN Seq=0
2:B应答ACK=1 并发送 SYN Seq=0
3:A应答ACK=1 并发送 SYN Seq=1
握手成功,建立连接。
第4条为A发送的HTTP协议:
connection: upgrade.表示需要升级协议
upgrade:websocket.表示升级至websocket协议
![6af0aec79fbe11a47fa18812308267ad.png](https://i-blog.csdnimg.cn/blog_migrate/8e8f44ac1ab25c6e6fb11e317fb286e2.jpeg)
第5条为B主机的ACK应答
第6条为B主机发送的HTTP协议:
表示B主机同意升级为websocket协议,且升级成功。
![1449fa46a5924d86185bd08e4cf50e96.png](https://i-blog.csdnimg.cn/blog_migrate/097dd661de10bc2c81f3d7f8692bbf82.jpeg)
第7条为A主机的ACK应答
第8条为B主机发送的准备发送数据请求:
PSH为推的意思PUSH,表示准备传送数据
第9条为A主机的ACK应答
第10条为B主机发送的websocket协议:
分析:
对照websocket帧格式,可以明显的看到:
当前帧中的FIN为1,表示当前帧为消息的最后一个
操作码为2,表示当前帧为二进制
无掩码
数据长度为84字节
这里注意的是,数据data是用户自定义的数据格式。
![1c606968c2bafa7d0c94bcf958ed0ba9.png](https://i-blog.csdnimg.cn/blog_migrate/79eaf5decdeca7dbfb1c86732e1c95c4.jpeg)