TCP 粘包/拆包的原因及解决方法

TCP作为流式协议,可能导致数据包粘合或拆分,引发粘包和半包问题。这种情况源于TCP消息无边界,一次接收可能包含多次发送的数据。UDP则因每个数据包有明确边界而避免此类问题。为解决TCP粘包/半包,通常需要在应用层设定固定报头或分隔符来区分数据包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是粘包和半包?

image.png

假设客户端分别发送了两个数据包ABC和DEF给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4种情况:

1、服务端分两次读取到了两个独立的数据包,分别是ABC和DDEF,没有粘包和拆包;

2、服务端一次接收到了两个数据包,ABC和DEF粘合在一起,被称为TCP粘包;

3、服务端分两次读取到了两个数据包,第一次读取到了完整的ABC包和DEF包的部分内容(ABCD),第二次读取到了DEF包的剩余内容(EF),这被称为TCP拆包;

4、服务端分两次读取到了两个数据包,第一次读取到了ABC包的部分内容(AB),第二次读取到了CD,第三次读到了EF(这种有粘包和半包问题)。

TCP粘包/半包发生的原因

根本原因:TCP 是流式协议,消息无边界。
UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收,所以无粘包、半包问题。

TCP收发
一个发送可能被多次接收,多个发送可能被一次接收。
TCP传输
一个发送可能占用多个传输包,多个发送可能公用一个传输包。

image.png

TCP粘包/半包解决方法

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值