第三十二篇:TCP协议粘包和滑动窗口,TCP系列七

上一篇《第三十一篇:TCP协议如何解决丢包的问题,TCP系列六》讲了TCP如何解决丢包问题,本文将为大家讲解TCP是如何提高传输效率,减少传输时延的原理。

1. TCP是如何提高传输效率,减少传输时延的

 粘包

如果传输的数据过小,例如数据只有1byte,那么为了传输这1byte数据,至少要消耗20字节IP头部+20字节TCP头部=40byte,这还不包括其二层头部所需要的开销,显然这种数据传输效率是很低的。

为了避免资源浪费,提高传输效率,所以在实现TCP的时候,TCP软件内核会将小包的数据合并发送,这样的情况叫做粘包。

既然涉及到粘包,就必然会有拆包的过程;拆包一般在应用层进行,拆包的常用方式有三种:

  1. 在将数据从应用层传递到传输层之前,发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
  2. 发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
  3. 可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

 滑动窗口窗口控制提高速度

由一个或多个字节组成一个段,TCP以一个段为单位,,每发一个段就进行一次应答处理,如下图所示,这样的传输方式由一个缺点。那就是,包的往返时间越长,网络的吞吐量越低,通信的性能就越低。

那有没有办法解决这个问题呢?答案是有的,那就是报文在不被确认应答的情况下也可以继续发送下一个报文,但是这个未被应答包的大小也不是无限的,而是被限制在一定数量范围内,这个数量叫窗口大小,这个技术在TCP中叫做滑动窗口

2. 滑动窗口

早期的网络通信中,通信双方不会考虑对方的数据处理能力就直接发送数据。导致接收端无法处理数据而丢包,而发送端不断重发,导致网络拥塞,中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。

定义

滑动窗口:指无需等待确认应答而可以继续发送数据的最大值,即累计可以不确认应答的数据的最大数值。同时其是是一种流量控制技术,也叫滑动窗口协议

 滑动窗口协议

滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。

1)发送窗口:发送方维持了一个连续的允许发送的帧的序号,发送窗⼝的实现实际上是操作系统开辟的⼀个缓存空间,发送⽅主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

发送窗口对应计算机的一段缓存,该缓存分为四部分:发送已确认发送未确认未发送但在接收方处理范围的数据部分未发送但超过接收方处理范围的数据部分

如下图,当发送⽅把#3数据「全部」都⼀下发送出去后,#2发送未确认数据大小达到可⽤窗⼝的⼤⼩,表明可⽤窗⼝耗尽,在没收到ACK 确认之前是⽆法继续发送数据了。

在上图中,24~27数据被ack确认后,可发送窗口向后滑动,如下图

如何计算发送窗口的大小?

发送端必须根据接收端的处理能力来发送数据,才不会导致接收端处理不过来,同时发送端也必须考虑网络拥塞问题(本来网络就很拥塞,还要大量发送数据,这是灾难性的,所以必须通过发送来控制),发送端发送的数据包,接收端会给一个确认包(ACK).确认它收到了。 接收端给发送端发送的确认包(ACK包)中,同时会携带一个窗口的大小。

该窗口大小为接收端窗口大小 =  接收端最大缓存量 - 接收已确认但还未被应用层读取的部分

所以初始发送端的窗口大小=min(接收端窗口大小,拥塞窗口大小)+ 发送未确认大小

2)接收窗口:接收方也维持了一个连续的允许接收的帧的序号,接收窗⼝的实现实际上也是操作系统开辟的⼀个缓存空间。

  • 接收窗口在缓存中分为已成功接收并确认部分未收到但是可以接收部分未收到并不可接收的部分

  •  接收窗口与读取数据的关系

读取速度>窗口 窗口会不断变大直到分配缓存大小

读取速度<窗口 窗口会不断变小,极端情况下为0

读取速度=窗口 窗口不变

  3)接收端控制发送端的图示

  • 关闭窗口(Zero Window)

上图,我们可以看到一个处理缓慢的Server(接收端)是怎么把Client(发送端)的TCP 滑动窗口给降成0的。此时,你一定会问,如果Window变成0了,TCP会怎么样?是不是发送端就不发数据了?是的,发送端就不发数据了,你可以想像成“Window Closed”,那你一定还会问,如果发送端不发数据了,接收方一会儿Window size 可用了,怎么通知发送端呢?

解决这个问题,TCP使用了零窗口探测技术(Zero Window Probe,缩写为ZWP),也就是说,接收端在接收窗口变为0后会通知发送端,发送端发现接收端窗口大小变为0,会启动一个定时器,在定时器超时后,会发探测报文给接收方,让接收方来ack他的Window尺寸,一般这个值会设置成3次,每次大约30-60秒(不同的实现可能会不一样)。如果3次过后还是0的话,有的TCP实现就会发RST把链接断了。

