深入理解websocket传输过程

上一篇已经大概介绍了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:

参考文章:http://www.9upk.com/article/2537.html

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LIN_ZONE

laravel的csrf token 的了解及使用

之前在项目中因为没有弄清楚csrf token的使用,导致发请求的话,一直请求失败,今天就一起来看一下csrf的一些东西。

9012
来自专栏耕耘实录

tcpdump使用小记

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

1113
来自专栏SDNLAB

源码解读ODL与OpenFlow交换机建立过程

编者按:OpenDaylight两大技术特色:1.采用了OSGi框架;2.引入了SAL,而今天我们主要介绍服务抽象层(SAL)适配的南向协议之一OF协议模块。 ...

3644
来自专栏coding

RabbitMQ实战4.发布与订阅交换机临时队列发布与订阅功能实现执行结果流程总结参考文档

RabbitMQ并非直接将消息投递到队列中,而是要经过交换机,交换机再与队列绑定。那么,什么是交换机? 如何通过交换机与队列的绑定实现发布与订阅功能?

902
来自专栏Jerry的SAP技术分享

ABAP Netweaver, Hybris Commerce和SAP 云平台的登录认证

在事务码SICF里选择一个服务,在明细页面对Procedure字段点击F1,查看Logon Procedure的帮助文档。

1893
来自专栏玄魂工作室

Python灰帽编程 3.1 ARP欺骗

ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据监...

3856
来自专栏老安的博客

openstack windows 镜像密码注入的问题

1942
来自专栏Golang语言社区

linux服务器开发三(网络编程) --二

半关闭 当TCP链接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A时,A方处在半链接状态,此时A可以接收...

5857
来自专栏Laoqi's Linux运维专列

再回顾几个内核参数

1335
来自专栏FreeBuf

利用PRET控制远程打印机测试

Pret是用来对打印机安全进行测试的工具。它通过网络或者USB连接到设备,并利用给定打印机的语言进行渗透。目前绝大多数的打印机都是使用PostScript,pj...

1423

扫码关注云+社区