文章目录
- UDP
- TCP
- 什么是沾包拆包
- (1)正常接收
- (2)只收到一个数据包(全部沾包了)
- (3)服务端收到了两个数据包(部分沾包)
- 为什么发送沾包、拆包
- 解决办法
UDP
UDP是基于数据包协议,UDP首部采用16bit指示UDP数据报文长度。因此接收端可以利用长度信息明确将不同的数据包区分开,从而避免沾包和拆包问题
TCP_9">TCP
TCP是面向字节流的
- 应用层和传输层的数据交互是大小不等的数据块
TCP没有将这些数据块区分边界,仅仅是一连串没有结构的数据流
- TCP帧结构中,首部没有表示数据长度的字段
基于以上原因才产生了TCP沾包和拆包问题
什么是沾包拆包
假设客户端向服务端发送两个数据包(packet1、packet2),那么服务端在接收时存在三种情况
(1)正常接收
(2)只收到一个数据包(全部沾包了)
由于接收端不清楚这两个数据包的界限,所以不知道如何处理
(3)服务端收到了两个数据包(部分沾包)
一个不完整、一个多了一块
为什么发送沾包、拆包
沾包和拆包的本质上服务端难以界限接收的数据包
拆包:
- 要发生的数据 > TCP发送缓冲区的大小
- 待发送数据
沾包:
- 要发生的数据 < TCP发送缓冲区大小
- 接收端应用层长时间没有读取接收缓冲区内的数据
解决办法
由于TCP是面向字节流的,无法理解上层的业务逻辑(它也不知道哪些是属于同一数据包的),所以在底层是无法保证数据包不被拆分和重组的,只能通过上层的应用协议栈设置解决
- 消息定长
既然难以界限,那就和UDP意义设置固定长度(不够补0)
- 消息边界
在包尾设置换行符等对数据包边界进行定义(例:FTP)
- 将消息分为消息头和消息体
消息头包含总长度
总的来说就是要让接收端可以对数据包进行区分