交换式以太网,IP路由互联网,PCIe总线,这些都不再是 共享资源的随机系统 了,它们都进化成了 排队系统 ,如今这种共享资源的随机系统,只剩下了TCP!

由于人们已经不再记得CSMA/CD,绝大多数人对TCP存在跪舔式的误解,我还是一如既往地喜欢喷TCP!但本文不是。本文没时间扯TCP,没意思。

一个共享资源的随机系统,什么最重要?是性能,还是公平性?业内普遍的结论是公平性,这才招致了很多人剑走偏锋在性能上走火入魔,比如TCP加速这种。但凡优化性能的,就一定会损失公平性,然而,who care…

二进制指数退避算法,就是共享资源随机系统的一个伟大的算法。


记得刚学计算机网络课程的时候,讲过CSMA/CD算法,这是一个共享总线式的随机协同系统,没有控制中心安排节点发送数据的顺序,大家也都彼此不沟通,然而神奇的是, 所有节点 想什么时候发送数据就能什么时候发送,只要在发现冲突后遵循指数退避等待相应的时间后再重发即可!

这个指数退避规则很简单,本文不会详细描述,直接百度一下就好。

后来,我们学习了TCP协议,并且任何教科书上都会讲到TCP超时定时器的处理,最终我们学到了, TCP超时时间也是指数退避的。

TCP和早期共享总线以太网貌似八竿子打不着,但是却遵循了同样一个指数级退避原则,这里面必有关联。

后来,哦,不,是直到很久以后,我们觉得TCP是个端到端主机协议,对于真正的网络而言,它和早期的供共享总线的以太网对链路的认知一样,就是个盲人。

所以,我们可以把整个互联网看作是一个共享总线(实际上是共享带宽)的以太网,TCP节点节点就是CSMA/CD的主机,TCP节点之间互相不沟通,但是它们却和CSMA/CD系统的主机一样,想什么时候发送就什么时候发送,只要遵循 退避原则 即可。

  • 对于CSMA/CD以太网而言,冲突意味着要退避;
  • 对于TCP而言,超时意味着要退避(至于什么快速重传,那是后来的事情,一开始只有超时!)。

现在问题来了, 退避为什么要指数级退避,而不是减法退避,或者乘以某个系数退避?

这个问题,此后再也不好找答案。

不信你去搜搜,看看有没有解释这个,如此简单的事实却没有人从数学上去解释…

本文,我来通俗解释二进制指数退避算法的缘由。即为什么是二进制指数退避,而不是减法退避,也不是固定系数乘法退避。


当知道了二进制退避算法的具体操作之后,谁还会在乎Why呢?知道Why并不会多赚钱,不会晋升,也不会让老婆称赞…

但是知道Why,会使人开心。


二进制退避算法,其实换个名字,就很好理解了,那就是 确定系统中的节点数量,并找到自己的slot。

是的, 节点iii在和一群互相不通信不沟通的系统nnn个节点的资源争抢博弈中,找到自己slotislot_isloti​。

为什么是二进制指数退避,要先从二分法说起。不要纠结于什么二进制指数退避这种名子,所谓的二进制指数退避,你就把它当成 二分法探测 就好了。


系统中的节点是彼此不沟通的,没有任何一个节点知道系统的全局情况,这是一个真正随机的分布式系统。

一开始,节点nnn假设整个系统只有节点nnn自己,这是一个初始状态,于是它开始直接使用共享资源,忽略其它节点的存在,直到一个 冲突事件 将其纠正。

节点nnn检测了冲突,以太网冲突信号或者TCP超时,它怎么办呢?

它理所当然会认为 系统中至少还存在着另外一个节点。 于是节点nnn会把自认为全部属于自己的资源让出一半给这个想象中的竞争者。于是,节点nnn的资源降低为之前的一半试试看。

同样收到冲突信号的另一个节点也会相应地假设。

现在假设总资源分别被如二者分成了两份,那么两个节点该如何判断哪一份是属于自己的呢?由于系统运作的前提是所有节点彼此不沟通,那么,最好的方案就是 随机 。即:
两个节点随意使用一共2个slot的资源。
这样两个节点共享两个slot,它们还是有冲突的可能,它们有50%50\%50%的可能会争抢同一个slot…

问题是,像这样,两个节点再次出现冲突,怎么办?

答案只能是(算法的要求,为什么?这点后面会说)继续二分退避。此时冲突的概率就降低到了25%25\%25%,如果再次冲突,就再次二分退避,冲突概率继续降低到12.5%12.5\%12.5%…

两个节点的情况下,如此反复,最终,两个节点之间不冲突的概率随着冲突次数而降低,序列就是(1−12),(1−14),(1−18),...,(≈1)(1-\dfrac{1}{2}),(1-\dfrac{1}{4}),(1-\dfrac{1}{8}),... ,(\approx 1)(1−21​),(1−41​),(1−81​),...,(≈1),即 如果继续二分切分资源,互不沟通的两个节点总会不冲突把数据发送成功的!