注意:只要有等待的地方都可能出现DDoS攻击,Zero Window也不例外,一些攻击者会在和HTTP建好链发完GET请求后,就把Window设置为0,然后服务端就只能等待进行ZWP,于是攻击者会并发大量的这样的请求,把服务器端的资源耗尽。

  • 糊涂窗口综合症(Silly Window Syndrome)

如果接收⽅太忙了,来不及取⾛接收窗⼝⾥的数据,那么就会导致发送⽅的发送窗⼝越来越⼩。

到最后,如果接收方腾出几个字节并告诉发送方现在有几个字节的window,而我们的发送方也会义无反顾地发送这几个字节。

要知道,我们的 TCP + IP 头有 40 个字节,为了传输那⼏个字节的数据,要达上这么⼤的开销,这太不经济了。物理层有最大传输单元(Maximum Transmission Unit,MTU),如果你的网络包可以塞满MTU,那么你可以用满整个带宽,如果不能,那么你就会浪费带宽。(大于MTU的包有两种结局,一种是直接被丢了,另一种是会被重新分块打包发送)。

为了解决这个发送小包的问题就是避免对小的窗口做出响应,直到有足够大的窗口再响应,这个思路可以同时实现在发送接收两端。

如果是接收方处理不过来导致滑动窗口过小通常采用如下策略

MSS(Max Segment Size),最大消息长度即段

当「窗⼝⼤⼩」⼩于 min( MSS,缓存空间/2 ) ,也就是⼩于 MSS 与 1/2 缓存⼤⼩中的最⼩值时,就会向发送⽅通告窗⼝为 0 ,也就阻⽌了发送⽅再发数据过来。

等到接收⽅处理了⼀些数据后,窗⼝⼤⼩ >= MSS,或者接收⽅缓存空间有⼀半可以使⽤,就可以把窗⼝打开让发送⽅发送数据过来。

同时发送⽅通常的策略:

使⽤ Nagle 算法,该算法的思路是延时处理,它用于自动连接许多的小缓冲消息;通过减少必须发送包的个数来增加网络软件系统的效率。即Nagle算法是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):

(1)如果包长度达到MSS,则允许发送;

(2)如果该包含有FIN,则允许发送;

(3)设置了TCP_NODELAY选项,则允许发送;

