【TCP粘包】的学习心得

最近在学习计算机网络中,TCP的粘包拆包问题。

核心的几个要点是:

1、TCP是一个面向流的传输协议,流是什么呢?就是跟流水一样,是没办法一段一段的给他区分开的,那么就会有数据,被分开,或者被合并再一次的情况

假设我们要发送数据A和数据B ,会发生这样子的情况:

  1. 数据A和数据B分别当做2个包,分别传输给了对方去了,这种是十分理想的,也不需要有任何的拆包等动作
  2. 数据A被分割成了数据A1和A2,然后先发送了A1,然后A2,再是B,那么现在就出现了拆包的动作了,接收端是要自己去处理的
  3. 数据A被分割成了数据A1和A2,然后A1发了,A2和B是一起发出去的,那么就出现了粘包的动作,接收端是要自己去处理的

在理解了这些的意思之后,我们自然就会想到,出现拆包和出现粘包的原因是什么?怎么去防止出现

  1. 一个通信是由双方来共同完成的,发送方会有自己的发送缓冲区,接收方也有自己的发送缓冲区
  • 发送方的角度:
    如果发送缓冲区大于多个待发送数据的大小,那么多个包就会挤在一起然后才会被发送出去,这就出现了粘包
    如果发送缓冲区小于1个待发送数据的大小,那么 待发送数据就会被切割,然后分成多次,进行发送,就会出现拆包
  • 接收端角度:
    如果接收端没有及时的从TCP缓冲区中读取数据,那么多个数据到来了,就会产生粘包

其实,我之前就在思考的一个问题是
这TM不就是TCP的缺陷吗?为什么要放在这里讲,然后要其他去解决呢?明明TCP就只是个搬运工,他才不管你的东西是啥,他只管搬就是了,反正最好你送了什么,他就给你什么
没错,我一开始带着这个疑惑看了很多资料,发现,确实也就是这样

1、这个拆包粘包问题,是天生的,就是TCP本身的缺陷
2、要解决拆包问题,还是得交给应用层上层有特定的协议去解决

怎么解决呢?

1、产生这个问题还有个原因就是,TCP本身,是没有给数据包的首部字段,增加数据包的长度的,那就上去不就好了吗?
2、规定每个数据包的发送大小,让大家都发送同样的长度,然后不足的用0来补充到足够的长度,这样接收方就能够按照这个长度,去读取相应的数据了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值