上一篇文章具体解释了ALOHA协定,那么这篇文章解释一下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.冲突检测:

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

2.随机后退

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

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

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

延伸阅读

802.11的CSMA/CA机制
802.11隐藏节点以及RTS/CTS机制

介质访问控制MAC以及ALOHA协议

载波监听多路访问CSMA以及CSMA/CD详解相关推荐

  1. 【计算机网络】数据链路层 : CSMA 协议 ( 载波监听多路访问协议 | 监听 | 1-坚持 CSMA | 非坚持 CSMA | p-坚持 CSMA )

    文章目录 一. CSMA 协议 ( 载波监听多路访问协议 ) 二. CSMA 协议 监听 三. 1-坚持 CSMA 四. 非坚持 CSMA 五. p-坚持 CSMA 六. 三种协议对比 一. CSMA ...

  2. 带冲突检测的载波监听多路访问的原理_通信原理课程总结(二)

    在上一篇文章中,我把通信原理中的基础知识已经总结完毕,以后的内容就是利用前边的基础知识来进行更深层次的学习了,引出了通信原理中非常重要的一部分--调制与解调. 首先调制之所以重要,是因为: 调制可以把 ...

  3. F问题3-7:以太网使用载波监听多点接入碰撞检测协议CSMA/CD。频分复用FDM才使用载波。以太网有没有使用频分复用?...

    F问题3-7:以太网使用载波监听多点接入碰撞检测协议CSMA/CD.频分复用FDM才使用载波.以太网有没有使用频分复用? 答:这里的"载波"并非指频分复用FDM的载波.CSMA/C ...

  4. 查看oracle监听服务状态,(总结)Oracle监听服务lsnrctl参数及查询状态详解

    lsnrctl命令常用参数详解: lsnrctl start 启动指定的监听器 stop 关闭指定的监听器 status 显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置 ...

  5. Oracle监听服务lsnrctl参数及查询状态详解

    lsnrctl命令常用参数详解: lsnrctl start 启动指定的监听器 stop 关闭指定的监听器 status 显示监听器的状态.status命令显示监听器是不是活动的,日志与跟踪文件的位置 ...

  6. android项目监听蓝牙连接,android 蓝牙ACL通讯详解

    本文主要是讲述android中蓝牙ACL链接的详细介绍,这里只讲述ACL,不讨论BLE,SCO,等等其他通讯通道,后面如果我有兴趣研究,我会贴上对应的文章链接 github下载地址 同时也是一个可直接 ...

  7. [实践篇]13.16 vmm_service监听qvm事件原理及其自定义事件详解

    [QNX Hypervisor 2.2用户手册]目录(完结) 前面通过[实践篇]13.11扒一扒qvm与vmm之间的那点事儿,我们了解到vmm_service通过监听vmm设备节点,来接收qvm的状态 ...

  8. python dll注入监听_HOOK -- DLL的远程注入技术详解(1)

    DLL 的远程注入技术是目前 Win32 病毒广泛使用的一种技术.使用这种技术的病毒体通常 位于一个 DLL 中,在系统启动的时候,一个 EXE 程序会将这个 DLL 加载至某些系统进程 (如 Exp ...

  9. 【计算机网络】【湖科大MOOC】数据链路层 媒体介入控制 频分复用、时分复用、码分复用 载波监听多址接入/碰撞检测CSMA/CD 碰撞避免CSMA/CA

    目录 数据链路层 5. 媒体介入控制 5.1 静态划分信道 5.2 动态接入控制 - 随机接入 5.2.1 载波监听多址接入/碰撞检测 CSMA/CD协议 5.2.1 载波监听多址接入/碰撞避免 CS ...

最新文章

  1. Lync和Exchange 2013集成PART5:UCS和HD头像
  2. 批量增加文件夹C语言实现
  3. idea spring helloworld
  4. 2018/7/13-纪中某C组题【jzoj3382,jzoj3383,jzoj3384,jzoj3385】
  5. Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息
  6. php生成静态翻页,PHP高手,我刚刚学PHP,在生成静态分页遇到了点有关问题,就是翻页的有关问题,希望可以給出一个漂亮完整的翻页代码,多谢...
  7. uwp post php,window_Win10开发系列专题五 UWP应用添加画布及语音输入支持,这是微软Win10十个开发系列专 - phpStudy...
  8. 利用VB.NET绘制简易表白小程序
  9. .NET方向高级开发人员面试时应该事先考虑的问题
  10. 获得Azure订阅LoadBalancer的脚本
  11. Java基础HashMap---面试题【二】
  12. 第十七章、程序管理与 SELinux 初探
  13. 【嵌入式百科】003——时钟周期、指令周期、机器周期、总线周期
  14. # Linux学习笔记
  15. h3c交换机绑定在线计算机的命令,H3C 3100交换机怎么IP绑定MAC
  16. elasticsearch 官方文档一个小错误
  17. matlab bar 填充花纹,转:使用matlab绘画柱状图,且使用不同的图案填充
  18. UE4-第一课:开关门基础
  19. 类人猿x64位封包协议拦截技术开发3种工具(支持安卓)
  20. 重新install安装织梦后台DedeCms程序

热门文章

  1. python画简便的图-python的pyecharts绘制各种图表详细(附代码)
  2. python爬虫代码-Python爬虫入门(01) -- 10行代码实现一个爬虫
  3. python零基础能学吗-终于知道深圳Python零基础能学吗
  4. python代码示例-总算知道python入门代码示例
  5. 音频录制和Speech语音识别(ios10)
  6. 预定义类型未定义或导入_LimeSurvey基础教程(二)——问题类型
  7. lsdyna如何设置set中的node_list_详解MySQL数据库如何实现类似Oracle的序列?
  8. vue3.0和vue2的区别
  9. 【数据结构和算法笔记】用c和c++分别实现二叉搜索树
  10. HTML显示波形,CSS3波形loading动画特效