TCP重传机制、滑动窗口、拥塞控制

news2024/12/27 12:30:24

一、总述

TCP,Transmission Control Protocol,是一个面向连接、基于流式传输可靠传输协议,考虑到的内容很多,比如数据包的丢失、损坏、分片和乱序等,TCP协议通过多种不同的机制来实现可靠传输。今天,重点分析重传机制滑动窗口,以及拥塞控制

二、重传机制

在三握四挥的过程中,服务器和客户端之间就通过带有不同标志位的TCP报文来通知或判断对端或本地是否成功建立、断开连接。

接收主机在接收到数据之后往往都会返回一个应答消息,网络错综复杂,面对随时可能发生的数据丢失问题,TCP使用重传机制解决。常见的重传机制有以下四种:

  • 超时重传
  • 快速重传
  • SACK
  • D_SACK
(一) 超时重传

超时重传,顾名思义,在发送数据时,会设定一个定时器,当超过指定的时间过后,没有收到对端的ACK确认应答报文,就会重写发送该数据。而这又可以分为两种情况:

  • 数据包丢失
  • ACK确认应答丢失

在了解如何设置超时时间之前,先来看看什么是RTT(Round-Trip Time)往返时延

RTT,往返时延,数据从一端到另一端。其中,往返这个词是表明了什么范围是所需的时间。

知道了RTT,在来看点相关的:RTO,Retransmission Timeout,直译“超时重传时间”。这个时间的设置毫无疑问关系到我们重传机制的效率高低,看以下两种情况:

  • RTO>>RTT,重发慢,没有效率;
  • RTO<<RTT,包可能还没到就开始重发,重发出去的包数量多了,网络无疑会拥塞,超时的包越来越多,恶性循环。

那么结论显而易见——RTO的值,应该略大于RTT

很容易想到的是,报文往返的RTT值会是经常变化的,所以RTO也应该是一个动态变化的值。(在Linux中,通常会采样RTT的值然后加权算平均,不详细谈了)

而在超时时,TCP的策略是超时间隔加倍

(二) 快速重传

Fast Retransmit,快速重传,不以时间为驱动,而以数据驱动重传

在上图中,Seq2一直没有成功被接收方收到,当发送端收到三个Ack=2的确认,就会在定时器过期之前,重传丢失的Seq2

不过,发送方并不知道Ack=2是谁传回来的,那么是重传Seq2还是把之前的所有包都重传呢?根据TCP实现的不同,上述两种情况都是可能的。

(三) SACK

SACK是指Selective Acknowledgment,选择性确认,这种方式通过在TCP头部"选项"字段添加一个SACK,把缓存的地图发送给发送方,这样发送方就知道哪些数据需要重传了。


如果要支持SACK,双方都要支持,在Linux下,通过net.ipv4.tcp_sack这个参数打开(Linux2.4后默认打开)。

(四) Duplicate SACK

D_SACK,主要使用SACK来通知发送方有哪些数据被重复接收了,下面通过两个例子来说明,这个Duplicate到底有什么妙用。

  • ACK丢包

发送端通过ACK和SACK就可以明确,是发出去的包丢了还是接收方返回的ACK确认报文丢了

  • 网络延时

在判定网络延迟时,Duplicate的含义才更加明显地体现了出来,即复制的、完全一样的。

如上图中提及,在经历了网络延迟和三次相同ACK触发快速重传后,网络延迟的包终于送达,此时返回ACK=3000,SACK=1000~1500(注意之前的SACK范围总是大于ACK),就知道了这个SACK是D_SACK,是重复的包。

三、滑动窗口(流量控制)

(一) 滑动窗口

滑动窗口,Sliding Window,是一种流量控制机制,同时也是一种保持通信效率的技术。已知的是,每当有一个数据包发出,发送端总盼望得到一个ACK确认;那么要是在得到ACK之前不做任何动作,效率的高低明显可见。

为此,TCP引入了窗口的概念,通过指定窗口大小(数据最大值),来进行无需等待确认应答的通信

在实际实现时,是由操作系统开辟一个缓存空间。在发送方得到确认应答前,已发送的数据都会保存在缓冲区,如果按期收到确认应答,此时数据就可以从缓冲区清除。

如此一来,有了累计确认(或累计应答)模式:

  • 那么引申出一个问题——窗口的大小由哪一方决定?

TCP报头中有一个16位的字段:窗口尺寸Window,这个字段是由接收方通知发送方自己还有多少缓冲区可以用来接收数据。以免接收方无法正常接收到数据。

  • 发送方,滑动窗口分为4个部分

它的工作方式很容易想到:ACK确认一部分,可用窗口就扩大一部分;当发送窗口满了,在接收ACK之前就不再发送数据。

  • 接收方,滑动窗口分为3个部分

值得注意的是,两个窗口的大小是约等于的关系,而不是一模一样。因为滑动窗口不是一成不变的。如果接收方的读取速度有了很大提升,会通过TCP报文通知发送方新的窗口大小。

(二) 窗口关闭问题

