二进制指数退避算法

2019/12/18

二进制指数退避算法(来自于百度百科)

  CSMA/CD采用二进制指数退避算法,又称为二元指数后退算法。退避算法是以冲突窗口大小为基准的,每个节点有一个冲突计数器C。退避的时间与冲突次数具有指数关系,冲突次数越多,退避的时间就可能越长,若达到限定的冲突次数,该节点就停止发送数据。

定义

  二进制退避技术Binary Exponential Back off). 指在遇到重复的冲突时,站点将重复传输,但在每一次冲突之后,随着时延的平均值将加倍。二进制指数退避算法提供了一个处理重负荷的方法。尝试传输的重复失败导致更长的退避时间,这将有助于负荷的平滑。如果没有这样的退避,以下状况可能发生:两个或多站点同时尝试传输,这将导致冲突,之后这些站点又立即尝试重传,导致一个新冲突。

应用

CSMA/CD协议中,一旦检测到冲突,为降低再冲突的概率,需要等待一个随机时间,然后再使用CSMA方法试图传输。为了保证这种退避维持稳定,采用了二进制指数退避算法的技术,其算法过程如下:

1.确定基本退避时间,一般为端到端的往返时间为2t,2t也称为冲突窗口或争用期。

2. 定义参数k,k与冲突次数有关,规定k不能超过10,k=Min[冲突次数,10]。在冲突次数大于10,小于16时,k不再增大,一直取值为10。

3. 从离散的整数集合[0,1,2,……,(2k-1)]中随机的取出一个数r,等待的时延为r倍的基本退避时间,等于r x 2t。r的取值范围与冲突次数k有关,r可选的随机取值为2k个、这也是称为二进制退避算法的起因。

4.当冲突次数大于10以后,都是从0—210-1个2t中随机选择一个作为等待时间。

5. 当冲突次数超过16次后,发送失败,丢弃传输的帧,发送错误报告。

举例

如果第二次发生碰撞:

n = 2

k = MIN(2,10) = 2

R = {0, 1, 2, 3)

延迟时间 = R * 512 * Bit-time

其中:Bit-time = 1 / Debit

例如:

对于传输速率Debit = 10 Mbit/s,

那么Bit-time = 0.1 us

延迟时间={0, 51.2 us, 102.4 us, 153.6 us} 其中任取一


---内容来源于百度百科

原文地址:https://www.cnblogs.com/LinQingYang/p/12064096.html

时间: 2024-08-23 22:48:28

二进制指数退避算法的相关文章

【算法】6、指数退避算法

今天简单跟大家聊下指数退避算法(Exponential Backoff ),关于指数避退算法的话题开始前首先向大家抛出几个问题:指数退避算法是什么呢?为什么要用指数退避算法呢?指数退避算法的应用场景有哪些呢?代码如何实现呢?带着这些疑问诸君且向下看. 指数退避算法到底是什么呢?wiki上有这么一段解释:"Exponential backoff is an algorithm that uses feedback to multiplicatively decrease the rate of s

指数退避算法exponential back-off algorithm

在很多场景下,我们都需要解决一些诸如轮训这样的问题.如果这样的算法出现在app上,这种轮训对于app性能和电量的消耗都是个巨大的灾难,那如何解决这种问题呢? app在上一次更新操作之后还未被使用的情况下,使用指数退避算法exponential back-off algorithm来减少更新频率.这里我们介绍下指数退避算法. SharedPreferences sp = context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE)

golang backoff重试指数退避算法

前言: 前时间出了一个小问题,下游的服务时不时的阻塞,我这边为了确保数据一致性,不断的重试请求,这样的后果自然是雪上加霜.当然,下游处理的有待提高,但我们是否有更好的办法来优化重试? backoff 指数退避算法就是干这事的. 该文章后续仍在不断的更新修改中, 请移步到原文地址http://xiaorui.cc/?p=5836 backoff 退避算法 什么是退避算法?通常我们的某服务发生故障时,我们会固定间隔时间来重试一次?但这样会带来一些问题,同一时间有很多请求在重试可能会造成无意义的请求.

Golang指数退避算法

package main import ( "fmt" "time" ) const MAXSLEEP = 128 func main() { for numsec := 1; numsec <= MAXSLEEP; numsec <<= 1 { // TODO if numsec <= MAXSLEEP/2 { time.Sleep(time.Second * time.Duration(numsec)) fmt.Println("

[Android Traffic] 调整定时更新的频率(C2DM与退避算法)

转载自: http://blog.csdn.net/kesenhoo/article/details/7395253 Minimizing the Effect of Regular Updates[最小化定时更新操作的副作用] 最佳的定时更新频率是不确定的,通常由设备状态,网络连接状态,用户行为与用户定义明确的偏好而决定. Optimizing Battery Life([Android Training - 04]优化电池寿命)这一章有讨论如何根据设备状态来修改更新频率.里面介绍了当断开网络

二进制最大公约数算法

求最大公约数的Euclid算法需要用到大量的取模运算,这在大多数计算机上是一项复杂的工作,相比之下减法运算.测试数的奇偶性.折半运算的执行速度都要更快些. 二进制最大公约数算法避免了Euclid算法的取余数过程. 二进制最大公约数基于下述事实: 若a.b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2) 若a是奇数.b是偶数,则gcd(a,b)=gcd(a/2,b/2) 若a.b都是奇数,则gcd(a,b)=gcd((a-b)/2,b) 因此可写出二进制最大公约数算法如下(C语言版):

指数平滑算法

对时间序列的预测,用的最多的是指数平滑算法,算法不复杂. 首先理解一个基本公式: 指数平滑法的基本公式是: 式中, St--时间t的平滑值: yt--时间t的实际值: St ? 1--时间t-1的平滑值: a--平滑常数,其取值范围为[0,1]: 说明: 1. 此公式用t-1时刻的平滑值和t时刻的hi实际值来计算t时刻的平滑值 2. a是系数,越接近1的话,远期数据对于计算结果影响越小,越接近0,则影响越大 用newlisp表达公式如下: (define (cal-basic real-t1 s

时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息

from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在之后的走势,三次指数平滑(Triple/Three Order Exponential Smoothing,Holt-Winters)算法可以很好的进行时间序列的预测. 时间序列数据一般有以下几种特点:1.趋势(Trend)  2. 季节性(Seasonality). 趋势描述的是时间序列的整体走势

二进制转换十进制 算法解析

java里面是有进制间互换现成的方法的: public class 十进制与各进制的相互转换 { public static void main(String[] args){ //java已经实现的机制:十进制转换为二进制 int decimal = 10; System.out.println("十进制数:"+decimal+",转换为二进制:"+Integer.toBinaryString(decimal)); System.out.println("