TCP的粘包问题

  在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的。因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端就难于分辨出来了,必须提供科学的拆包机制。

在这之前得先弄清楚几个概念:保护消息边界和流

   保护消息边界:把数据看成一条独立的消息在网上传输,接收端也只能接收独立的消息;而流则是无保护消息边界的,它可以一次发送多个数据,接受端也能一次接收多个数据,依据缓冲区而定。

   如:有三个数据大小分别为2k,4k,6k,如果是TCP流传输,则只要缓冲区大小为12k以上,就能一次发送完毕,但如果是UDP传输,则要分3次才能传输完成。

一、什么是TCP的粘包问题

   发送端发送的数据包到达接收端时,前一个数据包的尾部和下一个数据包的头部粘在了一起,变成了一包。

二、什么原因造成的

  1、发送方:发送使用了Nagle算法,将多个数据整合在一起发出,就有可能出现粘包

  2、接收方:接收方收到发送方的数据,需要传到应用层处理,应用层没来得及处理,导致缓冲区的数据包粘在了一起

三、所有的粘包都需要处理吗?

   1、如果发送的数据正好是同一文件里数据,那就不需要处理

   2、如果发送的数据没有任何关系,就需要处理

四、如何处理粘包?

  1、发送方:主动选择关闭Nagle算法

  2、接收方:接收方不能处理这个问题,得交给应用层处理

  3、应用层:只要可以在接受时,知道每个数据的长度就可以了

         a. 每条数据的首位加上特殊标记,接收方可以分辨

         b. 发送数据时附带上数据的长度

         c. 发送固定长度的数据

五、具体小栗子

若连续发送两条数据,则有可能接收端会出现下面几种情况:

  A.先接收到data1,然后接收到data2.

  B.先接收到data1的部分数据,然后接收到data1余下的部分以及data2的全部.

  C.先接收到了data1的全部数据和data2的部分数据,然后接收到了data2的余下的数据.

  D.一次性接收到了data1和data2的全部数据.

  通过以上三种情况,显然BCD都不是我们想要的结果,出现了粘包,data1和data2的数据不能完全分离出来

六、UDP会有粘包情况发生吗

  UDP是有保护消息边界的,传递数据时会一个一个传递,所以不会有粘包现象发生。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值