粘包 拆包(分包) 半包

时间:2017-12-05 18:29:53   收藏:0   阅读:257

粘包、拆包、半包理解

TCP是一种面向流的网络层传输协议,在使用TCP作为传输层协议时,可保证数据的顺序性和可靠性。

应用层在使用TCP协议传输数据时,可采取两种方式:

使用短连接时,可通过TCP连接是否关闭判断是否完成了一次请求响应通信。但每次请求必须重建TCP连接,会导致请求响应一会会存在一个TCP握手延时。因此经常使用长连接进行较高频率的请求响应通信。

但在使用长连接时,由于客户端可能会发送多个请求,服务端会同时持续收到数据。服务端接收到的数据中可能包含多个请求数据,此时请求数据是粘连在一起的(粘包),需要进行拆分(拆包)。

还有一种情况,服务端接收到的数据中包含一个不完整的请求数据,剩余数据还未接收到(半包),服务端需要继续接收数据直到接收完整请求数据。

粘包、拆包、半包图示

技术分享图片

粘包:服务端接收到的请求数据紧紧挨着,暂时无法分离。

 

技术分享图片

拆包:服务端将接收到的数据拆分为不同的请求数据

 

技术分享图片

半包:拆包过程中发现某个请求数据不完整,需要继续接收数据。

如何拆包、判断半包

如何判断不同请求数据的起始和结束位置,是拆包和判断半包的关键。

常用的方法有两种:

第一种方法,读取固定长度的包头后,可根据包头中指定的包体长度读取包体,直到读取到完整的包体。

第二种方法,在持续读取数据时,需要判断读取的数据中是否出现了界定标识,出现了即可判断是否已到旧包的包尾或者新包的包头。包头和包尾至少存在一个。

 

http协议可以说是以上两种方法的结合,http header信息通过第二种方法获取,http response body通过第一种方法获取(content-length)。

 

原文:http://www.cnblogs.com/mahuan2/p/7988530.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!