前面一节,我们学习了关于以太网的基础知识,并且我们还认识了百兆、千兆等高速的以太网。本节我们学习一个很重要又比较难的一个知识点,叫做CSMA/CD协议。这个协议放到现在的应用中来讲,已经不是很重要了,但是它在各类的考试中既是重点又是难点。
在早期的时候,以太网是总线型拓扑结构的,所有的主机都连接在一根通信总线上,或者是采用以集线器为中心的星型拓扑。这两种情况的以太网都属于“共享式以太网”。
共享式以太网的特点是:比如一共有A、B、C、D四台主机连接在一根总线上,当A想给B发送数据帧的时候,把帧发送到总线上,这样B、C、D三台主机都能收到这个帧,但是只有B会接收(因为C和D收到后,发现这个帧不是发给自己的,所以就丢弃掉),同样如果这四台主机是连接到一个集线器上,A把数据帧先发给集线器,而集线器是物理层设备,它不会观察帧的内容,所以它只能把这个帧发给除了A的所有人。
这时候,就会出现问题了。如果在这样的以太网上,有多个主机恰好同时想发送数据,A给B发的同时C也想给D发,这就会产生数据的冲突,也叫数据碰撞,碰撞以后的数据就会出现乱码等问题,接收方收到后没有任何意义。
所以后来,就发明了一个协议来协调和解决这种情况,这就是CSMA/CD协议,全称:带冲突检测的载波监听多路访问。
CSMA的基本原理是:主机在发送数据之前,先监听信道上是不是有别的主机正在发送数据,如果有,说明信道此时正忙,如果没有,说明信道是空闲的。
但是,即使监听到信道此时空闲,那么立即发送数据就一定能保证不出现问题吗?这是不能的,因为如果有两个主机同时监听到信道空闲,同时发送数据就会产生碰撞。所以,我们要选择一种合理的监听算法,尽可能把冲突的概率降到最低。
第一种监听算法:非坚持CSMA。这种算法是:当某个主机监听到信道正忙,就不会继续监听,而是随机等待一段时间再来监听,如果监听到信道空闲就立即发送数据。缺点是很可能在再次监听之前信道已空闲了,从而产生浪费。
第二种:1-坚持CSMA。这种算法是:当主机监听到信道正忙的时候,不会放弃监听,而是一直会监听,直到信道空闲时立即发送数据。这种算法不会浪费信道资源,但是也使得冲突概率增大了。
第三种:P-坚持CSMA。这种算法是上面两种的折中,当主机检测到信道忙,会继续监听一直到信道空闲,而这时候也不会立即发送数据,而是以概率P发送,以概率(1-P)延迟一个时间单位。
有一些同学可能会在其他资料上发现这样一句话:CSMA/CD总结起来就是先听后发、边发边听、冲突停发、延迟重发。这句话总结的很到位,很正确,下面我们详细阐述一下:
先听后发,就是发送数据之前先监听信道是不是空闲,在信道空闲的情况下,发送自己的数据帧,在发送的过程中要一直监听着信道,以检测同时刻是不是有别的主机也在发送,这就是边发边听。
如果出现这样的情况:有一个主机A检测到信道正空闲,所以发送数据,但是由于这个网络距离比较长,最远端的一个主机S还感知不到此时信道上有数据正在传输,S也检测到信道空闲,S也发送数据,这样必然会冲突。
当两个主机都检测到发生冲突了以后,都会向信道上发送一个Jamming干扰信号,目的是强烈的告诉其它所有主机“现在信道上发生了碰撞,请都不要发送数据了”,然后两个站分别等待一个随机的延迟时间再重新发送,这就是“冲突停发、延迟重发”。
争用期是一个可以让主机可以判断出自己发送的数据帧是否遭到了碰撞的概念,又称为碰撞窗口。一台主机发送完数据后,在争用期这段时间之内没有发生碰撞,那么这台主机就能肯定这个帧一定不会发生碰撞。
那么,争用期的时间是多久呢?以太网把端到端的往返时延规定为争用期的时间,对于传统以太网来说就是51.2μs,对于百兆以太网就是5.12μs,千兆以太网就是0.512μs。
此外,以太网还规定了,帧的最小间隔为9.6μs,这个是为了保证数据的接收方能来得及清理自己的接收缓存,为接收下一个帧做准备。
这个算法的用处是,当主机在发现数据产生碰撞之后,到底选择一个多长的延迟时间再重发数据。
算法是这样的:在整数集合【0,1,2,…,(2^k)-1】中随机取一个数记为R,那么R倍的争用期就是延迟时间。其中,k的取值是重传的次数,第一次重传k就是1,第二次重传k就是2,但是k不能无限增大,k最大是10。
比如,第一次重传时,在【0,1】这个集合中随机选一个数,那么这个延迟时间就是0倍或1倍的争用期,也就是0μs或51.2μs后重发数据,如果再次发生碰撞,需要第二次重传,就再从【0,1,2,3】中选一个数为R,经过R倍争用期的时间后再重发。
如果连续多次发生碰撞,这说明此时网络实在太忙了,那我们也不能让它这样无休止的重传下去,所以规定最多重传16次,如果重传了16次还没成功,那么就放弃发送,丢弃这个帧并向高层报告。
现在我们对CSMA/CD的协议过程做一个总结:
1、当要发送一个数据帧时,先监听当前信道是否正在繁忙。如果监听到繁忙,那就先不发送这个帧,但是仍然要继续监听,直到监听到信道空闲了,那么等待9.6μs之后就把帧发送(等待9.6μs是为了保证帧的最小间隔)。
2、在帧的发送过程中,仍然要继续监听信道的情况。
3、如果在争用期时间内,检测到发生了碰撞,那么就立即停止发送数据,同时向信道发送干扰信号Jamming。然后,运行指数退避算法,等待R倍争用期的时间后,重回步骤1 进行监听。
4、如果在争用期时间内,没有检测到发生碰撞,那么主机就认为数据帧发送成功。
由此可见,CSMA/CD协议也是比较复杂的,所以会成为考试重点。但是在实际应用中已经不常用了,因为在这个协议中,一个主机不可能同时发送和接收数据,所以只能用于半双工的通信,而现在的网络基本上都是全双工的了。
CSMA/CD协议,一个比较复杂的知识点,我们就学习到这里。那么下一讲,我们将介绍以太网的帧的结构。
参考教材:雷震甲《网络工程师教程》第五版