首页 > 其他分享 >TCP粘包拆包、原因及其解决方式

TCP粘包拆包、原因及其解决方式

时间:2023-01-22 12:44:25浏览次数:32  
标签:UDP MSS TCP 粘包 发送 拆包

问题表现

TCP是一个流协议,其字节流没有明确的分界线。TCP底层并不了解上层数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

img
  • 正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
  • 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
  • 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
  • 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。

TCP协议是面向流的协议,UDP是面向消息的协议

UDP没有粘包拆包问题,因为UDP有消息保护边界。在每个UDP包都有消息头,对于接收端应用程序相当好区分。UDP每一段都是一条消息,应用程序必须以消息为单位提取数据。

UDP消息头包括UDP长度、源端口、目的端口、校验和。

TCP粘包/拆包发生的原因

  • 应用程序的一次请求发送的数据量(滑动窗口/Nagle算法)
    • 比较小,TCP会把多个请求合并为一个请求发送,导致粘包
    • 比较大,超过缓冲区大小/MTU/MSS,TCP会将其拆分为多次发送,导致拆包
  • MTU/MSS限制
    • Maximum Segment Size,最大报文长度;Maximum Transmission Unit,最大传输单元
    • 传输的数据大于MSS/MTU时,数据会被拆成多个包进行传输。由于MTU由MSS计算出,若满足MTU,则满足MSS(MSS长度=MTU长度-IP Header-TCP Header)
在这里插入图片描述

解决策略

  • 首先TCP作为面向流的协议,没有消息保护边界,其字节流本身就没有明确的分界线,需要在接收端处理消息边界问题。
  • 粘包/拆包和TCP没啥关系,是应用层没处理好数据包的分割,比如应用层的两个数据包粘一块了,因此粘包拆包应该由业务层处理。

解决思路:编码解码,应用层通过指定收发两端共同的约定,发送方按照特定的规则组装数据,接收方按照同样的规则拆解数据。发送方组装数据的过程称之为编码;接收方拆解数据的过程称之为解码。

  1. 长度编码:将消息分为消息头和消息体,消息头中包含消息的长度
  2. 特殊字符分隔消息
  3. 定长协议:发送端将数据包封装为固定长度(不够的补0),接收端每次从接收缓冲区中读取固定长度的数据就把每个数据包拆分开来。

标签:UDP,MSS,TCP,粘包,发送,拆包
From: https://www.cnblogs.com/iterationjia/p/17064360.html

相关文章

  • 网络分层 & http & tcp or udp
    ......
  • TCP可靠传输
    2TCP可靠传输目录2TCP可靠传输TCP的精髓:滑动窗口协议1.滑动窗口协议(依据接收方返回的ack拓展滑动窗口)2.流量控制(防止丢包):3.传递效率防止链路加塞的精髓:拥塞控制可......
  • 计算机网络原理(TCP/IP协议七):防火墙和网络地址转换
    防火墙网络地址转换NAT穿越配置包过滤防火墙和NATIPv4/IPv6共存和过渡中的NAT与防火墙和NAT相关的攻击 一、防火墙常用的两种防火墙:代理防火墙(proxyfirewall)......
  • 一台服务器最大能支持多少条TCP连接 转载
    一、一台服务器最大能打开的文件数1、限制参数我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是:fs......
  • 工控小工具 snmp 、opc ua 、modbus 、tcp、bacnet 开发环境Net6.0
    下载地址https://files.cnblogs.com/files/blogs/745639/net6.0-windows.rar?t=1674114312             ......
  • 一台服务器最大能支持多少条TCP连接
    一、一台服务器最大能打开的文件数1、限制参数我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是:fs......
  • tcpdump
    一.网址参考1. 抓包神器:tcpdump!我还真没用过2. Linuxtcpdump命令详解3. Tcpdump命令参数详解......
  • TCP 队列
    一、TCP队列1、synsqueue:半连接队列TCP三次握手(参考:TCP建立连接之三次握手),第一步,服务端接收到客户端发送的syn消息后,将连接信息放入synsqueue,此时,双方连接尚未建......
  • 网络分层,网络协议TCP/IP模型,OSI模型
    TCP\IP模型是多种协议的综合,4层模型(也有说5层的)。其中最重要的就是分层结构和主要协议。1.应用层(SMTP,HTTP,FTP)2.传输层(TCP,UDP)3.网络互联层(IPv4,IPv6)4.网络接口层(链路层)应......
  • ubuntu移植Tcpdump到Android平台
    方式一。手动编译参考这里https://www.jianshu.com/p/aca8345dc7fb注意要将文件复制到Ubuntu系统里的目录,不要用挂载目录执行。方式二。搜索androidtcpdumpbinary......