(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;如果设置了TCP_CORK选项就算设置了TCP_NODELAY选项TCP程序包也会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。

(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

注意:TCP_NODELAY 选项,发送数据采用Nagle 算法。这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagle 算法。

另外,Nagle 算法默认是打开的,如果对于⼀些需要⼩数据包交互的场景的程序,⽐如,telnet 或 ssh 这样的交互性⽐较强的程序,则需要关闭 Nagle 算法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载数据集用于图像分类并自动分为训练集和测试集方法

一、背景 最近需要用Vision Transformer&#xff08;ViT&#xff09;完成图像分类任务&#xff0c;因此查到了WZMIAOMIAO的GitHub&#xff0c;里面有各种图像处理的方法。而图像处理的前期工作就是获取大量的数据集&#xff0c;用于训练模型参数&#xff0c;以准确识别或分类我…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会&#xff0c;视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而&#xff0c;由于不同厂家和平台之间的兼容性问题&#xff0c;视频监控系统的联网和整合面临巨大挑战。为了解决这个问题&#xff0c;国家制定了《公共安全视频监控联网系…

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法&#xff0c;结合LabVIEW软件和高精度硬件&#xff0c;实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛&#xff0c;提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法&#xff0c;如锤击法&#x…

一个简单的图像分类项目(六)编写脚本:初步训练

训练的脚本 &#xff0c;用于训练和测试。lib.train.py: import timefrom load_imags import train_loader, train_num from nets import *def main():# 定义网络print(Please choose a network:)print(1. ResNet18)print(2. VGG)# 选择网络while True:net_choose input()if…

【C++】How the C++ Compiler Works

Firstly it needs to pre-process our code which means that any pre-processor statements get evaluated and once our code has been pre-processed we move on to more or less tokenizing(记号化) and parsing(解析) and basically sorting out(整理) this English C lan…

第2次CCF CSP认证真题解

1、相邻数对 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/2/problem/0 本题和第1次认证的第1题“相反数”差不多&#xff0c;都是考察循环遍历比较和计数。 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char …

一款强大的开源OCR工具,支持90+语言识别

大家好&#xff0c;今天给大家分享一款功能强大的开源光学字符识别&#xff08;OCR&#xff09;工具Surya OCR&#xff0c;它基于先进的深度学习技术&#xff0c;提供了高效的字符识别能力&#xff0c;并支持多种语言的文本检测与识别。 项目介绍 核心功能 1.多语言支持 Sur…

破局:DLinear

1. Introduction (1) time series forecasting (TSF)&#xff1b; (2) 回顾 “ Transformer (Vaswani et al. 2017) ” 的各领域优秀表现&#xff1a; (3) IMS vs. DMS : → Consequently, IMS forecasting is preferable when there is a highly-accurate single-step fore…

量化交易打怪升级全攻略

上钟&#xff01; 继续分享量化干货~ 这次要唠的是Stat Arb的新作《Quant Roadmap》(中译名《量化交易路线图》)&#xff0c;为了方便&#xff0c;下文就称呼作者为“老S”&#xff0c;根据公开资料显示&#xff0c;他可是正儿八经的的量化研究员出身&#xff0c;在漂亮国头部对…

【electron8】electron实现“图片”的另存为

注&#xff1a;该列出的代码&#xff0c;都在文章内示例出 1. 另存为按钮事件&#xff1a; const saveAsHandler async () > {const { path, sessionId } recordInfoif(typeof message ! string) return;// 因为我的图片是加密的&#xff0c;所以我需要根据接口返回的路…

全国智能手机使用数据集-dta格式(包含2015、2017、2019三个版本)

数据简介&#xff1a;为推动经济社会高质量发展&#xff0c;缓解经济下行压力&#xff0c;中国加大推动5G基建、大数据中心等科技领域基础设施的建设和完善。数字技术深入各行各业&#xff0c;催生了新业态、新模式、新机会和新就业形式。智能手机作为劳动者使用数字技术的重要…

二叉树的存储方式和遍历方式

文章目录 二叉树的存储方式二叉树的遍历方式DFS--递归遍历DFS--迭代遍历BFS--层次遍历 LC102 二叉树的存储方式 链式存储&#xff08;指针&#xff09;或 顺序存储&#xff08;数组&#xff09; (1)链式存储&#xff1a;通过指针把分布在各个地址的节点串联一起。 (2)顺序存储…

docker上传离线镜像包到Artifactory

docker上传离线镜像包到Artifactory 原创 大阳 北京晓数神州科技有限公司 2024年10月25日 17:33 北京 随着docker官方源的封禁&#xff0c;最近国内资源也出现无法拉取的问题&#xff0c;Artifactory在生产环境中&#xff0c;很少挂外网代理去官方源拉取&#xff0c;小编提供…

大模型面试-Layer normalization篇

1. Layer Norm 的计算公式写一下&#xff1f; 2. RMS Norm 的计算公式写一下&#xff1f; 3. RMS Norm 相比于 Layer Norm 有什么特点&#xff1f; 4. Deep Norm 思路&#xff1f; 5. 写一下 Deep Norm 代码实现&#xff1f; 6.Deep Norm 有什么优点&#xff1f; 7.LN 在 LLMs …

每日一题之电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出&#…

微信小程序学习实录11:精通表单数据绑定,构建高效用户界面

微信小程序中的表单数据绑定是一种非常实用的功能&#xff0c;它允许开发者将页面上的表单元素与数据进行关联&#xff0c;从而实现数据的双向绑定。这样做的好处是能够简化代码&#xff0c;提高开发效率&#xff0c;并且让数据管理变得更加直观。 一、基本概念 数据绑定&am…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码&#xff0c;智慧工地全套源代码包含&#xff1a;PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线&#xff0c;以AI、物联网、BIM技术为手段&#xff0c;对施工现场进行立体化、全方位、全时段管理&#xff0c;实现规范施工管…

解决VMware虚拟机的字体过小问题

前言&#xff1a; &#xff08;1&#xff09;先装VMware VMware17Pro虚拟机安装教程(超详细)-CSDN博客 &#xff08;2&#xff09;通过清华等镜像网站安装好Ubuntu镜像&#xff0c;下面贴上链接 教程虚拟机配置我没有做&#xff0c;因为学校给了现成的虚拟机~~大家需要的自己…

数据结构之单链表——考研笔记

文章目录 一.单链表定义1.什么是单链表2.代码实现3.不带头结点的单链表4.带头结点的单链表 二.单链表插入删除1.按位序插入&#xff08;带头结点&#xff09;2.插入时不带头节点3.指定节点的后插操作4.指定节点的前插操作5.按位序删除&#xff08;带头结点&#xff09;6.删除指…

2024年【北京市安全员-A证】找解析及北京市安全员-A证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 北京市安全员-A证找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新北京市安全员-A证考试试卷题目及答案&#xff01;多做几遍&#xff0c;其实通过北京市安全员-A证证考试很简单。 1、【多选题】《中华人…