TCP滑动窗口、流量控制、拥塞控制

news2025/2/3 0:08:01

TCP滑动窗口、流量控制、拥塞控制

  • 一、滑动窗口
  • 二、流量控制
  • 三、拥塞控制

一、滑动窗口

上篇博客我们介绍了TCP报文结构、确认应答机制、超时重传机制、连接管理机制。
TCP保证了可靠传输,但是失去了效率。那么怎么样尽可能提高传输效率呢???

我们讨论了确认应答策略:对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段。
这样做有一个比较大的缺点,就是性能较差,尤其是数据往返的时间较长的时候。

在这里插入图片描述
主机A大量的时间都消耗在了等待ACK上!

既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能 (其实是将多个段的等待时间重叠在一起了) !
在这里插入图片描述

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节 (四个段)。
  • 发送前四个段的时候,不需要等待任何ACK,直接发送;
  • 收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;
  • 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据才能从缓冲区删掉;
  • 窗口越大,则网络的吞吐率就越高;

在这里插入图片描述

那么如果出现了丢包,如何进行重传?这里分两种情况讨论。

情况一: 数据包已经抵达,ACK被丢了。
在这里插入图片描述
这种情况下,部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认!

情况二: 数据包就直接丢了。
在这里插入图片描述
在这里插入图片描述
2001 - 7000 接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中。

这种搭配滑动窗口的机制被称为"高速重发控制" (也叫"快重传")。

二、流量控制

窗口大小越大,确实发送速度会更快~~ 但是窗口能无限大吗?

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制 (Flow Control) !

在这里插入图片描述

接收方的接收速率如何进行量化?
接收方使用接收缓冲区的剩余空间大小来作为发送方发送速率(窗口大小)的参考数值!

在这里插入图片描述

如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。
在这里插入图片描述

接收端如何把窗口大小告诉发送端呢?回忆我们的TCP首部中,有一个16位窗口字段,就是存放了窗口大小信息:
在这里插入图片描述
16位数字最大表示65535,那么TCP窗口最大就是65535字节么?
实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位~~

三、拥塞控制

流量控制是通过接收方的处理能力来衡量发送方的速率的。
难道只需要考虑接收方的处理速率吗?显然不是,还得考虑中间的这些转发节点的情况!
在这里插入图片描述
在这里插入图片描述
网络的环境是复杂的,网络环境也不是一成不变的~~
这就是拥塞控制!

流量控制是在控制发送方的窗口大小;拥塞控制也是在控制发送方的窗口大小。
那么有分歧的时候听谁的?谁小听谁的!!!(木桶原理)

TCP实现拥塞控制的具体方式是什么呢?
TCP引入慢启动机制,先发少量的数据探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。

在这里插入图片描述
拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方,但是又要避免给网络造成太大压力的折中方案~~

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

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

相关文章

react笔记_07组件实例化对象的三大属性

目录前提状态(state)作用状态使用总结属性(props)展开运算符复习props-作为属性传入数据props-使用展开运算符展开对象props-进行数据类型限制propTypes语法校验规则举例说明defaultProps语法举例说明refs字符串形式的ref语法举例说明注意点回调形式的ref什么叫做回调&#xff…

RT-Thread 简介

1.RT-Thread 概述 RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统, 基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。 事实上&#xff…

Redis实战——签到统计(BitMap的用法)

1. 什么是BitMap 我们针对签到功能完全可以通过mysql来完成,比如说以下这张表 但是,用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条。 每签到一次…

js实现图片的放大缩小(鼠标长按拖拽、鼠标滚轮控制放大缩小)

系列文章目录 文章目录系列文章目录背景与效果图1.背景如下(功能图):2.效果图如下:拖拽后的效果缩放的效果放大的效果一、功能:支持鼠标长按拖拽1.鼠标事件:2.拖拽功能流程3.拖拽部分代码如下二、功能&…

HTTP报文详解

个人博客地址: http://xiaohe-blog.top/ 文章目录1. 请求1.1 请求行1.2 请求头1.3 空白行1.4 请求体2. 响应2.1 状态行2.2 响应头2.3 空白行2.4 响应体2.5 HTTP报文总结3. HTTP方法4. GET与POST的区别5. 状态码1. 请求 1.1 请求行 请求方式 请求地址 请求协议版本号…

指针进阶1 2

