首页 > 试题广场 >

什么是TCP粘包拆包?为什么会出现粘包拆包?如何在应用层面解

[问答题]
什么是TCP粘包拆包?为什么会出现粘包拆包?如何在应用层面解决此问题?

如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。

1、TCP是基于字节流的,虽然应用层和传输层之间的数据交互是大小不等的数据块,但是TCP把这些数据块仅仅看成一连串无结构的字节流,没有边界;

2、在TCP的首部没有表示数据长度的字段,基于上面两点,在使用TCP传输数据时,才有粘包或者拆包现象发生的可能。
解决
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。


发表于 2021-02-23 17:05:22 回复(0)
TCP是流式传输协议,数据传输时候没有边界,就如同在Linux下进行socket网络通信编程时,创建套接字使用函数socket()时候,有一个参数我们选用流式传输时候,系统就会默认是TCP协议。
而流式传时,因为数据之间是没有边界的,所以会出现粘包现象。
发表于 2021-12-25 20:50:21 回复(0)
TCP是面向字节流的传输层协议,他可能会组合或者拆分应用层协议的数据 应用层协议没有定义消息的边界,导致数据接收方无法拼接解析数据 因此要解决tcp粘包拆包,需要在应用层定义数据的边界,使用基于长度(如http协议使用的)或终止符的规则,或特定符号(如json)
发表于 2021-02-22 10:40:28 回复(0)