载波监听多路访问CSMA以及CSMA/CD详解

时间:2024-04-14 16:41:41

        上一篇文章具体解释了ALOHA协定,那么这篇文章解释一下CSMA和CSMA/CD协议吧。它们都是为了控制在一个传输介质上面复用的主机访问信道时避免冲突所指定的协议。

载波监听多路访问CSMA以及CSMA/CD详解

一.CSMA

        CSMA(载波监听多路访问)是在ALOHA协议上面做了更多改进并且应用于现实中MAC层截止访问控制(MAC)的协议。所谓载波监听,就是“讲前先听”。网络站点监听载波(别的用户的数据)是否存在并随之采取相应的行动。

        CSMA的基本思想是:要传输的站点首先听一听介质上是否有其他站点在传输(载波侦听)。 如果介质忙,那么必须等待;如果不忙,则传输。冲突之后需要后退并重传。主要有三种形式:1. 1-坚持CSMA   2. 非坚持CSMA  3. p-坚持CSMA.

        1. 1-坚持CSMA

        所谓1-坚持指的是对于监听信道忙之后的坚持。它的思想是:如果一个主机要发送消息,那么它先监听信道,如果空闲,那么直接传输,不必等待。如果信道忙(有别人在传输),那么一直坚持监听,直到空闲马上传输。如果自己发送的时候监听到了冲突,那么停止发送,等待一个随机长的时间,再监听,并重复上面过程。

        2. 非坚持CSMA

        所谓非坚持指的是对于监听信道忙之后的就不继续监听。它的思想是:如果一个主机要发送消息,那么它先监听信道,如果空闲,那么直接传输,不必等待。如果信道忙(有别人在传输),那么不再监听,等待一个随机的时间之后再进行监听。

        3. p坚持CSMA

        所谓p-坚持指的是对于监听信道空闲的处理。它的思想是:如果一个主机要发送消息,那么它先监听信道,如果空闲,那么有概率p直接传输,不必等待,概率1-p等待到下一个时间槽再传输。如果信道忙(有别人在传输),那么等待一个时间槽再进行上面的操作。

        对于1-坚持的CSMA,它的一个很大的缺点是冲突的可能性很大,因为大家都等到信道空闲就立刻传输,所以很有可能会冲突。对于非坚持CSMA,信道的利用率不高,因为可能信道空闲了大家还在等待。对于P坚持来说,他能工作的前提是有时间槽。时间槽在我的上一篇文章里面ALOHA协议中已经详细讲了,有兴趣可以看看。


    二.带冲突检测的CSMA协议

        所谓带冲突检测的CSMA,就是CSMA/CD。这也是实际中使用的协议。它的具体思想是:在发送之前先监听信道。如果介质空闲,则马上传输。如果介质正在忙,则一直监听到信道空闲,立刻传输。如果检测到冲突,那么立刻停止传输,等待一个随机的时间,之后再重复上面的步骤。

        相比于单纯的CSMA, CSMA/CD从 发前先听 转变为 发前先听,边发边听。这样可以在发消息的时候进行检测,如果检测到冲突就进行处理。

        现在问题来了,如何检测到冲突?如何认为自己的消息没有遇到冲突呢?

        检测到冲突其实很简单。消息发送的过程中主机进行监听,如果发现信道上面的电平值和自己发送端的电平值不相同,那么它就认为自己发送的时候有别人进行发送,也就是说信道发生了冲突。那么这个监听过程应该持续多长呢?换句话说,我监听多长时间没有监听到冲突,就认为我的消息成功发送了呢?我们假设AB是两个局域网中相距最远的节点,并且从一端传递到另一端所需要的时间为τ。我们考虑极端的情况:假设A发送到B的消息,在马上就到达B的时候,B突然发送了消息发生冲突。那么这个冲突信号再传递给A,这个过程应该持续2τ。也就是说,在消息最后一比特监听时间持续了2τ之后,还没有检测到冲突,那么认为消息应该已经无冲突的到达。

三. 802.3的介质访问协议:1-坚持的CSMA/CD

        具体来说,在发送之前先听,如果介质空闲,则传输,如果介质忙,则继续监听,直到介质空闲则马上传输。如果在传输期间检测到冲突则发送一个JAM信号,发送JAM信号之后,等待一个随机时间,重复上面过程,重新发送这段数据。

        重点是下面两个部分:

        1.冲突检测:

载波监听多路访问CSMA以及CSMA/CD详解

        

        哪个端检测到冲突,那个端就发送JAM信号,并且中断自己的信号发送。这样过一段时间其他的发送端都能检测到自己的信号被冲突了,于是都停止发送了。于是各自随机后退,等待一段时间后重启监听和发送的过程。

        2.随机后退

        刚才讲了那么多次随机后退,那么真的是随机找一个时间后退吗?其实这里面也有讲究的,802.3 的CSMA/CD使用的是随机后退算法,是通过确定随机等待窗口来确定等待时间的。对于任何一个帧来说,假设他已经重发了i次,那么下一次它重发的平均等待延迟为MBEN=(2^i-1) *2τ。 这就是二进制指数后推算法,这里τ就是上文说的局域网最长的延迟。这个时间就是随机等待窗口,从该窗口中随机选择一个时间作为后退时间,等待这个时间过去之后再进行监听和发送。 那么这个算法有一个问题,如果网络确实很拥挤,冲突次数很多,那么每次的等待时间将随着指数而指数增大,急剧增加,如下图所示:

载波监听多路访问CSMA以及CSMA/CD详解





        所以改进的算法出现了,也就是截断二进制指数后退算法。它的重发延迟为:MBEN=(2^i -1) *2τ 但是i=min(10,n). n为实际冲突的次数,从这个来看,I不可能大于10,这也就给了一个“截断”,重发延迟不可能超过2的10次方了,好处就是如果冲突次数真的这么多,不至于无穷无尽的等待下去。

        上面算法就是802.3中实际采用的1-坚持CSMA/CD算法。欢迎大家指正。

       延伸阅读

        802.11的CSMA/CA机制
      介质访问控制MAC以及ALOHA协议