Tcp中的流量控制,拥塞控制,超时重传时间的选择,都附带相应例子说明

端口号的了解 

通常进行通信时,发送方使用任意端口,指定接收方为指定端口,因为接收方在接收到后的需要根据发送方指定的接收方端口号,来选择使用哪一个服务进程进行处理。

端口号还可以分类为两个大类:

TCP和UDP报文的对比

Tcp的流量控制 

流量控制总览

TCP 流量控制是一种机制,用于根据接收方的处理能力动态调节发送方的数据发送速率。接收方通过 接收窗口 (rwnd) 通知发送方当前的缓冲区剩余空间,发送方根据 rwnd 大小调整发送数据量,防止数据超出接收方的接收能力并避免缓冲区溢出。

发送窗口(swnd)

 接收窗口(rwnd)

流量控制的例子 

首先这里的初始rwnd是在tcp三次握手的时候从接收方得知的。

初始发送窗口为400表示最多可以发送400个字节,在发送了300个字节之后,还未来得及发送301-400字节就收到了接收方的ack201,表示接收成功了前200个字节,并且告知接收窗口此时为300字节,虽然初始发送方窗口为400,但是流量控制中规定发送方的发送窗口大小受到接收方接收窗口的限制,所以发送方发送窗口调整为300。

此时只能发送201-500共300字节,201-300已经发送过了,虽然还未收到对应ack,但是必须等超时之后才能发送,所以此时只需将301-500字节发送。后面超时重传201-300。后面也是一样的套路。

当发送方收到0窗口通知(rwnd=0)那么此时发送方窗口也设为0,此时不能发送数据,因为接收方缓冲区满了,正在不断处理数据,直到后面接收方处理好之后会发送一个不为0的rwnd通知。收到这个通知之后接收方可以继续发送数据。

如果这个不为0的rwnd通知丢失了(接收方也不会再次发送了,那么发送方接收方都一直等下去吗?),其实也没关系,因为发送方在收到0窗口通知(rwnd=0)的时候就其实启动了一个定时器,定时器结束,就会向接收方发送一个1字节的0窗口探测报文,接收方可以对其进行回应。

这里的图片没有展示rwnd=0之后的事情,后面用的纯文字描述的,如果觉得抽象的话,可以观看视频:5.4 TCP的流量控制_哔哩哔哩_bilibili

Tcp的拥塞控制

拥塞控制

TCP的拥塞控制中,主要包含如下的四个具体控制机制: 

拥塞窗口(cwnd)和慢开始门限(ssthresh)

这里为了便于讨论,所以我们暂时先不考虑流量控制,所以直接假定发送窗口的大小=发送方拥塞窗口大小。实际上后面我们综合考虑的时候,发送方窗口(swnd)=min{接收窗口(rwnd) , 拥塞窗口(cwnd)}

cwndTCP 拥塞窗口(Congestion Window)的缩写,它是 TCP 拥塞控制中的一个关键概念,表示发送方在没有接收到确认(ACK)之前,能够发送的数据量的最大值。换句话说,cwnd 决定了在网络中发送数据时,发送方可以在没有收到确认的情况下“拥塞控制”允许发送的数据量。

 

慢开始和拥塞避免

慢开始 (Slow Start)

  • 目的:在连接开始或网络空闲时,逐步增加传输速率,防止网络拥塞。
  • 过程:从一个小的初始拥塞窗口(cwnd)开始,每次收到一个 ACK 就将 cwnd 值加倍,呈指数增长,直到达到一个预设的慢启动阈值 (ssthresh)
  • 限制:当达到 ssthresh 值时,进入拥塞避免阶段

拥塞避免 (Congestion Avoidance)

  • 目的:在高负荷时,平缓增加传输速率,以避免网络过载。
  • 过程cwnd 以线性速度增长,每个传输轮次只增加一个 MSS,确保流量控制更精细。
  • 触发:一旦 cwnd 达到或超过 ssthresh,即进入拥塞避免状态。
  • 限制:当发送方对于任意已发送报文,在报文重传计时器倒计时结束前没有收到接收方传来的ack确认,那么发送方将会认为是网络中发生了拥堵。此时重新转为慢开始机制,将ssthresh值设置为当前cwnd的一半,然后cwnd变为1。

  • “慢开始”是指一开始向网络注入的报文段少,并不是指拥塞窗口cwnd增长速度慢;慢开始阶段的数量增加是每次翻倍,非常快。
  • “拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

为什么需要快重传+快恢复?

