理解CSMA/CD,主要有三个方面:
1、多点接入:
2、载波监听
3、碰撞检测。
这里值得一提的是,CSMA/CD 使用场景是在一个站不能同时发送数据和接收数据,即适用场景为 半双工通信。
多点接入:就是说这是总线型网络,许多计算机接在总线上。
载波监听:发送前先监听。就是每个计算机在发送数据前,先要检测一下总线上是否有其他站在发送数据。如果有,则暂时不发送数据,等待信道变为空闲时在发送。你可以理解为,汽车要驶入路口时,先按一下喇叭,看看道路内有没有其他车辆。如果有人回应了,那表明狭窄道路上有车辆,暂时不用驶入。
碰撞检测:边发送边监听。网卡边发送数据边监听信道上的信号电压的变化情况,以此来判断自己在发送数据时是否有其人正好也在发送数据。如果确实发送了,总线上的信号电压变化幅度是会增加的(互相叠加),这是总线就认为产生了碰撞。传输的信号会严重失真,失真就是数字信号无法还原成模拟信号(语音、视频)。网卡监听到碰撞了,就会立即停止发送,这样可以节省网络资源的浪费,然后等一会儿(等一个随机时间)再发送。
总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能监听到这个数据。这也是常说的:广播通信。但现实中,我们并不总是需要一对多通信。所以为了实现一对一通信,专家们就使用了一个叫做适配器的东西,也是我们说的网卡,在上面进行烧录不同的MAC地址进行区分。计算机在发送时,就在数据帧中的“目的Mac”字段填上接收站的地址即可。好比,现实中,我们寄快递一样,写上收件人的地址一样。总线工作有一个特点:总线上只要有一个台计算机在发送数据,总线的传输资源就被占用了。所以,在同一个时间内,只能允许一台计算机来发送数据,否则各个计算机之间就会互相干扰,导致数据不可用。
Destination and Source MAC address :
网卡:
Rule:当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处理。
这时,你可能会有疑问,为什么发送前都已经载波监听了,空闲时才发送,怎么会出现碰撞呢?
这是因为电磁波在总线传播是以有限的速率传播的。可能A机现在检测是空闲的,B机也同时检测是空闲的,于是他们同时发送数据,然后的然后就发送碰撞了。
电磁波在1km电缆的传播时延约为5us。
在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字节的帧都是由于冲突而异常中止的无效帧。收到这种无效帧就立即丢弃。
以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,他会进行重传。以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据,就会发生碰撞,碰撞对于以太网来说是正常的。