当前位置: 首页 > news >正文

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

目录

一、拥塞控制

二、延迟应答


一、拥塞控制

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、延迟应答

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

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

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

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

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

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

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

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

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

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端和Postman调用同一个接口,拿到的数据不一样
  • Visual Studio 2022美化
  • GitHub每日最火火火项目(7.26)
  • 反序列化-极客大挑战2019php【I have a cat!】
  • 【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计
  • 《MySQL DBA 修炼之道》—— 第一章 入门篇
  • 我在百科荣创企业实践——简易函数信号发生器(6)
  • Vue3--
  • 设计模式 C++简单工厂简单例子
  • github的Codespaces是什么
  • Scikit-learn简介
  • k8s多集群管理工具kubecm
  • 【leetcode】两数之和【简单】( 注释详解:C++map/ C哈希表)
  • 高级java每日一道面试题-2024年7月27日-并发篇-Thread类中的yield方法有什么作用?
  • 基于STM32的多协议通信系统设计与实现
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2019.2.20 c++ 知识梳理
  • Docker: 容器互访的三种方式
  • ES2017异步函数现已正式可用
  • input实现文字超出省略号功能
  • JavaScript类型识别
  • JS笔记四:作用域、变量(函数)提升
  • js算法-归并排序(merge_sort)
  • Less 日常用法
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • PermissionScope Swift4 兼容问题
  • PHP面试之三:MySQL数据库
  • Vue官网教程学习过程中值得记录的一些事情
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 初识MongoDB分片
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 看域名解析域名安全对SEO的影响
  • 巧用 TypeScript (一)
  • 如何使用 JavaScript 解析 URL
  • 突破自己的技术思维
  • 用Canvas画一棵二叉树
  • 在Mac OS X上安装 Ruby运行环境
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​Linux·i2c驱动架构​
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Panda3d 碰撞检测系统介绍
  • #宝哥教你#查看jquery绑定的事件函数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (正则)提取页面里的img标签
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core Web APi类库如何内嵌运行?
  • .net Stream篇(六)
  • .NET 常见的偏门问题
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net访问oracle数据库性能问题