为什么以太网最小帧是64字节

摘自:https://blog.csdn.net/farmwang/article/details/64130760?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

理解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字节的帧都是由于冲突而异常中止的无效帧。收到这种无效帧就立即丢弃。

以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,他会进行重传。以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据,就会发生碰撞,碰撞对于以太网来说是正常的。
我们来看一下,假设A检测到网络是空闲的,开始发数据包,尽力传输,当数据包还没有到达B时,B也监测到网络是空闲的,开始发数据包,这时就会发生碰 撞,B 首先发现发生碰撞,开始发送碰撞信号,所谓碰撞信号,就是连续的01010101或者10101010,十六进制就是55或AA。这个碰撞信号会返回到 A,如果碰撞信号到达A时,A还没有发完这个数据包,A就知道这个数据包发生了错误,就会重传这个数据包。但如果碰撞信号会返回到A时,数据包已经发完, 则A不会重传这个数据包。
我们先看一下,以太网为什么要设计这样的重传机制。首先,以太网不想采用连接机制,因为会降低效率,但他又想有一定的重传机制,因为以太网的重传是微秒 级,而传输层的重传,如TCP的重传达到毫秒级,应用层的重传更达到秒级,我们可以看到越底层的重传,速度越快,所以对于以太网错误,以太网必须有重传机 制。
要保证以太网的重传,必须保证A收到碰撞信号的时候,数据包没有传完,要实现这一要求,A和B之间的距离很关键,也就是说信号在A和B之间传输的来回时间 必须控制在一定范围之内。IEEE定义了这个标准,一个碰撞域内,最远的两台机器之间的round-trip time 要小于512bit time.(来回时间小于512位时,所谓位时就是传输一个比特需要的时间)。这也是我们常说的一个碰撞域的直径
512个位时,也就是64字节的传输时间,如果以太网数据包大于或等于64个字节,就能保证碰撞信号到达A的时候,数据包还没有传完。
这就是为什么以太网要最小64个字节,同样,在正常的情况下,碰撞信号应该出现在64个字节之内,这是正常的以太网碰撞,如果碰撞信号出现在64个字节之后,叫 late collision。这是不正常的。
我们以前学习CISCO网络的时候,CISCO交换机有一种转发方式叫fragment-free,叫无碎片转发,他就是检查64个字节之内有没有错误,有的话不转发,这样就排除了正常的以太网错误包。

原文地址:https://www.cnblogs.com/LiuYanYGZ/p/13543795.html