【计算机网络】TCP 粘包/拆包的原因以及解决方法

目录

 

含义

产生的原因?

如何解决?


含义

TCP是个“流”协议,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

具体可能存在下面四种可能:

(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包;

(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;

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

(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包。


产生的原因?

(1)(粘包对于发送方)要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包

(2)(粘包对于接收方)接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包

(3)(拆包对于发送方)要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包

(4)(拆包对于发送方)待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包


如何解决?

因为无论是粘包/拆包,问题都来自于无法区分包的边界,因此解决的方法都是基于此。

【1】消息定长。发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

【2】在每个包头尾设置消息边界,服务端从流中按消息边界分离出消息内容。

【3】将消息分为消息头和消息体,消息头中添加表示消息总长度(或者消息体长度)的字段。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值