美文网首页C++ 面经
tcp通信中的粘包问题

tcp通信中的粘包问题

作者: 乔大叶_803e | 来源:发表于2020-04-10 15:27 被阅读0次

背景描述:

在采用TCP进行网络通信的软件普遍存在粘包的现象。这主要是现代网络的传输机制造成的。我们知道,网络通信采用套接字技术,其实现实际是由系统内核提供一片连续缓存(流缓冲)来实现应用层程序与网卡接口之间的中转功能。多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使数据包的边界发生错位,导致读出错误的数据分包,进而曲解原始数据含义。

粘包的概念

粘包问题的本质就是数据读取边界错误所致,通过下图可以形象地理解其现象。

粘包

如图1所示,当前的socket缓存中已经有6个数据分组到达,其大小如图中数字。而应用程序在对数据进行收取时(如图2),采用了300字节的要求去读取,则会误将pkg1和pkg2一起收走当做一个包来处理。而实际上,很可能pkg1是一个文本文件的内容,而pkg2则可能是一个音频内容,这风马牛不相及的两个数据包却被揉进一个包进行处理,显然有失妥当。严重时可能因为丢了pkg2而导致软件陷入异常分支产生乌龙事件。


回避设计方式:

在进行数据发送时采用固定长度的设计,也就是无论多大数据发送都分包为固定长度(为便于描述,此处定长为记为LEN),也就是发送端在发送数据时都以LEN为长度进行分包。这样接收方都以固定的LEN进行接收,如此一来发送和接收就能一一对应了。分包的时候不一定能完整的恰好分成多个完整的LEN的包,最后一个包一般都会小于LEN,这时候最后一个包可以在不足的部分填充空白字节。

综上,此方案适在发送数据包长度较为稳定(趋于某一固定值)的情况下有较好的效果。

相关文章

  • tcp通信中的粘包问题

    背景描述: 在采用TCP进行网络通信的软件普遍存在粘包的现象。这主要是现代网络的传输机制造成的。我们知道,网络通信...

  • TCP粘包处理

    TCP粘包 TCP粘包的处理

  • JAVA-每日一面 2022-01-25

    什么是 TCP 粘包/拆包以及TCP 粘包/拆包的解决办法 TCP 粘包/拆包1、要发送的数据大于 TCP 发送缓...

  • golang 解决 TCP 粘包问题

    什么是 TCP 粘包问题以及为什么会产生 TCP 粘包,本文不加讨论。本文使用 golang 的 bufio.Sc...

  • tcp 粘包的问题

    tcp服务是一个流数据的双工服务,tcp client 端会源源不断的把二进制字节流发发给服务端.假设有下面一个这...

  • 消息粘包 和 消息不完整 问题

    消息粘包 和 消息不完整 问题 消息粘包 和 消息不完整问题 其实都是应用层会带来的问题,和TCP 没关系,TCP...

  • Socket粘包处理

    什么是粘包 TCP有粘包现象,而UDP不会出现粘包。 TCP(Transport Control Protocol...

  • TCP粘包

    什么是TCP粘包问题 多个TCP包粘在一个成为一个包,服务端处理接收的TCP包时,需要考虑拆包问题。 产生原因 发...

  • day32-粘包问题和报头的定制

    粘包问题 TCP协议作为流式协议,只有TCP协议存在粘包问题。 发送端可以是一K一K地发送数据,而接收端的应用程序...

  • TCP协议下的粘包与拆包,如何解决

    TCP协议下的粘包与拆包,如何解决 TCP协议下的粘包与拆包,如何解决一、粘包、拆包1.1 粘包原因1.1.1 滑...

网友评论

    本文标题:tcp通信中的粘包问题

    本文链接:https://www.haomeiwen.com/subject/vcmrmhtx.html