第一个推论已经完成。就像做菜一样,放在一边,备用。


接下来继续分析。我来推倒多米诺骨牌。


事实上,由于每个节点对系统的理解都是局部的,没有任何节点具有全局视图,因此,没有哪个节点知道系统中一共有多少节点。

当节点在第一次检测到冲突后退避了一半的资源之后再次检测到冲突,该节点无法分辨下面的两种情况:

  1. 和唯一另外的节点再次以50%50\%50%的概率发生了冲突;
  2. 出现了第三个节点,并与其发生了冲突。

根据以上分析,当第一种情况发生时,按照二进制指数减半资源的使用,是可以趋向于成功抢占资源的。那么问题就是第二种情况如何处理。

最优美的答案就是唯一的答案, 那就是和第一种情况一样,既然无法区分两种情况,那就全部当成第一种情况!

如果出现第三个节点,由于随机协作系统所有节点都是公平对等的,所有 这第三个节点对于既有的两个节点的影响是均等的。 也就是说,既有的每一个节点均需要 假设有一个新的节点与之竞争。 这个新的节点对既有的两个节点的影响,在 概率上 是相等的。按照协作系统公平性假设,检测到冲突的节点就需要出让一半的资源给潜在的竞争者。

  1. 如果某个节点第一次遭遇冲突,那么它假设检测到第111个共存节点,自身可利用资源承诺自减到12\dfrac{1}{2}21​
  2. 在承诺的12\dfrac{1}{2}21​资源中使用,如果再检测到冲突,那么它假设检测到第222个共存节点,自身可利用资源承诺自减14\dfrac{1}{4}41​,另一个节点也同样概率检测到该冲突
  3. 在承诺的14\dfrac{1}{4}41​资源中使用,如果再检测到冲突,那么它假设检测到第333个共存节点,自身可利用资源承诺自减18\dfrac{1}{8}81​,另两个节点也同样概率检测到该冲突

把这个基本事实归纳下去。所以,结论就是:

不管系统中当前有多少(≥2\geq2≥2)节点,只要检测到冲突(CSMA/CD检测到冲突信号,或者TCP超时),检测节点均要假设有一个节点与之进行公平对等竞争,检测节点均需要分配一半资源给与之冲突的节点:

假设kkk为冲突次数,那么节点需要退避到的资源使用率就是(12)k(\dfrac{1}{2})^k(21​)k,由于网络分层协议的保证,为了保证效率,kkk一般会有最大值约束,超过该最值,则传输放弃。

以上这些话,就是 二进制指数退避算法 的具体操作要旨!


理解了上面的描述,对于理解 为什么是减半,而不是减1 就很容易了。这是因为,只有减半才能让系统平衡。

二进制指数退避算法,只是共享资源的随机系统中的 一种可行的确保稳定的算法,而不是最高效的算法。

CSMA/CD的冲突检测退避算法就是一个简单的优化。它采用了 再随机算法 平滑了误判的影响。

所谓的误判,就是上面两点之间的误判,重复一遍:

  1. 和唯一另外的节点再次以50%50\%50%的概率发生了冲突;
  2. 出现了第三个节点,并与其发生了冲突。

所以,假设一个节点已经经历了iii次冲突,按照二进制指数退避算法,它理应退避到(12)i(\dfrac{1}{2})^i(21​)i的资源使用,然而搞不好其它所有节点都是新来的呢,所以,大家再次随机,让每个检测到冲突的节点,在{0,12,...(12)k}\{0,\dfrac{1}{2},...(\dfrac{1}{2})^k\}{0,21​,...(21​)k}中随机选择一个作为资源退避的份额即可。


总结来讲, 二进制指数退避算法 ,如果不叫这个名字,改作 二分法资源探测算法 ,我想就更加容易被理解了。你要明白,适用这个算法的系统,必须有以下特征:

  • 节点随机使用资源;
  • 节点完全公平对等;
  • 节点间互不知情。

同时,我们要知道,正是因为上述的第3点解耦合带来的灵活性,造成了:

  • 二进制指数退避算法不是最优的。

但是,无论如何,它是:

  • 公平的;
  • 稳定的。

所以,它是:

  • 优美的!

此外,所有的共享总线资源随机分布式系统,均可以转化为排队系统,比如:

  • 总线式以太网转换为交换式以太网
  • PCI总线转换为PCIe总线
  • 缓存一致性协议中的写操作

只有IP路由网络,一开始就是排队系统…

无论是哪种,它们的核心都是 资源的统计复用。


当然了,我知道有人会觉得我这天天分析这种简单又不赚钱不讨好的东西,很low,没关系,我觉得你也很low,人各有所好,不可强求,不在一个频道上,所以我也不屑交流。

我敢肯定,绝大多数人是不懂这些东西的,网上也很少几乎没有人去分析,所以,我想帮助这些希望获得答案的人。仅此。

