TCP粘包问题?如何解决?

  • 什么是TCP粘包问题?

    • TCP粘包就是指发送方将若干数据包一起发送,到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾;
  • 粘包的原因

    出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

    • 发送端:

      TCP协议默认使用Nagle算法(通过合并数据,从而减少发送数量来提升TCP/IP传输效率),Nagle算法主要做两件事情:

      1. 只有上一个发送的分组得到确认,才会发送下一个分组;
      2. 收集多个小分组,在一个确认到来时一起发送

      这样会导致接收方难以分辨原来数据包,故Nagle算法可能会导致发送方出现粘包问题。

    • 接收端:

      TCP接收到数据包时,并不会马上交到应用层进行处理,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包,导致出现粘包问题。

  • 什么时候需要处理粘包现象?

    如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时不需要处理粘包现象;但如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象。

  • 如何处理粘包现象?

    • 发送端:

      通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。

    • 接收端:

      接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。

      应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。

      解决办法:

      格式化数据(分隔符):为数据包加上开始符和结束符,那么应用程序读取时就能区分出每个数据包的开始和结束。
      发送长度:附带数据包长度发送是指在数据包头部定义出数据包的长度,那么程序在读取时,会按照长度读取对应字节数据,保证读取的是单个包,且数据完整,这样就能保证数据包是单个且完整。

  • UDP会有粘包问题吗?

    UDP不存在粘包问题,因为基于UDP连接的接收方每次只接收一条独立的数据包,而TCP协议有粘包问题是因为TCP可以将多个数据包一起发送并接收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值