载波侦听多路访问/碰撞检测(Carrier Sense Multiple Access with Collision Detection, CSMA/CD) 协议是CSMA协议的改进方案,适用于总线形网络或半双工网络环境。“载波侦听”就是发送前先侦听,即每个站在发送数据之前先要检测一下总线上是否有其他站点正在发送数据,若有则暂时不发送数据,等待信道变为空闲时再发送。“碰撞检测”就是边发送边侦听,即适配器边发送数据边检测信道上信号电压的变化情况,以便判断自己在发送数据时其他站点是否也在发送数据。
CSMA/CD的工作流程可简单概括为“先听后发,边听边发,冲突停发,随机重发”。
1)适配器从网络层获得一个分组,封装成以太网帧,放入适配器的缓存,准备发送。
2)如果适配器侦听到信道空闲,那么它开始发送该帧。如果适配器侦听到信道忙,那么它持续侦听直至信道上没有信号能量,然后开始发送该帧。
3)在发送过程中,适配器持续检测信道。若一直未检测到碰撞,则顺利地把这个帧发送完毕。若检测到碰撞,则中止数据的发送,并发送一个拥塞信号,以让所有用户都知道。
4)在中止发送后,适配器就执行指数退避算法,等待一段随机时间后返回到步骤2)。
电磁波在总线上的传播速率总是有限的,因此,当某个时刻发送站检测到信道空闲时,此时信道并不一定是空闲的。设 τ \tau τ为单程传播时延。在t=0时,A发送数据。在t= τ \tau τ - δ \delta δ时,A发送的数据还未到达B,由于B检测到信道空闲而发送数据。经过时间 δ \delta δ/2后,即在t= τ \tau τ- δ \delta δ/2时,A发送的数据和B发送的数据发生碰撞,但这时A和B都不知道。在t= τ \tau τ时,B检测到碰撞,于是停止发送数据。在t = 2 τ \tau τ- δ \delta δ时,A检测到碰撞,也停止发送数据。显然,CSMA/CD 中的站不可能同时进行发送和接收,因此采用CSMA/CD协议的以太网只能进行半双工通信。
站A在发送帧后至多经过时间2 τ \tau τ(端到端传播时延的2倍)就能知道所发送的帧有没有发生碰撞(当 δ \delta δ→0时)。因此把以太网端到端往返时间2 τ \tau τ称为争用期(又称冲突窗口或碰撞窗口)。
每个站在自己发送数据之后的一小段时间内,存在发生碰撞的可能性,只有经过争用期这段时间还未检测到碰撞时,才能确定这次发送不会发生碰撞。
为了确保发送站在发送数据的同时能检测到可能存在的碰撞,需要在发送完帧之前就能收到自己发送出去的数据,即帧的传输时延至少要两倍于信号在总线中的传播时延,所以CSMA/CD总线网中的所有数据帧都必须要大于一个最小帧长。任何站点收到帧长小于最小帧长的帧时,就把它当作无效帧立即丢弃。
最小帧长的计算公式为: 最小帧长=总线传播时延×数据传输速率×2 = 争用期×数据传输速率
如果只发送小于最小帧长的帧,那么需要在MAC子层中于数据字段的后面加入一个整数字节的填充字段,以保证以太网的 MAC帧的长度不小于最小帧长。
除检测冲突外,CSMA/CD还能从冲突中恢复。一旦发生了冲突,参与冲突的两个站点紧接着再次发送是没有意义的,会导致无休止的冲突。CSMA/CD 采用二进制指数退避算法来解决碰撞问题。算法精髓如下:
使用截断二进制指数退避算法可使重传需要推迟的平均时间随重传次数的增大而增大 (这也称动态退避), 因而能降低发生碰撞的概率, 有利于整个系统的稳定。