这里我们可以采取一个措施,以此来尽量避免由于误判网络状态导致的重新慢启动,方法就是采用快重传。赶在因意外丢失的数据报对应的发送方定时器结束前,重新发送一次这个数据报,这样我们就很大可能性在定时器结束前,将第二次的数据报送到接收方,并且收到接收方对于这个报文序列的ack。如此一来,就可以避免定时器超时造成的慢启动。但是我们应该如何在定时器结束前知道这个报文丢失了呢?

在正常情况下,如果发生丢包,TCP 会根据 3 次重复 ACK 来触发快速重传,而无需重新回到 慢启动。只有当超时发生时,才会回到慢启动。发送方收到连续三次重复ACK,就会重传该报文

重复ACK是什么呢?别急,下面将详细解释一下:

  • 正常的 ACK

    • 当发送方发送一系列的数据包时,接收方每收到一个数据包,就会返回一个 ACK,告知发送方已经成功接收的数据的序列号。
    • 比如,发送方发送了数据包 1、2、3、4、5,接收方收到数据包 1 和 2 后,会发送 ACK 3,表示接收到的数据包序列号 1 和 2(下一个期望的包是 3)。
  • 丢包后的重复 ACK

    • 假设发送方发送了数据包 1、2、3、4、5,但数据包 3 丢失了。
    • 接收方收到了数据包 1 和 2,然后会发送 ACK 3(表示接收到了数据包 1 和 2,期待数据包 3)。
    • 当接收方收到数据包 4 后,它会发现自己缺少数据包 3,于是仍然会发送 ACK 3,表示它仍在等待数据包 3。
    • 同样,接收方收到数据包 5 后,还会发送 ACK 3,因为它仍然没有收到数据包 3。
  • 重复 ACK 的含义

    • 在这个例子中,接收方连续发送了 ACK 3(即重复的 ACK),表示它仍然在等待数据包 3。
    • 当发送方接收到三个重复的 ACK(例如接收到三个 ACK 3),就可以认为数据包 3 丢失了,因此它会触发 快速重传 机制,立刻重传丢失的数据包,而无需等待 超时

为什么收到重复ACK大概率能表明发生的是偶然丢包而不是网络拥塞?

        在网络没有发生拥塞的情况下,个别TCP数据报可能会丢失,但是和它同一批次传送的几个数据报几乎不可能也丢失,它们会被接收方成功获取并且返回若干ack(由于前面的有个别报文丢失,所以接收方即使收到后面编号的数据报,返回的都是当前最小编号未确认接收的报文ACK)。

        如果网络发生拥塞,大概率这一系列的TCP数据报都不会被收到,接收方也不可能连续返回重复ack(发送方收不到连续的重复ACK,就知道这应该不是偶然丢包,大概率属于网络拥塞)。

        所以只要接收方收到连续重复ACK,大概率发生的是偶然丢包,没必要进行慢启动!!!

快重传和快恢复

发生偶然的丢包后,由于存在快重传+快恢复,所以不用慢启动,但是也不是接着之前的阻塞窗口继续累加,而是会将阻塞窗口值cwnd和慢开始门限调整为当前阻塞窗口值的一半,不用从1慢启动,直接进入了拥塞避免阶段

拥塞控制例子

这个例子中第一次属于网络发送了拥塞,超时重传,从慢启动开始;第二次属于偶然丢包,使用快重传和快恢复。

 TCP流量控制和拥塞控制的对比

TCP超时重传时间的选择 

TCP 超时重传时间(RTO, Retransmission Timeout)的选择是一个重要的动态过程,用于确保丢失的数据包可以被及时重传,同时避免不必要的重复发送。RTO 的选择主要基于网络往返时间(RTT)的估计,通常通过以下步骤来动态调整:

 TCP 的超时重传时间 RTO 是一个动态调整的时间值,它结合了网络往返时间(RTT)的平滑估计 SRTT 延迟抖动 RTTVAR,通过加权平均和指数退避策略,实现了更可靠的传输和更好的适应性。

超时重传例子

SRTTRTTS 是同一个概念,表示平滑的 RTT(Smoothed RTT);同样,RTTVARRTTD 也是同一个概念,表示RTT 的变化范围或偏差(RTT Deviation)。

  • SRTT(RTTS):这是对实际 RTT 的平滑估计,通过加权平均来减少波动影响。
  • RTTVAR(RTTD):这是对 RTT 变化幅度的估计,用于表示 RTT 的偏差或不确定性。

这两个变量一起帮助动态调整 RTO,以适应网络延迟的正常变化。

TCP可靠传输的实现总结

这里有一个非常好的视频,详细包含了上面流量控制,拥塞控制以及超时时间的选择。

5.7 TCP可靠传输的实现_哔哩哔哩_bilibili

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

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

相关文章

Nextflow最佳实践:如何在云上高效处理大规模数据集