TCP中,通过接收方指定窗口尺寸来进行流量控制。在通信中,当接收方窗口被填满,会向发送方说明窗口尺寸位0;等处理好数据后,才会又通告一个窗口非0的ACK报文。不过,要是这个非0报文丢失,就会陷入死锁的状态(双方同时等待)。

  • 窗口探测报文

为了解决这个问题,TCP为每个连接设置了一个持续计时器,只要收到0窗口通告,就启动计时器。当计时器超时,就会发送窗口探测报文,这个报文的用意显而易见。(窗口探测的次数一般是3次)。

(三) 糊涂窗口问题

糊涂窗口是指接收方在处理数据时的速度过慢,导致窗口的尺寸不断变小的现象。实际上就是两个动作让这个现象出现:

  • 接收方通告小窗口
  • 发送方发送小数据

想要避免这种现象,解决上述两个问题就好了。

  1. 在接收方,当窗口小于min(MSS, 缓存空间/2),就会告知对方0窗口,到后面合适的时机再通知非0窗口。
  2. 在发送方,使用Nagle算法进行延时处理,要等到发送窗口大小>=MSS,或者接收到ACK确认报文,才会停止囤积数据。这个算法是默认打开的,在使用telnet和ssh等交互性比较强的程序时,通过TCP_NODELAY来关闭。

四、拥塞控制

(一) 什么是拥塞

上文的流量控制是避免发送方的数据填满接收方的缓存,而拥塞控制,则是为了避免在整个网络环境处于拥堵时,还继续发送大量数据包的手段(可能导致数据包时延、丢失等,重传也会加重拥塞)。

那么很明显,拥塞控制是在发送端实现的。为了调节发送数据的量,定义了“拥塞窗口”的概念。

(二) 什么是拥塞窗口

拥塞窗口,是一个由发送方维护的状态变量,根据网络的拥塞程度动态变化。前面的发送窗口和接收窗口在有了拥塞窗口的加入以后,是这样的关系:

  • 发送=min(拥塞,接收)

拥塞窗口的动态变化也很简答:有拥塞,就变小;没拥塞,就变大。

(三) 如何判断拥塞

只要发送方没在规定的时间内接收到ACK确认报文(发生超时重传),就会认为网络出现了拥塞。

(四) 拥塞控制算法——慢启动

TCP在刚建立完连接后,会经历慢启动,逐步提高发送数据包的数量。规则是:

  • 发送方每收一个ACK,拥塞窗口cwnd的大小就增加1。

所以,这个增长是指数性的

那什么时候是个头呢?——当达到慢启动门限(slow start threshold)后,就会使用拥塞避免算法

(五) 拥塞避免算法

慢启动门限ssthresh一般的大小为65535字节,在进入拥塞避免算法后,窗口增长的规则是:

  • 每当收到一个ACK,cwnd增加1/cwnd。

如此一来,线性增长

在此后一直增长,网络就会进入拥塞的状态,出现丢包和丢包重传,触发了重传,也就进入了拥塞发生算法

(六) 拥塞发生

在上文提到过,重传的机制也有两种:1. 超时重传,2. 快速重传。接下来进行分述:

  • 超时重传的拥塞发生算法

ssthresh设置为cwnd/2,cwnd重置为1,然后重新开始慢启动。不过这种方式会突然减少数据流,可能网络卡顿(就像是急刹车)。

  • 快速重传的拥塞发生算法

在快速重传时,接收方发送三次前一个包的ACK通知发送端重传(大部分没丢,只丢了小部分)。

cwnd=cwnd/2,ssthresh=cwnd,然后进入快速恢复算法

(七) 快速恢复

快速重传一般和快速恢复算法同时使用,这种情况会判断网络情况并不是特别严峻,反映也不会像RTO那样强烈。

快速恢复算法

  • cwnd=ssthresh+3
  • 重传丢失的数据包
  • 如果再收到重复的ACK,cwnd+1
  • 如果收到新ACK(说明D_SACK时的数据全部收到,恢复过程结束),cwnd=ssthresh,恢复到之前二点拥塞避免状态

本文作为笔记,图片来源:

30 张图解: 面试必问的 TCP 重传、滑动窗口、流量控制、拥塞控制_面试回答 tcp流量控制-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_34827674/article/details/105606205

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作&#xff0c;所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容&#xff08;可能有因为安装完…

C++指针(四)万字图文详解!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09; 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…

【校园安全】支小蜜防校园霸凌语音识别系统的好处

在校园安全领域&#xff0c;防校园霸凌语音识别系统的出现&#xff0c;为预防和应对校园霸凌行为提供了新的技术手段。本文将探讨防校园霸凌语音识别系统的好处&#xff0c;并分析其在校园安全建设中的重要作用。 通过安装在校园各个角落的语音识别设备&#xff0c;系统能够捕…

LeetCode 刷题 [C++] 第3题.无重复字符的最长子串

题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题目分析 可以使用滑动窗口加哈希表来实现&#xff1a; 使用start和end两个变脸来表示滑动窗口的头部位置和尾部位置&#xff0c;两者开始均为0&#xff1b;借助哈希表来记录已经遍…

WinSCP下载安装并结合内网穿透实现固定公网TCP地址访问本地服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

