【计网笔记】一起重温计网咯 | TCP协议的粘包/拆包问题

vector_search_node.py 立即下载

一起重温计网咯 | TCP协议的粘包/拆包问题


如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里

  • 前提概要
    • MTU,MSS
    • IP分片和TCP分段
    • TCP缓冲区
  • TCP粘包/拆包
    • 什么是粘包/拆包问题?
    • 为什么会产生粘包/拆包问题?
    • 粘包/拆包的解决方案

前提概要


MTU,MSS

在学习IP分片和TCP分段之前,我们先来学习一下MTU和MSS的概念

  • MTU
    Maxitum Transmission Unit 最大传输单元。 MTU典型的应用就是在IP分片中,MTU其实是数据链路层的最大传输单元,使用了不同的数据链路层,也会导致不同的MTU, 我们最常见的以太网数据链路方式的MTU是1500b
  • MSS
    Maxitum Segment Size 最大分段大小。 一般情况下,只有TCP类似协议才用的上MSS, TCP在传输大量数据的时候,只要数据大于MSS大小,就会进行TCP数据段的分段传输。MSS是传输层TCP连接一次可以发送的最大数据大小。
    在这里插入图片描述

MTU和MSS的关系:

  • MTU和MSS的关系一般如上图,我们数据链路层以以太网数据帧举例,以太网帧大小一般为1518b
  • MTU = 以太网帧 - 以太网帧首 - 以太网帧尾 = 1500b
  • MSS = MTU - IP首部 - TCP首部 = 1460b

IP分片和TCP分段

什么是IP分片?

  • 网络层就会涉及到IP分片(Fragment)的问题。一个IP数据报在以太网中传输,如果它的长度大于以太网帧的MTU,就要将数据进行分片,使得每片数据报的长度小于MTU,分批传输。
  • 分片传输的IP报因为各种原因是不一定按序到达的,既目的机器乱序接收,也由目的机器按序重组。因为IP首部中的 “片偏移” 字段可以判断一个IP数据报是否分片以及当前分片属于整个数据报的起始,中间还是末尾位置。
    在这里插入图片描述
    上图来源于网络

什么是TCP分段?

  • 我们知道TCP是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。TCP Header中有个Options标识位,常见的标识为MSS,用于记录TCP段的最大分段大小,在以太网中,因为MTU一般为1500比特, 所以MSS = MTU - IP Header - TCP Header ,也就是1460比特
  • TCP在传送大量数据的时候,如果数据量大于MSS,那么数据段就会被分割成MSS大小进行传输。MSS是在三次握手的时候,在两端主机之间被计算得出的。两端的主机在发出建立连接的请求时,会在TCP首部写入MSS选项,告诉对方自己的接口能够适应MSS的大小。然后在两者之间选择一个较小值作为通讯双方的MSS
    在这里插入图片描述
    上图来源于网络

因为TCP协议中存在TCP分段的设计,所以从传输层到网络层的过程中,因为数据包是不可能超过MSS的长度,而MSS正常来说肯定是小于MTU的长度。所以,我们可以判断TCP协议基本上是不会发生IP分片,IP分片是相对UDP协议,ICMP等协议而言的。


TCP缓冲区
  • 通常所说的TCP收发缓冲区和Socket收发缓冲区其实是一个东西,但这说法不完整正确,要取决于Socket是基于那种传输层协议,因为UDP也有缓冲区。
  • TCP为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据
  • 如果没有缓冲区的话,那么要做到保证接收的数据是按顺序传输的,那么如果位于x序号之后的序号分组先到达目的主机的运输层的话必然丢弃,这样的话将在重传上花费很大的开销,所以一般如果有过大的序号达到接收端,那么会按照序号缓存起来等待之前的序号分许到达,然后一并交付到应用进程。
  • TCP缓冲区和窗口大小是相关的,我们知道窗口大小是在不断的变化的,可以理解为TCP缓冲区是窗口大小的最大值,而窗口大小是TCP缓冲区目前还能接收多少的数据

TCP粘包/拆包