1. Nextflow 软件架构介绍 Nextflow 是一个用于简化数据驱动计算流程的工具,可以在各种计算环境中轻松部署。它采用了分布式计算和容器技术,实现了高度模块化、可重复性和可扩展性。NextFlow 的软件架构主要包括以下几个部分: 用户界面&…

一文看懂ERP、SCM、SRM、WMS、TMS、进销存管理系统

经常有人来私信问我ERP、SCM、SRM、WMS、TMS、进销存管理系统等等,它们听起来都很专业,但到底各自是什么?承担着怎样的角色呢?它们具体都有哪些功能?相互之间又存在怎样的关联,对企业而言又意味着什么呢&am…

深度学习——优化算法、激活函数、归一化、正则化

文章目录 🌺深度学习面试八股汇总🌺优化算法方法梯度下降 (Gradient Descent, GD)动量法 (Momentum)AdaGrad (Adaptive Gradient Algorithm)RMSProp (Root Mean Square Propagation)Adam (Adaptive Moment Estimation)AdamW 优化算法总结 经验和实践建议…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv11以其高效的特征提取能力,在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化,该数据集包含丰富的宠物狗图像样本…

星期-时间范围选择器 滑动选择时间 最小粒度 vue3

星期-时间范围选择器 功能介绍属性说明事件说明实现代码使用范例 根据业务需要,实现了一个可选择时间范围的周视图。用户可以通过鼠标拖动来选择时间段,并且可以通过快速选择组件来快速选择特定的时间范围。 如图: 功能介绍 时间范围选择&…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据? 面向高并发如何提高活动查询性能? 如何保证缓存一致性? 数据流 Redis数据结构设计 如…

JavaWeb常见注解

1.Controller 在 JavaWeb 开发中,Controller是 Spring 框架中的一个注解,主要用于定义控制器类(Controller),是 Spring MVC 模式的核心组件之一。它表示该类是一个 Spring MVC 控制器,用来处理 HTTP 请求并…

光伏储能微电网协调控制器

安科瑞 Acrel-Tu1990 1. 产品介绍 ACCU-100微电网协调控制器是一款专为微电网、分布式发电和储能系统设计的智能协调控制设备。该装置能够兼容包括光伏系统、风力发电、储能系统以及充电桩等多种设备的接入。它通过全天候的数据采集与分析,实时监控光伏、风能、储…

【C++课程学习】:继承:默认成员函数

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 构造函数 🍩默认构造函数(这里指的是编译器生成的构造函数)&#…

泷羽sec学习打卡-Linux基础2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base2 一、Linux-Base2linux有哪些目录呢?不同目录下有哪些具体的文件呢…

TCP拥塞控制

TCP拥塞控制(Congestion Control) 什么是拥塞控制? 拥塞控制(Congestion Control)主要针对整个网络中的数据传输速率进行调节,防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致于过载,以避免…

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

自动驾驶合集(更新中)

文章目录 车辆模型控制路径规划 车辆模型 车辆模型基础合集 控制 控制合集 路径规划 规划合集

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景:一般用于分发配置文件时候,如果配置文件有变化,则重启服务,如果没有变化,则不重启服务 案列01:分发nfs配置文件,若文件发生改变则重启服务 2.when判断 用于给ans运…

整理5个优秀的微信小程序开源项目

​ 一、Bee GitHub: https://github.com/woniudiancang/bee Bee是一个餐饮点餐商城微信小程序,是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷&#x…

微服务链路追踪skywalking安装

‌SkyWalking是一个开源的分布式追踪系统,主要用于监控和分析微服务架构下的应用性能。‌ 它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案,特别适用于微服务、云原生架构和基于容器的环境(如Docker、K8s、Mesos&…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议,2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下,ITU-R WP 5D#35e远程会议宣布3GPP 5G技术(含NB-IoT)满足IMT-2020 5G技…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点,对其进行数学建模并进行MATLAB求解,以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度,将它放在18摄氏度的水池中,五分钟后鸡蛋的温度为38摄氏度&#x…

开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究

摘要:本文以企业和个人品牌发展中至关重要的用户留存问题为切入点,结合管理大师彼得德鲁克对于企业兴旺发达的观点,阐述了用户留存对品牌营收的关键意义。在此基础上,深入分析开源 2 1 链动模式、AI 智能名片、S2B2C 商城小程序在…

搭建Python2和Python3虚拟环境

搭建Python3虚拟环境 1. 更新pip2. 搭建Python3虚拟环境第一步:安装python虚拟化工具第二步: 创建虚拟环境 3. 搭建Python2虚拟环境第一步:安装虚拟环境模块第二步:创建虚拟环境 4. workon命令管理虚拟机第一步:安装扩…