【原创作品,未经授权禁止转载,否则将追究法律责任】
每出现一个新的东西,新的技术,
小编就经常反问自己的一句话就是:为什么会诞生它(CSMA/CD)呢?why?
每个东西的产生或发明都是有它的存在的原因或背景的。
我们先来看看最初的以太网的构思吧!
把相距有一定距离的一些电脑连接起来,实现计算机之间互相通信就可以了。
最初都是把这些计算机连接在一根网线上,这种方式实现起来简单又可靠。
总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能监听到这个数据。这也是我们常说的:广播通信。但现实中,我们并不总是需要一对多通信。所以为了实现一对一通信,专家们就使用了一个叫做适配器的东西,也是我们说的网卡,在上面进行烧录不同的MAC地址进行区分。计算机在发送时,就在数据帧中的“目的Mac”字段填上接收站的地址即可。好比,现实中,我们寄快递一样,写上收件人的地址一样。
通信世界中里的“收件人地址(目的MAC地址):
网卡:
规则:仅当数据帧中的目的MAC地址与接收站的网卡烧录的mac地址一致时,才会接收。否则就丢弃。
总线工作有一个特点:总线上只要有一个台计算机在发送数据,总线的传输资源就被占用了。所以,在同一个时间内,只能允许一台计算机来发送数据,否则各个计算机之间就会互相干扰,导致数据不可用。
阿龙给大家举个场景吧!这样,更容易理解:
好比一条宽度有限、并且同一时间内只允许一个方向行驶的公路,但又好多个入口或出口,在每个入口有汽车想驶入。
同一时间内,一个方向上只能行驶通行一辆车,多了吧!就会发生碰撞事故啦!
那么这时,就需要一种机制来进行协调通信。就像,路上我们经常看到的红绿灯啊、警察叔叔在指挥交通一样,大家都遵循这个规则、手势,这样交通才能有序通行。通信的世界里,也是一样的,以太网的专业术语叫做:CSMA/CD
(Carrier Sense Multiple Access/Collision Detect),即载波监听多点接入访问/冲突检测机制。
理解CSMA/CD,主要有三个方面:
1、多点接入:
2、载波监听
3、碰撞检测。
这里值得一提的是,CSMA/CD 使用场景是在一个站不能同时发送数据和接收数据,即适用场景为 半双工通信。
多点接入:就是说这是总线型网络,许多计算机接在总线上。
载波监听:发送前先监听。就是每个计算机在发送数据前,先要检测一下总线上是否有其他站在发送数据。如果有,则暂时不发送数据,等待信道变为空闲时在发送。你可以理解为,汽车要驶入路口时,先按一下喇叭,看看道路内有没有其他车辆。如果有人回应了,那表明狭窄道路上有车辆,暂时不用驶入。
碰撞检测:边发送边监听。网卡边发送数据边监听信道上的信号电压的变化情况,以此来判断自己在发送数据时是否有其人正好也在发送数据。如果确实发送了,总线上的信号电压变化幅度是会增加的(互相叠加),这是总线就认为产生了碰撞。传输的信号会严重失真,失真就是数字信号无法还原成模拟信号(语音、视频)。网卡监听到碰撞了,就会立即停止发送,这样可以节省网络资源的浪费,然后等一会儿(等一个随机时间)再发送。
这时,你可能会有疑问,为什么发送前都已经载波监听了,空闲时才发送,怎么会出现碰撞呢?
这是因为电磁波在总线传播是以有限的速率传播的。可能A机现在检测是空闲的,B机也同时检测是空闲的,于是他们同时发送数据,然后的然后就发送碰撞了。
这里需要先记住的是:电磁波在1km电缆的传播时延约为5us。
在局域网分析时,我们经常把单程端到端的传播时间记为 τ
A发送数据,须经过多久才能检测到发送了碰撞了?
从图中,不难看出,最坏的情况,最多需要经历两倍的“单程端到端的传播时延(时间)=2τ”即,传播端到端的往返时延。
在T=0时,A发送数据。B检测到信道为空闲。
在T=τ-δ时(这里τ>δ>0),A发送数据还没到达B时,由于B检测到信道是空闲的(为什么B检测是空闲的?前面我们说了,电磁波1km的传播时延是5us,换言之就是5us后B才能检测到信道是忙的,5us之前,B认为是空闲的,于是开始发送数据)。因此B发送数据。
经过时间δ/2后,即在T=τ-δ时,A发送的数据和B发送的数据发生了碰撞。这时,A和B都不知道发送了碰撞。
在T=τ时,只有B先检测到了发生碰撞,于是停止发送数据。
在T=2τ- δ时,A才检测到发生了碰撞,也停止发送数据。
然后A和B就随时选择一个时间,推迟,再重新发送。
由此可知,每一个站,在发送数据时,在一定时间内,都存在碰撞的可能性。
发送数据帧的A站,最多经历2τ时间就可以知道是否遭受碰撞了。我们把这2τ
称为争用期,也叫碰撞窗口。
经过这个争用期时间,检测没有发生碰撞,就能肯定这次发送的数据不会发生碰撞。
至此,碰撞问题还是没有解决。专家们就发明了一种算法,来减小发生碰撞的概率,这个算法就是:退避算法。
退避,意思就是推迟,发送碰撞了,利用一种算法,来选择推迟多久才发送数据。
退避算法的思想如下:
1、确定基本退避时间。就是争用期2τ。以太网把争用期2τ定为51.2us 。(至于为什么是这个值,就没必要去纠结了,反正当时专家这么定,你就这么记咯!)
对于10Mb/s以太网,在争用期内可发送512bit,即64字节。
512bit怎么来的? 就是速率乘以时间,就等于数据量。
10Mb/s*51.2us=[10*10^6b/s] * [51.2^(-6)s]=512bit
2、从离散的整数集合随机取出一个数[0,1,2,3……,(2^k-1)] ,取出来的数,记为r。重传推迟的时间就是r倍的争用期。T=r*2τ
上面k的参数,按照这个计算k=Min[重传次数,10]。 可见,当重传次数不超过10时,参数k=重传次数。如果重传次数超过10时,k就不再增加了,一直等于10。
3、当重传达16次,仍然会不能成功时,就丢弃该帧,向高层报告。说明发送的人太多了,导致连续发送碰撞。
举例:
在第一次重传时,k=1,随机数r从整数{0,1}中选一个数, 可得重传的推迟时间要么为0,要么为1*2τ, 这两个选择一个。
如果再次发送,即第二次重传,k=2,代入[0,1,2,3……,(2^k-1)] ,随机数r从整数{0,1,2,3}选一个数,可得重传推迟时间是0,2τ,4τ,6τ 这4个值随机选择一个。
同理,再次发送碰撞,以此类推。
到这里,我们就可以看出,以太网在发送数据时,如果帧的前64字节没有发送冲突,那么后续的数据就不会发送冲突。换句话说,就是如果发送冲突,就一定是在发送的前64字节之内。因为检测到冲突就停止发送,这时已经发送出去的数据一定小于64字节。
因此以太网规定了最短有效帧长为64字节,只要长度小于64字节的帧都是由于冲突而异常中止的无效帧。收到这种无效帧就立即丢弃。