什么是粘包/拆包问题?
  • 因为TCP协议是面向字节流的,所有数据在TCP层面看来,都只是一串无边界的流,即数据与数据之间是没有边界的。
  • 因为TCP协议中的数据是没有边界的流。如果用户对服务端发送了多个独立的数据,比如 "你好吗" , "你吃了吗" 两条数据,但是在TCP层面上看来,数据格式就是 "你好吗你吃了吗" ,所以我们就无法识别出哪里才算一个完整的数据包
  • 因为接收方不知道怎么才算一个完整的数据包,所以当接收方把 "你好吗你吃了吗" 数据流识别成 “你好” 和 “吗你吃饭了吗”,这就造成了拆包问题,把一个独立数据包的一部分拆分了成了两个包。如果我们的接收方把数据识别成了 "你好吗你吃了吗",那么这就造成了粘包问题,把两个独立数据粘在一起了。

为什么会产生粘包/拆包问题?

为什么拆包?

  • 应用程序写入的数据大于Socket缓冲区大小时,就会造成拆包
  • 待发送数据大于MSS最大TCP段长度,TCP在传输前将进行拆包

为什么粘包?

  • 应用程序写入数据小于Socket缓冲区的大小,多个独立的数据包被陆续或同时写入这个缓冲区,这就造成粘包
  • 如果接收方不及时读取Socket缓冲区中的数据,那么这可能将会导致发生粘包问题

所以我们可以知道TCP协议的粘包/拆包问题是TCP协议的特性导致的,主要是因为TCP分段以及TCP缓存区造成的,一定程度上可以说,是传输层导致的问题,而解决方案则是由应用层来解决。所以粘包/拆包问题也跟IP分片没有关系,只跟TCP分段有关系


粘包/拆包的解决方案
  • 使用带消息头的应用层协议。消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容
  • 设置定长消息。应用层协议规定每个完整的数据包的定长,服务端每次读取既定长度的消息
  • 设置消息边界。类似http协议一样,每个完整的数据包后面都使用换行符或空格等符号表示

参考资料


使用MATLAB、WOE、逻辑回归、PD估计和预期损失分析进行信用风险评分与投资组合优化.zip 立即下载

相关推荐

产业园区如何精准识别和匹配优质科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

TCP粘包、拆包与通信协议

在TCP编程中,通常Sever端与Client通信时的消息都有着固定的消息格式,称之为协议(protocol),例如FTP协议、Telnet协议等,有的公司也会自己开发协议。 那么协议到底是干什么的呢?说白了,协议了就是定义了数据通信的格式。主要是为了解决TCP编程中的粘包和半包问题。 由于TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供...

lhrimperial的专栏 3373

国央企创新负责人如何利用平台实现技术成果的精准对接与协同创新?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【计网】一起聊聊TCP的粘包拆包问题吧

在TCP中,粘包和拆包问题是十分常见的,如基于TCP协议的RPC框架、Netty等。粘包(Packet Stickiness)指的是在网络通信中,发送方连续发送的多个小数据包被接收方一次性接收的现象。这可能是因为底层传输层协议(如TCP)会将多个小数据包合并成一个大的数据块进行传输,导致接收方在接收数据时一次性接收了多个数据包,造成粘连。拆包(Packet Splitting)指的是在网络通信中,发送方发送的一个大数据包被接收方拆分成多个小数据包进行接收的现象。

陈宝子的博客 2118

科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_11.docx

科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_11

spring web mvc图书管理小案例前端代码

spring web mvc图书管理小案例前端代码

【计算机网络】TCP粘包、拆包的机制

TCP粘包和拆包是由于TCP协议面向流的特性导致的。解决粘包和拆包的核心是定义消息边界,常见的方法包括固定长度消息、特殊分隔符、消息头+消息体等。

L1951381654的博客 612

【基于dq控制算法的并联有源滤波器】分流有源滤波器的仿真电路可以减轻谐波和无功功率(simulink仿真实现)

