欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

理解 TCP 协议中的粘包与拆包现象详解

最编程 2024-07-19 10:06:24
...

TCP是一个"流"协议,没有边界的一段数据.像打开自来水管一样,连成一片,没有边界.

TCP协议并不了解上层的业务在做什么东西,有什么含义,它会根据自己的缓冲区的实际情况进行数据包的划分.

所以,一个完整的数据包可能会被拆分成多个数据包包进行发送,也有可能将很多个数据包变成一个大的数据包发送.

这就是TCP的粘包和拆包问题.

输入图片说明

假设客户端分别发送两个数据包D1和D2给服务端.由于服务端一次读取到的字节数不确定,可能存在4种情况.

(1)服务端分别接收到 D1 和 D2.没有拆包和粘包.

(2)D1和D2包被一次接收了(粘包)

(3)D1包被一次接收,D2包被分两次接受(拆包)

(4)D1和D2都被拆开,分两次读取完成.

(5)D1和D2被拆分N个,分N次读取完成.

查阅资料后找到了为什么会发生以上的原因:

(1)程序的写入的字节大于发送数据的缓冲区大小(我只看懂了这个)

(2)进行MSS大小的TCP分段

(3)以太网帧的payload大于MTU进行IP分片

2和3表示看不懂啊.

** 通常的解决方案**

TCP是不知道上层的业务数据的.所以在底层无法保证不发生粘包拆包,这个问题只能通过上层应用协议栈的设计来解决.

(1)消息定长,固定大小,不够空格补位(5楼不辅助,你懂的,要学会补位.)

(2)包尾增加回车符,进行分割

(3)将消息分为消息头和消息体,消息头里来标识消息总长度.

推荐阅读