tcp粘包浅析

62 篇文章 54 订阅
28 篇文章 2 订阅

1、什么是粘包
从接收缓冲区看,后一包的数据的头部紧接着前一包数据的尾部,使得接收方不能准确的读取一包数据,也就是接收方多读或少读一包数据所造成的现象就是粘包现象。
粘包只会在TCP的长连接时才可能发生,因为TCP是面向字节流的,以流的方式处理数据,当长连接时才可能有多个数据包粘在一起的情况。UDP是面向数据包的,有固定的消息边界。

2、为什么会有粘包
粘包既可能是发送方需要等待缓冲区满了之后才发送方数据造成粘包。也可能是接受方来不及接受缓冲区的包,造成多个包一起接收的现象。
发送方造成的粘包:
粘包是由TCP协议本身造成的,TCP协议为了提高传输效率,发送方往往要收集足够多的数据后才发送出去,若是连续几次发送的数据都很少,通常TCP会根据算法把这些数据合成一包然后发送出去,这样接收方就出现粘包。
接收方引起的粘包:
接收方会把发送方的数据先放在缓冲区中,应用程序再从该缓冲区中取数据,若是下一包数据到达时前一包数据没有被应用取走,则下一包数据就粘在前一包数据的尾部。应用程序根据预先设定的缓冲区的大小从系统接收缓冲区中取数据,这样就一次提取到多包数据。

3、怎样避免粘包
我们先来分析一下,http协议中 避免粘包的三种方式:
1、使用回车换行符作为分隔,也就是以空行作为消息报头的结束。
2、以固定的方式读取消息报头,http消息报头中每一行都是一个完整内容。
3、给出数据包的大小,按照大小读取。http的消息报头中有一个Content-Length字段标记了消息正文的大小。

所以根据http协议,我们至少有三种方式来避免粘包:
1、添加分隔符,来标识每一包数据的起始和结束。
2、发送方将数据结构化,接受方按照结构读取。
3、发送方在发送的时候,在首部加上数据包的大小,接受方在接受的时候先解析出大小,再按照大小读取数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值