粘包拆包现象的原因及解决办法

TCP为什么会出现粘包拆包?

总的来说,TCP是基于字节流的传输协议,接收方没有办法区分一个数据报的边界,无法一次读取一个数据报,具体来说可能有以下原因:

  1. 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
  2. 待发送数据大于MSS(最大报文长度),TCP在传输前将进行分片,且在接收方没办法进行重组;
  3. 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
  4. 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;

如何解决TCP粘包拆包?

总的来说解决问题的思路就是给每个数据包添加边界,使得接收方可以根据边界来划分一个一个的数据报,具体来说:

  1. 在每个数据包的结尾添加特殊字符(如回车换行符)来充当边界,当接收方收到该字符后就认为接收到了一个完整的数据包,然后交付给上层,否则继续等待接收;
  2. 约定每个数据包的固定长度,发送的数据包如果长度不够则用0补齐;
  3. 自定义上层协议,在该协议中用一个字段来指明数据包的长度,接收方收到指定长度的数据后才认为接收到了完整数据;

UDP为什么不会粘包拆包?

UDP没有粘包拆包问题,因为UDP是基于数据报的传输协议,每个数据报有明确的边界。具体来说,UDP并不会像TCP那样根据MSS来对上层传来的数据进行分片,所以UDP每次向下层传递一整个数据报,而具体的分片工作由IP来完成。在接收方,IP对数据包进行重组后传递给上层的UDP,所以每次UDP都可以从IP层拿到一个完整的数据报。并且UDP首部中有一个总长度字段(TCP首部没有),所以在上层读取时,可以根据这个字段的大小来确定读取的长度,将这一个完整的数据报传递给上层(上层每次可以读取到一个完整的数据报,不多不少),所以没有粘包拆包现象。

IP有没有粘包拆包现象

没有,对于IP来说,如果上层传递给它的数据的长度大于MTU,它会进行分片,但是在切分之后每个IP数据报的首部会被填充上3各字段,标识:用来检查是否为同一数据报的片;标志:表明是否为最后一片;片偏移:用来检查是否发生片丢失、表明片在数据包中的顺序。根据这3个字段,接收方就可以对接收到的数据报进行重新组装,得到完整的数据报,然后交付给上层。所以,对于IP来说,在发送方传输层传递给IP一个数据报,接收方的IP就可以传递给传输层一个一样的数据报,故没有粘包拆包现象。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值