TCP粘包拆包问题解决之道

文章目录

    • 1. TCP粘包/拆包问题
    • 2. TCP粘包/拆包发生的原因
    • 3. TCP粘包解决策略

1. TCP粘包/拆包问题

在这里插入图片描述
假设客户端分别发送了两个数据包D1和D2,由于服务端一次读取到的字节数是不确定的,故存在以下四种情况。

  • 服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有发生粘包和拆包。
  • 服务端一次接收到了两个数据包,D1和D2粘在一起,被称为TCP粘包。
  • 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包
  • 服务端分两次读取到了两个数据包,第一次读取到了D1包的内容D1_1,第二次读取到了D1包的包的剩余内容D1_2和D2的整包。

如果此时服务端的TCP的接受滑窗非常小,而数据包D1和D2比较大,很有可能会发生第五种可能,即服务端分多次才能将D1和D2包的接收完全,期间发生多次拆包。

2. TCP粘包/拆包发生的原因

主要有三种原因:

  • 应用程序write写入的字节大小大于套接字接口的发生缓冲区大小
  • 进行MSS大小的TCP分段
  • 以太网帧的payload大于MTU进行了IP分片

在这里插入图片描述

3. TCP粘包解决策略

由于地层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界主流的协议的解决方案可以归纳如下:

  • 消息定长,例如每个报文固定长度200字节,如果不够,空位补空格
  • 在包尾添加回车换行符进行分割,例如FTP协议
  • 将消息分为消息头和消息体,消息头中包含表示消息总长度的字段
  • 更复杂的应用层协议

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/669695.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金三银四面试题(二十五):策略模式知多少?

什么是策略模式 策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装到一个独立的类中,使它们可以互换。策略模式让算法的变化独立于使用它们的客户端,使得客户端可以根据…

【ACM出版】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议(ICCIR 2024) 2024 4th International Conference on Control and Intelligent Robotics 2024年6月21日-23日 | 中国-广州 官网:www.ic-cir.org EI、Scopus双检索 投稿免费参会、口头汇报及海报展示 四…

【数据库】MySQL安装与卸载

文章目录 [toc]MySQL下载网盘链接下载网址 MySQL安装解压生成data文件安装MySQL启动MySQL服务 MySQL登录设置root用户密码 环境变量配置MySQL卸载 个人主页:丷从心 系列专栏:MySQL 学习指南:数据库 MySQL下载 网盘链接 链接:h…

7-35 有理数均值

题目链接&#xff1a;7-35 有理数均值 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <iostream> using namespace std;// 计算公约数 int calGcd(int a, int b) {int gcd;bool negative false;if (a a / b * b) { // b整除areturn b;}…

C++(程序的内存分区)

程序的内存分区模型 C程序在执行时&#xff0c;将内存划分为4个区域 1.代码区&#xff1a;存放函数的二进制代码&#xff0c;由操作系统进行管理 2.全局区&#xff1a;存放全局变量和静态变量以及常量 3.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…

通过Nginx转发admin连接licloud-api-develop接口

1.需求配置 在本地环境部署一套开发环境&#xff0c;方便开发金磊调试功能 所使用到的服务有nginx&#xff0c;mysql&#xff0c;rabbitmq&#xff0c;redis&#xff0c;docker 服务安装网上都有教程这里就不一一列举出来了&#xff0c;服务都配置好之后 开始组建开发环境 2…

图像处理(二)

图像处理&#xff08;2&#xff09; 裁剪图片 from skimage import io,dataiimg io.imread(rD:\工坊\图像处理\十个勤天2.png)roiiimg[50:150,120:200,:]io.imshow(roi) 运行结果&#xff1a; 将图片进行二值化 from skimage import io,data,colorimg io.imread(r"…

数据分析:转录本ID和基因ID转换

前言 在使用kallisto等基于cDNA数据库注释软件时&#xff0c;获得的gene expression matrix的gene id是transcript id。后续在做数据分析时&#xff0c;需要将其转换成gene symbol。以下介绍两种转换方法。 第一种方法 在GitHub上有人开发了可以做该种转换的R包&#xff0c;…

启航新篇,量算未来 | 量子计算创新论坛成功举办!

4月28日下午&#xff0c;在2024中国移动算力网络大会——未来启航•量子计算创新论坛在苏州金鸡湖国际会议中心举办。本次论坛以“创新求发展&#xff0c;合作赢未来”为主题&#xff0c;旨在汇聚行业前沿思想&#xff0c;共谋创新发展大计&#xff0c;共同推动我国量子计算产业…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具&#xff0c;用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输&#xff0c;并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…

sql编写规范(word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。