该协议应用在 总线型网络 上,解决了多台计算机同时占用一条线路的情况,采用动态媒体接入控制的随机接入方案,即各个用户可以随机的发送数据。
CSMA/CD协议使用的时代,是总线型局域网,用的同轴电缆,都在一根电芯上通信。
CSMA/CD基本原理类似于该例子:
现在有一屋子的人在开讨论会,没有会议主持人控制发言。想发言的随时可发言,不需要举手示意。但我们还必须有个协议来协调大家的发言。这就是:如果你听见有人在发言,那么你就必须等别人讲完了才能发言(否则就干扰了别人的发言)。但有时碰巧两个或更多的人同时发言了,那么一旦发现冲突,大家都必须都立即停止发言,等听到没有人发言了你再发言。
载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection)
协议的实质是载波监听
和碰撞检测
。
“载波监听”就是用电子技术检测总线上有没有其他计算机也在发送信号。事实上总线上并没有什么“载波”,这里只不过借用一下“载波”这个名词而已。载波监听就是检测信道,这是个很重要的措施。不管在发送前,还是在发送中,每个站都必须不停地检测信道。在监听机制上,由于CSMA/CD是有线网络,故其监听是直接解调有线介质上的信息,若没有信息,则信道空闲,若存在信息,则信道繁忙。
载波检测的目的
在发送前检测信道,是为了获得发送权。如果检测出已经有其他站在发送,则自己就暂时不许发送数据,必须要等到信道变为空闲时才能发送。
在发送中检测信道,是为了及时发现有没有其他站的发送和本站发送的碰撞。这就称为碰撞检测。
碰撞的原因
每一个站在发送数据之前已经监听到信道为“空闲”,为什么还会出现数据在总线上的碰撞呢?这是因为电磁波在总线上总是以有限的速率传播的。这和我们开讨论会时相似。一听见会场安静,我们就立即发言,但偶尔也会发生几个人同时抢着发言而产生冲突的情况。下所示的例子可以说明这种情况。设图中的局域网两端的站A和B相距1km,用同轴电缆相连。电磁波在1km电缆的传播时延约为5 μs。因此,A向B发出的数据,在约5 μs后才能传送到B。换言之,B若在A发送的数据到达B之前发送自己的帧(因为这时B的载波监听检测不到A所发送的信息),则必然要在某个时间和A发送的帧发生碰撞。碰撞的结果是两个帧都变得无用。
碰撞检测的方法
“碰撞检测”也就是“边发送边监听”,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加)。当适配器检测到的信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。(碰撞的多种检测方式见知乎回答,提到一种在发送的时候,同时解析信号的方法,如果解析出来的信号于自己发送的信号不一致说明有冲突)。
隐含条件
注意,上面碰撞检测默认隐含有一个条件就是,发送端检测到发生碰撞的时候,此时的发送端仍在发送数据,现在讨论这个隐含条件的意义。
考虑这么一个情况,如果发送的数据量极少,A将整个一个完整的帧发送出去之后,B仍然没有接收到第一个发送的bit,也就是没法检测到通路上的信号,认为此时线路是空闲的,B此时也发送了一个短帧,出现下图所示的状况,A,B同时发送信号,发生碰撞之后,两份数据均变成了失真的数据,A,B也都不知道发生了碰撞,当A接收到失真数据B,B接收到失真数据A的时候,也会向正常数据帧一样处理,进行错误检测(如CRC循环冗余检验),发现数据失真,因此两份数据都被丢弃,但是均无法判断这个数据失真的原因是因为传输信道的质量不好导致的,还是因为发生了碰撞导致的。也就是在发送短帧的时候,碰撞检测是无效的。如果有大量的短帧在线路上传输,各个站都无法检测到碰撞,会产生大量的失真的数据,最后被丢弃,白白消耗了通信资源,显然这样做是不合理的。
因此要 保证如果发送了碰撞,发送站一定会检测到碰撞 。也就是保证发送端检测到碰撞的时候,发送端一定仍然在发送数据。
现在有这么几个物理量,A发送一段数据帧的时间为,一个bit在A到B的线路上传送的时间为
当A发送数据之后,最坏情况下,需要的时间才能检测到发送冲突,即当A发送的第一个bit在将要到达B的时候(距离A发送该bit过去了时间),B开始发送数据了,B发送的bit与A发送的bit发生了碰撞,碰撞的数据同样也需要时间才能到达A,A才能知道发生了碰撞。
因此要保证
时间称为争用期,只要争用期内未检测到数据发生碰撞,那么本次传送一定不会发生碰撞,因为发送的第一个bit已经到达接收站,他们知道发送站在发送数据.
对于长度为字节的数据帧,发送速率为,在线路上传输的速率为,线路长度,发送数据的时间,
对于发送速率为的网络,规定最短帧长为64字节,此时的最大长度约为,现实生活中的用于局域网的单根线缆的长度往往不会有,多余的时间能够容纳下中间其他因素造成的延迟。
碰撞检测的处理
检测到碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。因此,任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送,免得继续进行无效的发送,白白浪费网络资源,然后等待一段随机时间后再次发送。
此处随机等待一段时间指的是使用截断二进制指数退避算法确定等待的随机时间。如果是发送冲突后检测到空闲的时候大家都立即发送很大概率会再次发生碰撞,为了降低碰撞的概率,使用截断二进制指数退避算法。
算法的内容如下
当检测到碰撞的时候,从离散的整数集合中随机取一个数,记为,等待的时间为(倍的争用期)
其中
当重传次数达到16次,仍然不能发送成功,就丢弃该帧,向高层报告。
检测到发生碰撞之后,除了会执行退避算法,还会进行强化碰撞的操作,即发送一个长度为4或6字节的人为干扰信号,用于通知其他站点,表明现在发生了碰撞。
CSMA/CD协议,数据的发送过程
当上层传下来一个数据包,适配器进行数据封装成帧,放入缓存,准备发送。检测信道,当信道空闲,开始发送,同时碰撞检测,若争用期未检测到碰撞,则不会发生碰撞,可以发送完数据,若检测到碰撞,碰撞处理,执行退避算法,等待重传(因为有重传需要,适配器需要暂时备份一份数据帧,直到确保不会发送碰撞(度过争用期)),重传次数过多(超过16次),向上层报告错误。
如果有多个数据帧需要发送,需要保持一定的时间间隔发送,以保证接收站能够解析完前一个数据帧,清理缓存,做好接收下一个数据帧的准备。这个时间间隔规定为
信道利用率
假定一个站要发送一个帧,发生碰撞,经历一个争用期后(退避),再发送又碰撞,经过若干个争用期后,发送成功。假设发送帧所需时间,成功发送帧到接收方接收完毕,占用信道,则从准备发送一个帧到真的发送成功所需的时间是,而其中有效的时间是
即利用率为,为了提高利用率,就要增大,即减小
我们设参数,当时,表明传播耗时低,发送耗时高,一旦发送碰撞可以很快检测出来,此时资源浪费就很少,反之,参数a越大,表明利用率越低
也就是说当数据率一定时,连线长度过大会导致较大的参数a,帧长太短会导致过小的
此外考虑一种理想情况,无碰撞发送,且总线总是处于利用状态,即总线一旦空闲就有数据发送.
此时的利用率为
这表明,当a远小于1的时候,才能尽可能提高利用率,反之a大于1,表明发生过多碰撞,利用率就会很低