上一篇已经大概介绍了websocket是基于tcp传输的上层协议,且握手方式借用了http的过程,这个过程我们通过一个强大的网络抓包工具wireshark来看个究竟吧。
打开wireshark,过滤器写websocket协议进行过滤,选一个包进行TCP流追踪
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图:
具体我们来分析一下这几个包都干了什么:
①先来看一个老图——TCP报文格式及握手过程O(∩_∩)O:
可见第一步(前三个包)是TCP协议的三次握手过程,详细报文信息可以点击封包详细信息进行查看,这里不再具体说明了:
报文格式对应说明:
②第四个包是HTTP协议,查看封包详细信息,标明请求升级为websocket协议:
ps:wireshark封包详细信息中与OSI七层模型的对应关系如下:
③第五个包继续是TCP协议,从ip可以看出事服务器发送给客户端的,ACK表示确认包收到了(过程中不间断有ACK回包进行确认),然后第六个HTPP协议包将HTTP转为ws协议:
打开第六个包的封包详细信息,如下:
④后面的封包已经转为ws协议,使用ws协议进行数据传输,查看详细信息:
ps:封包里面带了MASKED的都需要通过Masking-Key进行解迷后,Line-based text data才会能明文展示,否则展示如上图是乱码。比如第九个封包Mask:False,则可直接看到传输的数据内容:
PS:观察股指游戏的ws数据传输,会有类似客户端只传1,然后服务器回包2,为发送的心跳信息,来保证对方还存活。
①客户端发起一个TCP Close(这里是关闭浏览器,也可以是服务端想客户端发起close)
一旦发送或接收到一个Close控制帧,这就是说,_WebSocket 关闭阶段握手已启动_,且WebSocket连接处于CLOSING状态,一个Close控制帧可以包含一个表示关闭原因的状态码。比如1000表示正常关闭。具体错误码意思参考文章:
http://www.cnblogs.com/micro-chen/p/6046354.html
需要注意下这几个包ACK的包表示服务器收到了客户端请求的回包,为什么有三个TCP回包且长度一样?查了一下TCP segement of a reassembled PDU的打印意思,大概知道其实是主机响应一个查询或者命令时如果要回应很多数据(信息)而这些数据超出了TCP的最大MSS时,主机会通过发送多个数据包来传送 这些数据(注意:这些包并未被分片)。对wireshark来说这些对相应同一个查询命令的数据包被标记了“TCP segment of a reassembled PDU”,这不影响我们对关闭过程的学习和了解。
最后四步,是TCP的四次挥手协议,可以再看一个老图O(∩_∩)O:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。