内容概要:本文详细介绍了基于dq控制算法的并联有源滤波器(APF)在Simulink环境下的仿真电路设计与实现过程,重点阐述了通过分流式拓扑结构有效抑制电力系统中的谐波污染并补偿无功功率的技术方案。文中深入剖析了dq变换的核心原理,将其应用于控制系统中,实现三相交流量到直流量的转换,从而简化控制器设计并提升动态响应精度。仿真模型完整构建了主电路、负载模块及控制策略三大组成部分,能够直观呈现滤波前后电流波形的改善效果,验证了该方法在提高电能质量方面的有效性与可行性。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事电能质量治理、有源滤波器研发及相关领域工程应用的技术人员。; 使用场景及目标:①用于课堂教学与课程设计,帮助学生理解dq变换机制及有源滤波器的工作原理;②为科研项目提供可复现的仿真平台,支持新型控制算法的开发与验证;③辅助企业在实际工程中优化APF产品设计,增强谐波抑制与无功补偿性能。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建与调试模型,深入掌握各控制模块参数整定方法及其对系统性能的影响,可通过改变负载类型或引入非理想工况进行对比分析,以全面提升对系统稳态与动态特性的理解与掌控能力。

慢慢说计网:粘包和拆包

小Q:什么是粘包呢? 慢慢:TCP 协议的服务端和客户端是保持长连接的状态(若短连接,一次连接发一个数据报就不会产生粘包和拆包问题)。双方在连接不断的情况下,可以一直传输数据。当发送的数据报过小时,TCP 默认会采用 Nagle 算法,将小的数据报合并在一起,再发送给服务端。这样就产生了粘包问题。 小Q:什么是拆包呢? 慢慢:虽然 tcp 是面向字节流的,上层传过来多少字节就接收多少字节,可以算是没有长度限制,但网络层的 IP 数据报是有长度限制。于是如果字节流过长的话,在网络层就得要把这个字节流拆.

qq_45378738的博客 204

中小功率逆变电源关键单元电路设计与保护策略研究【原理+PCB+程序】

内容概要:本文围绕中小功率逆变电源的关键单元电路设计与保护策略展开系统性研究,涵盖逆变电源的工作原理、硬件电路设计(包括DC-DC升压与DC-AC逆变)、SPWM正弦波调制技术、闭环控制策略(电压/电流双闭环)、系统保护机制(过压、过流、短路、过温等)以及基于STM32的嵌入式控制系统开发。研究内容整合了Simulink仿真模型、PCB设计文件与嵌入式程序代码,实现了从理论分析、仿真验证到硬件实现的完整技术链条,重点突出系统稳定性设计与多层级保护策略的协同优化,适用于逆变器产品的研发与工程实践。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事电源系统设计的研发工程师、高校研究生及工程技术人员,尤其适合具有一定嵌入式系统开发经验(熟悉STM32系列单片机)且工作年限在1-5年的从业人员。; 使用场景及目标:①用于中小功率离网/并网逆变器的原型开发与产品设计;②作为高校电力电子、自动化等专业的课程设计、毕业设计或科研项目的综合性参考方案;③深入掌握SPWM调制、LC滤波器设计、PID闭环控制、系统保护逻辑等关键技术的实现方法;④结合仿真与实物平台进行波形测试与参数调试,提升电力电子系统的综合设计能力与故障排查水平。; 阅读建议:建议读者结合提供的原理图、PCB布局图与源代码同步学习,优先在Simulink中完成控制逻辑仿真,理解系统动态响应特性后再搭建实际硬件平台。重点关注保护电路的动作阈值设置与软硬件协同保护机制的实现方式,实验过程中应配合示波器、万用表等仪器观测关键节点波形,逐步优化控制参数以提升系统效率与稳定性。

LCL单相并网逆变器PI双闭环有源阻尼仿真【附参考文献及说明文档】