字符指针 int main() {char ch q;char* pa &ch;return 0; }不仅可以这样写还可以指向一个字符串 int main() {/*char ch q;char* pa &ch;*/char* ph "hello world";printf("%c\n", *ph);//打印遇到\0才会结束,没数据会打印随机值…

pybind11学习 | VS2022下安装配置

pybind11是一个只有头文件(header-only)的轻量级库,其主要目的是建立C的Python代码绑定,实现C和Python无缝连接。我学习这个工具的目的,是为了能够在Python中调用C代码实现一些计算密集型任务,同时培养自己…

Java后端核心技能知识点

今天带来的是2022全新升级的《Java岗面试核心版》,这个版本里面不仅仅包含了面试题,还有更多的技术难点、大厂算法、实战项目、简历模板等等,全册接近1700页!相比上一个版本的287页,升级了多少内容你懂的 大概内容&am…

南京邮电大学编译原理实验二(语法分析程序)

文章目录一、文法二、源代码模块(一)消除文法的左递归(二)求First集(三)求Follow集(四)构建LL(1)分析表(五)符号串分析(六)主函数三、…

破解色带现象(下)

编者按:本文是“破解色带现象”文章的第二部分,Fabio Sonnati进一步 分析了色带现象产生的原因,并提供了新的检测办法。本文已获得作者授权转载。翻译:Argus原文链接:https://sonnati.wordpress.com/2022/09/16/defea…

Flink实战案例四部曲

Flink实战案例四部曲 第一部曲:统计5分钟内用户修改创建删除文件的操作日志数量 输入 1001,delete 1002,update 1001,create 1002,delte 输出 1001,2 1002,2代码如下。 import org.apache.flink.streaming.api.environment.StreamExecutionEnvironmen…

Anlios装grouplist 组件之后报错,安装tiger-vncserver

因为之前升级了一个epel-release源,然后containerd也装进去了,但是版本太低 然后以为是runc挡住了,发现没有runc 删完了containerd就可以装了 rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm dnf install wntp…

【性能篇】30 # 怎么给WebGL绘制加速?

说明 【跟月影学可视化】学习笔记。 常规绘图方式的性能瓶颈 例子&#xff1a;在一个画布上渲染 3000 个不同颜色的、位置随机的三角形&#xff0c;并且让每个三角形的旋转角度也随机。 <!DOCTYPE html> <html lang"en"><head><meta charse…

SpringBoot+Vue实现前后端分离的高校思政课实践教学管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

基于SSM的大学生心理健康系统设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 网站前台&#xff1a;关于我们、联系信息、文章信息、咨询师信息、服务信息、测试信喜 管理员功能&#xff1a; 1、管理…

继续谈谈从Rxjava迁移到Flow的背压策略

前言 对于背压问题不久前就讨论过了&#xff0c;这里就不过多介绍了&#xff0c;总之它是一个非常复杂的话题&#xff0c;本文的主要目的是分析我们如何从Rxjava迁移到Flow并且使用其背压方案&#xff0c;由于本身技术的限制以及协程内部的复杂性&#xff0c;不会做过多的深入…

下载安装PyTorch

1、下载并安装Visual Studio Code选择合适版本安装 2、下载安装conda并配置环境 下载方式一&#xff1a;官网下载 下载方式二&#xff1a;清华镜像安装 3、conda配置环境 打开电脑高级系统配置点开系统环境变量&#xff1a; 找到path然后点击Edit或者直接双击&#xff1a; 之后…

利用LSTM识别篇章关系实战代码+数据

1.显式篇章关系分类概述 案例知识点: 任务描述:篇章关系分析是自然语言中处理篇章级基础语言分析任务,其目的是利用规则或机器学习等计算机处理手段判别篇章各组成成分之间的修辞逻辑关系,从而从整体上理解篇章。其中论元之间有连接词连接的此类关系称为显式篇章关系。本教…

实验七、MOS管分压式偏置共源放大电路的静态和动态参数

一、题目 搭建MOS管分压式偏置共源放大电路。利用Multisim研究下列问题&#xff1a; &#xff08;1&#xff09;确定一组电路参数&#xff0c;使电路的 QQQ 点合适。 &#xff08;2&#xff09;若输出电压波形底部失真&#xff0c;则可采取哪些措施&#xff1f;若输出电压波形…

Mysql概念知识

Mysql数据库基础知识为什么要使用数据库数据保存在内存数据保存在文件数据保存在数据库什么是SQL&#xff1f;什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有几种录入格式&#xff1f;分别有什么区别&#xff1f;数据类型mysql有哪些数据类型引…