谈谈CSMA/CD,TCP中的二进制指数退避算法相关推荐

  1. 【学习笔记】数据链路层——随机访问介质访问控制(ALOHA、CSMA、CSMA/CD、CSMA/CA),截断二进制指数规避算法

    文章目录 小前言 一. ALOHA协议 纯ALOHA协议 时隙ALOHA协议 ALOHA对比 CSMA协议 定义与分类 ① 1-坚持CSMA ② 非坚持CSMA ③ p-坚持CSMA 总结 CSMA/ ...

  2. 截断二进制指数退避算法c++实现

    算法概述: 二进制指数类型退避算法 (truncated binary exponential type)(CSMA/CA检测到冲突,中止后随机重发使用的算法) 发生碰撞的站在停止发送数据后,要推迟( ...

  3. 【计算机网络】数据链路层 : CSMA/CD 协议 ( 载波监听多点接入 / 碰撞检测 协议 | 单程端到端传播时延 | 截断二进制指数规避算法 | 计算示例 | 最小帧长问题 )★

    文章目录 一. CSMA/CD 协议 二. 传播时延对于 载波监听 的影响 三. 单程端到端传播时延 相关概念 四. 碰撞后重传时机 ( 截断二进制指数规避算法 ) 五.截断二进制指数规避算法 计算示 ...

  4. Exponetial BackOff(指数退避算法)

    一:介绍 指数退避算法的定义和使用可以在网上搜搜.提供一下wiki的介绍部分定义:an algorithm that uses feedback to multiplicatively decreas ...

  5. python udp socket解决服务端响应时间长的指数退避算法

    UDP连接是一个不可靠的连接,也就是说,UDP通信过程中可能出现数据包丢失的情况,或者是服务端宕机后,客户端不知道服务端状态,仍然不停的访问服务端的情况.针对这一情况,UDP客户端必须选择一个等待时间 ...

  6. CSMA/CD协议详解!!!

    最早的以太网是将许多计算机都连接到一根总线上. 总线的特点 当一台计算机发送数据的时候,总线上的所有计算机都能检测到这个数据.这就是广播通信方式.当我们需要在总线上进行一对一通信的时候,就需要使每一台 ...

  7. 计算机网络【2】—— CSMA/CD协议

    参考文献: https://blog.csdn.net/loveCC_orange/article/details/79177129 一.认识以太网 最早的以太网是将许多计算机都连接到一根总线上. 使 ...

  8. 计算机网络之CSMA/CD协议

    一.CSMA/CD(多点接入载波监听/冲突检测)协议 多点接入说明是总线型网络,计算机以多点接入的方式连接在一根总线上,协议的实质是"载波监听"和"碰撞检测". ...

  9. 信道分类、信道复用技术、CSMA/CD 协议、PPP 协议、MAC 地址、局域网、以太网、交换机、虚拟局域网

    1.信道分类 1.1 广播信道 一对多通信,一个节点发送的数据能够被广播信道上所有的节点接收到. 所有的节点都在同一个广播信道上发送数据,因此需要有专门的控制方法进行协调,避免发生冲突(冲突也叫碰撞) ...

  10. CSMA/CD协议分析笔记

    CSMA/CD协议分析笔记 CSMA/CD(carrier sense multiple access with collision detection) 文章目录 CSMA/CD协议分析笔记 前言 ...

最新文章

  1. Linux查看进程线程个数
  2. 整数展示分数和整形数的四则运算
  3. Spring boot 参数校验
  4. (转)Go语言核心36讲之Go语言入门基础知识
  5. php mysql筛选查询,php-Vicidial的MySQL筛选器
  6. Hibernate环境搭建以及HelloWorld
  7. Java黑皮书课后题第10章:10.3(MyInteger类)设计一个名为MyInteger的类
  8. C# 死锁的原理与排查方法详解
  9. Java学习之String StringBuffer StringBuilder区别
  10. 进程的创建-Process子类(python 版)
  11. pip is configured with locations that require TLS/SSL
  12. datagrid 什么时候结束编辑_小规模纳税人免税政策什么时候结束?有答复了
  13. 没有microsoft store(微软商店)或下载过慢解决方法
  14. javascript开发植物大战僵尸网页版游戏源代码下载
  15. 34.ADC基本原理与配置
  16. 计算机网络传输速度单位换算,网络速度单位换算
  17. python坦克大战游戏_python实现简单坦克大战
  18. 什么是短信平台api接口?
  19. 买投影仪选当贝还是极米,哪个投影仪最好用
  20. IOS 调用第三方地图APP导航

热门文章

  1. 【BZOJ 4551】【TJOI2016】【HEOI2016】树
  2. Windows 2008 防火墙开放端口
  3. Spring bean 通过实现 InitializingBean ,DisposableBean 接口实现初始化方法和销毁前操作
  4. 译 - Cassandra 数据建模的基本规则
  5. Go 标准库介绍五: io
  6. 优雅地关闭kubernetes中的nginx
  7. 4-MSP430定时器_定时器中断
  8. 【RAC】 RAC For W2K8R2 安装--创建ASM磁盘组(六)
  9. Java实时读取日志文件
  10. Android访问WCF服务(上篇)-服务端开发