内容概要:本文围绕LCL单相并网逆变器的PI双闭环有源阻尼控制策略展开,基于Simulink搭建完整的系统仿真模型,深入研究由电流内环与电压外环构成的双闭环控制结构,并结合有源阻尼技术有效抑制LCL滤波器引发的谐振不稳定问题。文中系统阐述了PI控制器参数的设计方法、系统稳定性分析过程以及有源阻尼的作用机理,确保逆变器在并网运行时具备优良的动态响应能力、抗干扰性能与电能质量。同时提供详细的参考文献与说明文档,支持仿真结果的复现与理论延伸,适用于科研验证与工程前期设计。; 适合人群:具备电力电子技术、自动控制理论基础,从事新能源发电系统、电力变换器控制、并网逆变器研发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握LCL型滤波器在单相并网逆变器中的建模方法及其谐振特性与抑制手段;②学习PI双闭环控制结构的设计流程与参数整定技巧;③理解有源阻尼技术的实现原理及其在提升系统稳定性方面的优势;④通过仿真模型动手实践,为后续硬件原型开发、控制器优化及并网标准符合性测试提供理论依据和技术储备。; 阅读建议:建议读者结合所提供的Simulink仿真模型与说明文档,逐步运行并调试系统,重点关注PI参数变化对系统动态响应与稳定性的影响,同时利用频域分析工具(如波特图)辅助理解谐振峰抑制效果,建议对照参考文献深化对控制理论的理解,宜在仿真实践中同步开展时域与频域联合分析,以全面提升系统设计与问题诊断能力。

计网回顾---分段/分片

分段是发生在传输层,一般是TCP进行分段;分片是发生在网络层,IP层会将数据进行分片传输。 分片-MTU(Maximum Transmission Unit,最大传输单元) 首先说一下MTU的概念。MTU是指数据链路层会对数据帧的大小有一个限制,这个限制就叫做MTU。 如果说IP层有一个数据要传,而这个数据的大小超出了MTU,那么IP层就会根据MTU将这个数据进行分片,然后一片一片的进行传输。 接收方接收到这些数据片之后,就会由接收方的IP层进行重装,形成一整个数据。 使用UDP很容易导致分片,而使用TCP

伊懿的博客 1779

三相四桥臂电压不对称跌落补偿动态电压恢复器DVR(Simulink仿真实现)

内容概要:本文围绕三相四桥臂动态电压恢复器(DVR)在电压不对称跌落条件下的补偿能力展开研究,基于Simulink搭建完整的系统仿真模型,重点解决不平衡工况下的电能质量问题。系统采用三相四桥臂逆变器拓扑结构,具备独立调控零序分量的能力,结合正负序分离控制策略实现精确补偿。文档详细阐述了RIME(Rider-Inspired Metaheuristic Evolution)新型智能优化算法对PID控制器参数的整定过程,并系统对比了传统PID、神经网络PID(如BP-PID、RBF-PID)、模糊PID及多种智能优化算法(如PSO、SSA)在动态响应速度、稳态精度和抗干扰能力方面的性能差异。研究还涵盖了控制算法设计、系统建模、仿真验证全流程,配套提供参考文献、说明文档与可运行仿真文件,具有较强的复现性和工程指导价值。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事电能质量治理的技术工程师;具备一定MATLAB/Simulink仿真基础和控制理论背景的研发人员。; 使用场景及目标:①用于研究动态电压恢复器在不对称电压跌落下的补偿能力;②比较不同智能优化算法(如RIME、PSO、SSA)在PID参数整定中的效果;③开展新型控制策略(如模糊PID、RBF神经网络控制)在电力系统中的应用仿真与验证; 阅读建议:建议结合提供的参考文献与仿真文件逐步复现模型,重点关注四桥臂逆变器的拓扑特性、正负序分离控制、PID参数优化过程及系统动态响应性能,宜在实践中调试与对比不同控制算法的补偿效果。

【目录】博客目录 & 先点这里

为了方便索引,请移步这里哟 ! !

长路漫漫的歇脚处 7294

ESP-IDF的安装及其在VScode中编译环境的搭建

从安装目录的\Espressif\frameworks\esp-idf-v5.3.2\examples路径中拷贝一个工程到项目中,比如拷贝\get-started下的hello_world文件夹。安装时可能会遇到如下问题,提示:"e:\ssc\software\ESP-IDF\v5.3.2\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)接着等待安装完成即可,其他步骤同方式1。

Freddy_Ssc的博客 4325

利用 vivado实现加减法器的设计

本科计组实验:利用 vivado实现加减法器的设计

qq_52052302的博客 1万+
上一篇: 【MySQL笔记】正确的理解MySQL的事务和隔离级别
下一篇: 【数据结构】初入数据结构中的平衡二叉搜索树(AVL树)及Java实现
SnailMann
博客等级 码龄9年 2万+粉丝 114原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值