Linux网络:传输层TCP协议(四)拥塞控制及延迟应答

目录

一、拥塞控制

二、延迟应答


一、拥塞控制

虽然 TCP 拥有滑动窗口这个大杀器机制来根据具体情况对发送的数据大小和速度进行实时控制, 能够高效并且可靠的发送大量的数据.

但是如果在双方建立好连接后的刚开始阶段就发送大量的数据。仍然可能引发一些问题. 因为同一个网络上有很多台计算机, 有可能当前的网络状态就已经较为拥堵.

在不清楚当前网络的状态下, 直接发送大量的数据, 是很有可能导致网络更加拥堵的.。所以TCP引入了慢启动机制,先发少量的数据,让其先去探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度来向对方传输数据。

此处引入一个新的概念称为拥塞窗口

发送开始的时候, 将拥塞窗口大小定义为1;

每次收到一个 ACK应答, 拥塞窗口的大小就加1;

每次要发送数据报文的时候, 将拥塞窗口的大小和接收端主机反馈的窗口大小进行比较, 取较小的值作为实际发送的窗口;

像上面这样的拥塞窗口的增长速度, 是指数级别的。 "慢启动" 只是指初使时较慢, 但是增长速度非常快。

为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍增长。

此处引入一个叫做慢启动的阈值来控制流量。

当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长。

当 TCP 开始启动的时候, 慢启动阈值等于窗口最大值;

在每次网络拥塞,超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1;

发生少量的丢包时, 仅仅是触发超时重传; 当大量的丢包出现时, 就认为是网络拥塞;

当 TCP 连接建立好通信开始后, 网络吞吐量就会逐渐上升; 随着网络发生拥堵, 吞吐量会迅速下降; 从而拥塞控制,归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力而采取的一种折中方案。

二、延迟应答

如果接收数据的主机接收到数据后立刻返回ACK应答, 根据拥塞控制和流量控制如果立马返回,这时候返回的窗口可能比较小。

假设接收端缓冲区为1MB。一次收到了 500KB的数据; 如果立刻应答, 返回的窗口就是500KB;

但实际上可能处理端的处理速度非常快, 10ms 之内就把500KB数据从缓冲区提出来了;

在这种情况下, 接收端处理的能力还远没有达到自己的极限, 即使窗口再放大一些, 也能正常处理过来;

如果接收端稍等一会再做应答, 比如等待 200ms 再做应答, 那么这个时候返回的窗口大小就是1M;

窗口越大, 网络的吞吐量就越大, 传输效率就会越高。

而我们的目标是在保证网络不拥塞的情况下尽量的去提高传输效率;

那么所有的包都可以进行延迟应答吗? 肯定也不是的;

数量限制: 每间隔N个包就应答一次;

时间限制: 超过最大的延迟时间就应答一次;

具体的数量和超时时间, 各个操作系统之间也有差异;

一般 N 取 2, 最大延迟时间取 200ms;

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

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

相关文章

Ubuntu转竖屏,文件解锁和查看mac地址命令记录

又到了摸索ubuntu的时间,记录几个命令. (1)横屏与竖屏模式互转 1)横屏转竖屏 xrandr -o left xrandr -o right 2)竖屏转回来为横屏 xrandr -o normal (2)文件/文件夹加上了小锁需解锁 1)文件加锁需解锁 sudo chmod 777 yourfilename 2)文件夹…

聊聊sysinfo结构体

sysinfo的定义 sysinfo 结构体的完整定义如下。这个定义包含了一些特定的类型,如 __kernel_long_t 和 __kernel_ulong_t,这些类型是为了在不同架构上提供一致的数据大小而定义的。以下是对这个结构体中每个成员的详细解释: struct sysinfo …

SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动

简简单单 Online zuozuo:欢迎商业合作 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo :联系我们:VX :tja6288 / EMAIL: 347969164@qq.com 文章目录 SpringBoot 通过集成 …

Ubuntu开机自启配置(基于service:以ROS和docker为例)

Ubuntu开机自启配置(以ROS和docker为例) 前言1. service介绍1.1 service命令的基本用法1.2. service命令的常用操作1.3. service命令与systemd的兼容性2. Example之开机启动ROS2.1 创建服务单元文件2.1.1 新建`.service`文件2.1.2 编写`.service`文件2.2 重新加载systemd配置…

怎么给PDF文件加密码?关于PDF文件加密的四种方法推荐

怎么给PDF文件加密码?给PDF文件加上密码是保护文件安全的一种重要方法,特别是当需要在不受授权的访问下保护敏感信息时。这个过程不仅仅是简单地设置密码,而是涉及到对文档内容和访问控制的深思熟虑。加密PDF文件可以有效防止未经授权的用户查…

杂谈(杂鱼谈论c语言)——2.大小端字节序

⼤⼩端字节序和字节序判断 当我们了解了整数在内存中存储后&#xff0c;我们调试看⼀个细节&#xff1a; #include <stdio.h> int main() {int a 0x11223344;return 0; } 调试的时候&#xff0c;我们可以看到在a中的 0x11223344 这个数字是按照字节为单位&#xff0c;…

creality ender2的3D打印经验教训

