5分钟搞懂ECN

ECN是通过在IP和TCP头中携带拥塞信息,通知发送方网络拥塞状态,从而采取相应拥塞控制措施。原文: What is ECN(Explicit Congestion Notification)?[1]

ECN是Explicit Congestion Notification的缩写,意思是显式拥塞通知算法,和慢启动重启或者AIMD那样的拥塞控制算法不一样,ECN只做一件事情,即将路由器的拥塞状态通知给发送方。因此,ECN是一种拥塞通知或拥塞信令算法,通知发送方有关拥塞的情况,以便采取相应措施避免拥塞。

ECN是RFC 3168中定义的拥塞信令机制,首次发表于1999年,并在2001年左右定稿。ECN利用TCP报头中的两位和IP报头中的两位标记数据包(标记的意思是在头域中翻转一位)。

=>假设X让人给Z转交一封信。

=>X将信传递给中间人Y。

=>Y先看看自己忙不忙。

=>如果Y比较忙,就在信封的一角用钢笔做个十字记号,然后把信传给下一个人。

=>当Z收到信时,看到信封一角有十字标记,就知道其中一个中间人现在比较忙。

=>Z沿原路径给发送方X发送ACK, ACK信封上带有相同的标记。看到这个标记,X就知道发生了拥塞。

ECN可以与AQM算法一起使用。AQM算法在链路拥塞时会主动丢弃数据包,但如果不是丢包,而是可以标记,那就太好了。由于ECN不会丢弃数据包,从而避免了重传,这就是为什么ECN算法今天非常流行。目的只是让发送方知道路由器发生了拥塞,所以如果可以通过ECN告诉发送方,为什么要丢包呢?此外,丢包没法让发送方立马知道发生了拥塞,而这对于时间敏感型数据包非常重要,因为这种类型的流量不高。

为了使用ECN机制,发送方、接收方和中间的路由器必须全部支持ECN功能。目前,ECN可以在所有操作系统中实现,比如手机、服务器、笔记本电脑,包括路由器等中间设备。但默认情况下是禁用的,原因不是ECN有什么问题,而是因为ECN与AQM算法一起部署,而由于参数配置的原因,AQM并不太受欢迎。

TCP报头中的ECN位:

alt
alt

ECN在TCP头中占用2位,分别是CWR和ECE,注意两者的顺序。

  • CWR: Congestion Window Reduced,拥塞窗口减少标志
  • ECE: Echo of Congestion Encountered,拥塞响应

这2位有4种可能组合,每种组合被称为码点(codepoint)。

ECN TCP报头中的码点:

CWRECE码点发送自目标
100Non-ECN set up任意任意
201ECN Echo接收方发送方
310Congestion window reduced发送方接收方
411ECN Setup发送方接收方
  • [0 0]为非ECN设置码点,收发双方都可以发送。X发送给Y这个代码点的意思是X告诉Y它不支持ECN。
  • [0 1]为ECN Echo码点,由接收方发送给发送方。如果发送方告诉接收方他支持ECN,接收方会告诉发送方自己是否支持ECN。如果接收方支持ECN,那就用这个码点回复。此外,接收方告诉发送方拥塞时也使用此码点。因此这个码点有两种用法。
  • [1 0]为CWR码点,由发送方发送给接收方。此码点用作从发送方发送到接收方的确认,用于告诉接收方,它知道发生了拥塞,已经减小了拥塞窗口大小。
  • [1 1]为ECN设置码点,由发送方发送给接收方,告知发送方支持ECN。

ECN协商:

alt
  • 第一步: 发送方发送带有ECN设置码点(CWR=1, ECE=1)的SYN包,告诉接收方它支持ECN。在通过三次握手建立TCP连接时,这些信息总是以SYN包的形式传递,而接收方也必须回复ECN的状态。
  • 第二步: 如果接收方支持ECN,就发送ECN Echo码点(CWR=0, ECE=1),表示接收方也启用了ECN。假设接收方不支持ECN,那么回复非ECN设置码点(CWR=0, ECE=0),表示没有启用ECN。
  • 第三步: 现在,发送方和接收方已经交换了ECN信息,可以像正常一样发送数据。

如果发送方和接收方都支持ECN,并且都标记而不是丢弃数据包。但由于路由器不能读取TCP报头,只能读取IP报头,因此在IP报头中也用2位来通知路由器有关ECN的信息。

IP报头中的ECN位:

alt
alt

路由器需要运行AQM并标记数据包,因此必须知道发送方和接收方是否启用了ECN。由于路由器不能访问TCP报头,所以在IP报头中增加了2位作为ECN码点。

第一位被称为ECT(ECN Capable Transport),第二位被称为CE(Congestion Encountered)。同样会有四个码点,但和之前介绍的不太一样。

IP报头中的ECN码点:

ECTCE码点发送自目标
100Non-ECT任意任意
201ECT(1): ECN Capable Transport发送方接收方
310ECT(0): ECN Capable Transport发送方接收方
411CE: Congestion Experienced路由器接收方
  • [0 0]表示非ECT,意思是数据包不支持ECN,因此没有必要标记该数据包。如果有拥塞,那么这个数据包必须被丢弃。
  • [0 1]是ECT(0)码点,表示数据包支持ECT。
  • [1 0]为ECT(1)码点,也表示数据包支持ECT。如果数据包是ECT(0)或(1),那么这个数据包将不会被路由器丢弃,而只是会被标记。
  • [1 1]为CE码点。当路由器拥塞并且数据包支持ECT时,路由器将该数据包标记为CE。路由器将翻转ECT码点的0位,使其成为CE。路由器不丢包,而只是标记并将其传输给接收者。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料

