CSMA/CD即载波侦听多路访问/冲突检测,是广播型信道中采用一种随机访问技术的竞争型访问方法,具有多目标地址的特点。它处于一种总线型局域网结构,其物理拓扑结构正逐步向星型发展。CSMA/CD采用分布式控制方法,所有结点之间不存在控制与被控制的关系。
——百度百科
协议要点
- 多点接入:即说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。
- 载波监听:利用电子技术检测总线上有没有其他计算机也在发送。因此载波监听就是检测信道,这是个很重要的措施。无论是在发送前(为了获得发送权),还是在发送中(检测是否发生碰撞),每个站都必须不停地检测信道。
- 碰撞检测:即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。 当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加)。当适配器检测到信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,即发生碰撞。这时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来1。因此,一旦发生碰撞立即停止发送,然后等待一段随机时间后再次发送。
碰撞发生原因及过程
虽然每一个站在发送数据前都已经监听到信道为”空闲“,但总线上还是会发生碰撞。这是因为电磁波在总线上总是以有限的速率传播的。设某局域网两端的站A和站B相距1km,用同轴电缆相连。电磁波在1km电缆的传播时延约为5μs(这个数字很重要,应当记住)。因此,A向B发出的数据,在约5μs后才能传送到B,这5μs的检测空挡导致碰撞仍然会发生在总线上,即便有监听。碰撞后的两个帧会变得无用(在”协议要点“的碰撞检测中有提到原因)。在局域网的分析中,常把总线上的单程端到端传播时延记为τ。发送数据的站需要尽早知道是否发生了碰撞。那么,A发送数据后,最多要经过两倍的总线端到端的传播时延:2τ(从下图中可以看出),或总线的端到端往返传播时延。
从上图中可知,在使用CSMA/CD协议时,一个站不可能同时进行发送和接收(但必须边发送边监听信道)。因此使用CSMA/CD协议的以太网只能进行双向交替通信(半双工通信)。
上图的一些重要时刻
- t=0 时,A发数据,B检测信道为空闲。
- t=τ-δ 时,(τ>δ>0),A发送的数据还没到达B时,B无法检测到数据,因此B认为信道为空闲且发送数据。
- 经过时间δ/2后,即t=τ-δ/2时,A发送的数据和B发送的数据发生了碰撞,但此时A和B都还不知道。
- t=τ 时,B检测到发生了碰撞,于是停止发送数据。
- t=2τ-δ 时,A检测到发生了碰撞,也停止发送数据。
- A和B发送数据均失败,它们会推迟一段时间后再重新发送。
由此可见,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于两个站之间的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据帧成功地发送出去,这一特性称为发送的不确定性。
从上图中可知,最先发送数据帧的A站,在发送数据帧后至多经过时间2τ就可以知道所发送的数据帧是否遭受了碰撞。这是δ->0的情况,因此以太网的端到端往返时间2τ称为争用期(contention period),又称为碰撞窗口(collision window),这是一个很重要的参数。经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。该算法的主体思想是:当发生碰撞后推迟一个随机的时间,再发送一遍相同数据。具体的退避算法如下:
- 协议规定了基本的退避时间为争用期2τ,具体的争用期时间是51.2μs2。
- 从离散的整数集合[0,1,···,(2k -1)]中随机取出一个数,记为γ。重传应推后的时间就是γ倍的争用期。上面的参数k按下面的公式计算:
k=Min[重传次数,10]
- 当重传达到16次仍不能成功时(这表明同时打算发送数据的站太多,以至连续发送冲突),则丢弃该帧,并向高层报告。
根据以上所讨论的,可以把CSMA/CD协议的要点归纳如下:
-
准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道。
-
检测信道:不停的检测信道,直到信道为空闲。
-
在发送过程中仍不停的检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
发送成功:发送成功后,其他什么也不做,回到”1”。
发送失败:立即停止发送数据。适配器接着执行指数退避算法。若重传达16次,停止重传,向上报错。