美文网首页C/C++
TCP粘包处理

TCP粘包处理

作者: cx7 | 来源:发表于2018-08-24 09:56 被阅读0次

TCP粘包

TCP发送/接收数据的方式是数据流
recv每次读取的字节 可能包含的数据包数量是不固定的

在发送端 调用send发送数据包会将数据包拷贝到TCP的发送缓冲区中
1. 缓冲区数据满 TCP将会发送缓冲区数据
2. 达到超时时间 TCP将会发送缓冲区数据

这种机制之下 可能有几种数据的发送情况
1. 数据量小于缓冲区限制大小 可能几个数据包一起发送或是单个数据包超时后发送
2. 数据量大于缓冲区限制大小 一个数据包被分割成多个数据包发送

在接收端 调用recv读取缓冲区数据时
ssize_t recv(int socket, void *buffer, size_t length, int flags);
recv需要指定读取的字节数 可能有这些情况
1. 缓冲区数据量比指定读取的字节数少 读取所有数据到缓冲区
2. 缓冲区数据量比指定读取的字节数多 读取部分数据 剩下的需要下一次recv读取

接收端和发送端的情况导致了TCP接收数据时 协议本身并不能保证数据包的独立性
你读取到的可能是单个包或是多个包 也可能是不完整的一个数据包

TCP粘包的处理

1. 定制通信协议:用自定义的起始码和数据长度来区分数据包的界限
    比如 4个字节的0x 00 00 00 01作为数据包的起始 随后4字节说明数据包的长度 再附上数据
    数据包组成: 起始码 + 数据长度 + 数据
2. 定义用户层的缓存buffer 当recv收到TCP数据时 就讲数据append到缓存buffer之后
    用户通过读取起始码和数据长度 从用户层的缓存buffer中获取一个完整的数据包

相关文章

  • TCP粘包处理

    TCP粘包 TCP粘包的处理

  • TCP 粘包处理

    安装 背景 由于 TCP 协议是面向流的协议,我们使用 TCP 通信的时候,需要解析出我们的数据,就需要对流进行解...

  • tcp粘包 go和swoole

    tcp 粘包及处理 go 和swoole tcp粘包形成的原因 tcp在发送和接收时会有个缓存,当短时间内发送大量...

  • NodeJs中TCP粘包、分包解决方案!

    NodeJs中TCP粘包、分包解决方案! 最新更新请查看github项目配置介绍 本类库提供对TCP粘包处理的解决...

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

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

  • TCP粘包、断包处理

    在TCP传输中,当我们使用长连接传输数据时,由于传输频率快、缓冲区不足等问题,经常会产生断包、粘包的问题,本文将基...

  • Socket粘包处理

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

  • TCP粘包

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

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

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

  • Netty 权威指南笔记(三):TCP 粘包和拆包

    Netty 权威指南笔记(三):TCP 粘包和拆包 什么是 TCP 粘包和拆包? TCP 是一个“流”协议,所谓“...

网友评论

    本文标题:TCP粘包处理

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