[1]

What is ECN(Explicit Congestion Notification)?: https://www.geeksforgeeks.org/what-is-ecnexplicit-congestion-notification

- END -

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】2621. 睡眠函数

睡眠函数 Promise异步 题目题解 题目 请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1: 输入:millis 100 输出:100 解释: 在 100ms 后此异步…

Java多线程:代码不只是在‘Hello World‘

Java线程好书推荐 概述01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写在末尾: 主页传送门:📀 传送 概述 摘要:互联网的每一个角落,无论是大型电商平台的秒杀…

<JavaEE> 多线程编程中的“等待和通知机制”:wait 和 notify 方法

目录 一、等待和通知机制的概念 二、wait() 方法 2.1 wait() 方法的使用 2.2 超时等待 2.3 异常唤醒 2.4 唤醒等待的方法 三、notify() 方法 四、notifyAll() 方法 五、wait 和 sleep 的对比 一、等待和通知机制的概念 1)什么是等待和通知机制&#xff1f…

若依框架的搭建

若依框架 若依框架的搭建(前后端分离版本)环境要求IDEA拉取Gitee源码Mysql 配置Redis 配置后端启动前端配置问题解决 效果展示 若依框架的搭建(前后端分离版本) 简介 RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基…

线程池(Linux +C)

参考 手写线程池 - C语言版 | 爱编程的大丙 (subingwen.cn) 目录 1.为什么需要线程池? 1)线程问题: 2)如何解决线程问题(线程池的优势): 2.线程池是什么? 1)线程的…

无公网IP环境Windows系统使用VNC远程连接Deepin桌面

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

Hadoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

使用pandas制作图表

数据可视化对于数据分析的重要性不言而喻,一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib实现绘图。能够提供各种各样的图表功能,包括: 单折线图多折线图柱状图叠加柱状图水平叠加柱状图直方图拆分直方图箱型图区域块图形散点图饼图多子…

Linux AMH服务器管理面板本地安装与远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装…

MySQL老是卸载不干净,不会删除注册表,安装总是报错

给大家推荐一款非常使用的工具 geek点击官网下载。 安装完成主页就长这样: 右键点击你要删除的MySQL卸载即可。自动帮你清空注册表等信息。 谁用谁知道!!! 用了感觉不错的话记得回来给我点赞加评论哦!!&…

科普小知识-3D 打印是什么?

3D 打印是什么?作为近年来备受关注的前沿科技,3D 打印技术正在不断改变着制造业、医疗领域、艺术设计等多个领域的面貌。其又被称为增材制造,是一种通过电脑设计,逐层堆叠材料来创建三维物体的技术。 3D 打印的基本原理 3D 打印…

数据库的索引

索引的特点 1)加快查询的速度 2)索引自身是一种数据结构,也要占用存储空间 3)当我们需要进行增删改的时候,也要对索引进行更新(也需要额外的空间开销) sql操作 查看索引 show index from …

安装postgresql驱动及python使用pyodbc指定postgresql驱动调用postgresql

注:Python解释器版本(32位/64位)和postgresql驱动版本(32位/64位)需一致。 一、安装postgresql驱动 https://www.postgresql.org/ftp/odbc/versions/msi/ (1)32位: (2)64位: 双击安装。全程默…

如何让软文更具画面感,媒介盒子分享

写软文这种带有销售性质的文案时,总说要有画面感,要有想象空间。只有针对目标用户的感受的设计,要了解用户想的是什么,要用可视化的描述来影响用户的感受,今天媒介盒子就和大家分享:如何让软文更具画面感。…

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参,参数带特殊字符,axios调接口特殊字符丢失的问题 例如接口: get/user/detail/{name} name是个参数直接调接口的时候拼到接口上,get/user/detail/test123#$%&am…

IntelliJ IDEA图形安装教程

IntelliJ IDEA图形安装教程 之前开始Java程序,一直用的eclipse,觉得还可以。一直听说IntelliJ IDEA比eclipse好用很多,但因为比较懒,也没有学习使用。机缘巧合下,尝试用了下,顿时有种相见恨晚的感觉&#…

如何核销百川云网站监测兑换码

注册/登录百川云平台 在电脑端输入百川云网址“https://rivers.chaitin.cn/“,会出现以下界面: 2.点击右上角“立即注册”,使用微信扫一扫注册,注册成功之后,系统会自动跳转到百川云工作台。 免费开通“百川云网站监测…

什么是HTTPS加密协议? ️

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

FreeRTOS系统延时函数分析

一、概述 FreeRTOS提供了两个系统延时函数,相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束,绝对延时是指每隔指定的时间,执行一次调用vT…

水声功率放大器是什么(驱动水声换能器的原理是什么)

水声功率放大器是一种用于增大水声信号的电子设备。它是水声系统中的关键部件,通常用于驱动水声换能器,将低功率的电信号转换为高功率的水声信号。 水声功率放大器是声呐发射机的重要组成部分,用来提高输出功率,驱动换能器向水中辐射足够能量…