创想云-3D打印模型库-一体化3D打印平台 1.开机后要放一张白纸进行检查&#xff0c;看看打印头立平台的距离&#xff0c;如果太近&#xff0c;会灼烧平台&#xff0c;会造成下面的结果&#xff1a; 2.下载模型&#xff0c;可以在线切片&#xff0c;要看看是否要支撑 没有支撑可…

构建云原生Java应用

引言 云原生技术正在改变软件开发和部署的方式。云原生应用利用了云计算的优势&#xff0c;如弹性、可扩展性和高可用性。对于Java开发者来说&#xff0c;构建云原生应用意味着需要采用微服务架构、服务网格、持续部署等技术。本文将探讨如何设计和实现云原生Java应用。 云原…

vulntarget-a

实际部署之后的win7 ip: 192.168.127.128 具体攻击过程如下 win7 扫描服务 使用fscan扫描win 7中的服务以及漏洞 ./fscan -h 192.168.127.128 扫出来一个ms17-010以及通达oa的漏洞&#xff0c;既然有永恒之蓝的&#xff0c;直接上MSF就行了 msf6 > search ms17-010 msf6…

Bouncy Castle集成SM2与SM3

在Bouncy Castle库中&#xff0c;SM2和SM3是两种分别用于非对称加密和数字签名的密码算法&#xff0c;它们也可以结合使用&#xff0c;形成一种高安全性的加密签名方案&#xff0c;即SM2withSM3。以下是对SM2SM3的详细解释&#xff1a; 一、SM2算法 SM2是一种由中国国家密码管…

由CANoe自带协议栈在TCP断开连接时同时发送两条FIN报文引起的注意事项

在我写这篇文章CAPL如何在底层模拟TCP Server端断开TCP连接时,我发现了一个奇怪的现象。我为了使用CAPL组装报文的方式实现TCP Server断开连接的过程,插入一个网络节点作为Client端。为了让Client能够发起连接和发起断开连接,给网络节点配置了独立的TCP/IP Stack,也就是CAN…

D. Fun(cf962div3)

题意&#xff1a;找出满足abacbc<n&&abc<x的a&#xff0c;b&#xff0c;c的个数 分析&#xff1a;遍历a&#xff0c;遍历符合条件的b&#xff0c;找出两个式子c的最大值的最小值相加。 代码&#xff1a; #include<bits/stdc.h> using namespace std; ty…

学前教育优化算法,原理详解,MATLAB代码免费获取

学前教育优化算法&#xff08;Preschool Education Optimization Algorithm&#xff0c;PEOA)是一种受学前教育过程中孩童的活动行为启发而提出的元启发式优化算法。学前教育在儿童的早期发展中起着至关重要的作用&#xff0c;并为他们未来的学习旅程奠定基础。作为幼儿学习者发…

算法:常见时间复杂度

常见时间复杂度 O(1) - 常数时间复杂度O(log n) - 对数时间复杂度O(n) - 线性时间复杂度O(n log n) - 线性对数时间复杂度O(n^2) - 平方时间复杂度O(2^n) - 指数时间复杂度O(n!) - 阶乘时间复杂度 O(1) - 常数时间复杂度 定义&#xff1a;算法的运行时间与输入规模无关&#x…

【JavaScript】详解Day.js:轻量级日期处理库的全面指南

文章目录 一、Day.js简介1. 什么是Day.js&#xff1f;2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…

Android SurfaceFlinger——GraphicBuffer的生成(三十二)

通过前面的学习我们知道,在 SurfaceFlinger 中使用的生产者/消费者模型,Surface 做为生产者一方存在如下两个比较重要的函数: dequeueBuffer:获取一个缓冲区(GraphicBuffer),也就是 GraphicBuffer 生成。queueBuffer :把缓冲区(GraphicBuffer)放入缓冲队列中。 …

k3s节点内的服务发现与负载均衡

K3s 是一个轻量级的 Kubernetes 发行版&#xff0c;它简化了 Kubernetes 的安装和管理&#xff0c;同时保持了与 Kubernetes API 的兼容。在 K3s 中&#xff0c;服务发现与负载均衡的机制与标准的 Kubernetes 非常相似。以下是 K3s 中节点内服务发现与负载均衡的主要机制&#…

查看空闲gpu

如果你希望检查 Unix 或 Linux 系统上的 GPU 使用情况&#xff08;特别是查找空闲的 NVIDIA GPU&#xff09;&#xff0c;可以使用 NVIDIA 提供的命令行工具 nvidia-smi。 打开终端并输入以下命令&#xff1a; nvidia-smi 这个命令将输出你的 NVIDIA GPU 的当前状态&#xf…

Python | ValueError: could not convert string to float: ‘example’

Python | ValueError: could not convert string to float: ‘example’ 在Python编程中&#xff0c;类型转换是一个常见的操作。然而&#xff0c;当尝试将一个字符串转换为浮点数时&#xff0c;如果字符串的内容不是有效的浮点数表示&#xff0c;就会遇到“ValueError: could…

labview四字节转浮点数

1.labview四字节转浮点数 2.Labview怎么把串口接收到的数据转换成浮点数&#xff1f; Labview怎么把串口接收到的数据转换成浮点数&#xff1f;