走向审计4.0:内部审计数字化转型的路径与方法【文末送书-34】

文章目录 走向审计4.0&#xff1a;内部审计数字化转型的路径与方法一、内部审计的发展阶段二、内部审计的逻辑架构三、内部审计数字化转型面临的问题四、内部审计数字化转型的框架方法五、内部审计的数字化转型能力体系六、内部审计的数字化转型路径七、内部审计的数字化系统平…

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址&#xff1a;https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年&#xff0c;开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代&#xff0c;这个问题很难破解。 人工智能和大型预训练tran…

143.和弦是什么?和声是什么?三和弦

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;142.音程的构唱练习 和弦的定义&#xff1a; 一个音可以把它称为单音 两个音可以把它称为音程 更多的音&#xff0c;通俗的定义上&#xff0c;三个音或者三个以上的音构成的集体就可以叫做和弦&#xff0c;这些音…

Redis进阶(三):主从复制

为了解决单点问题&#xff0c;实现多服务器部署redis&#xff0c;有几种解决方案可以实现&#xff1a;主从复制&#xff0c;主从哨兵还有集群。 何为主从复制 简单来说有三个服务器分别部署了redis-server程序&#xff0c;选中一个服务器当作主节点&#xff0c;其他的就是从节…

TypeScript 哲学 - Object Types

readonly 修饰对象和数组的 双向可分配性是不同的 Combind types 交叉类型对 值类型可以识别 never 但是 Object 类型识别不了 Tuple

AI时代PPT如何制作?用这10款pptai生成器一键制作!

ppt如何制作&#xff1f; 这可能是很多职场人或大学生日常头疼的问题&#xff0c;职场上随便一个工作汇报、提案展示、团队会议&#xff0c;学校里的小组作业、论文答辩等场景&#xff0c;都会用到ppt。 都说人是视觉动物&#xff0c;在两份文档内容质量一致的情况下&#xf…

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

通过对话式人工智能打破语言障碍

「AI突破语言障碍」智能人工智能如何让全球交流无障碍 在当今互联的世界中&#xff0c;跨越语言界限进行交流的能力比以往任何时候都更加重要。 对话式人工智能&#xff08;包括聊天机器人和语音助手等技术&#xff09;在打破这些语言障碍方面发挥着关键作用。 在这篇博文中&am…

Java对接海康威视摄像头实现抓图

目录 一、下载SDK 二、拷贝示例代码 三、拷贝库文件 四、运行Demo 五、抓图业务 六、调参 ​七、发布Linux正式环境 一、下载SDK 海康开放平台 二、拷贝示例代码 三、拷贝库文件 这时候直接运行ClientDemo会报错&#xff0c;因为缺失库文件&#xff01; 四、运行Demo …

13 OpenCv自定义线性滤波

文章目录 卷积算子示例 卷积 卷积是图像处理中一个操作&#xff0c;是kernel在图像的每个像素上的操作。Kernel本质上一个固定大小的矩阵数组&#xff0c;其中心点称为锚点(anchor point) 把kernel放到像素数组之上&#xff0c;求锚点周围覆盖的像素乘积之和&#xff08;包括锚…

杨辉三角(附html,Python,c++杨辉三角代码)

1、前言 杨辉三角很早学编程就知道&#xff0c;但不知道杨辉是古人&#xff01; 一次偶然的机会&#xff0c;和杨辉三角对上了眼神——杨辉&#xff01;究竟你是怎么发现杨辉三角的呢&#xff1f; 于是经过了长达3个月锲而不舍的探究。 终究也没发现自己想要的最终结果。 …

内螺旋面的计算

内螺旋面的计算 内螺旋面的计算是机械工程和数学领域中的一个重要问题。它涉及到三维几何、微积分和数值计算等多个方面的知识。内螺旋面的形状和特性对于许多机械装置和工程应用来说至关重要&#xff0c;因此准确计算内螺旋面的几何参数和性质至关重要。内螺旋面是一种特殊的…

warning: #188-D: enumerated type mixed with another type

警告解释&#xff1a;枚举类型混合了其它的数据类型&#xff1b; 解决方法&#xff1a; 1&#xff1a;检查代码&#xff0c;是不是存在混用&#xff1b;&#xff1b; 2&#xff1a;结构体初始化为 0 报warning&#xff0c;不能将结构体的第一个变量&#xff0c;使用枚举类型&am…

Dgraph 入门教程五(Shema)

要想做好图数据库&#xff0c;必须做图数据库设计&#xff0c;想做好Dgraph&#xff0c;就需要设计好Shema。Shema的语法是必须理解&#xff0c;如果不理解&#xff0c;别人写的Shema&#xff0c;我们也看不懂。我这里也是走马观花式的记录&#xff0c;细节还需要在使用的时候去…

如何恢复未保存的 Excel 文件

本周我们将 Office 恢复系列扩展到 Excel 恢复&#xff0c;并提出了最常见的问题&#xff1a;如何恢复 Excel 文件&#xff1f; 与 Office Word 不同&#xff0c;Excel 完全是关于表格和计算的。在处理Excel文件时&#xff0c;您可能会遇到更多问题。与往常一样&#xff0c;我们…