碰撞检测讲解
咱们先把数据链路层的"碰撞检测"相关内容,换成一个你绝对能懂的生活场景------菜市场公共喇叭,保证比听"天书"简单100倍!
第一步:先搞懂"碰撞"是啥------菜市场喇叭抢话
假设咱们有个老菜市场,只有一个公共喇叭(对应早期以太网的"总线电缆"),所有小贩(对应"主机",比如你的电脑、邻居的手机)要喊价(发数据),都得用这个喇叭------因为没有私人对讲机,只能共享这一个"说话通道"。
现在问题来了:如果两个小贩同时对着喇叭喊(比如小贩A喊"白菜1块",小贩B同时喊"萝卜2块"),声音就会混在一起(碰撞),顾客啥也听不清(数据传错,变成乱码)。这就是以太网里的"碰撞"------多台主机同时发数据,信号叠加出错。
第二步:碰撞检测(CSMA/CD)------说话前先听,说话时也听
为了避免"抢话",菜市场定了个规矩(对应CSMA/CD协议),所有小贩必须遵守:
- 说话前先"听"(载波监听):要喊价前,先把耳朵凑到喇叭边听1秒------如果没人在喊(喇叭没声音),就可以自己喊;如果有人在喊,就等人家说完。
- 说话时也"听"(碰撞检测):喊的时候不能光顾着说,还得一直听喇叭------万一刚开口,就有另一个小贩也抢着喊(碰撞),得立刻停嘴,还得额外喊一嗓子"别吵了!"(发"干扰信号"),让所有小贩都知道"刚才撞了,大家先停"。
- 撞了之后等一会儿再试(退避等待):不是停嘴就马上再喊,得等个随机时间------不然A和B刚撞完,又同时喊,还得撞。
第三步:核心考点1------最短帧长:为啥不能只喊"1个字"?
这是最容易懵的考点,咱们用菜市场例子拆透:
关键问题:声音传播需要时间(对应"信号传播时延τ")
假设菜市场特别长:东头的小贩A,西头的小贩B,中间隔了很远------A喊一声"白",声音要1秒才能传到B耳朵里(这个"1秒"就是信号传播时延τ)。
现在看两种情况:
情况1:A只喊"1个字"(帧太短)
A张嘴喊"白"(1个字,用了0.5秒),然后就停嘴了,也不再听喇叭了。
但A的声音还在传播------要1秒才能到B。
如果B在A喊完后的0.3秒(还没听到A的声音),也对着喇叭喊"萝"------俩声音撞了!
但A已经停嘴了,没在听喇叭,根本不知道撞了,还以为自己喊成功了------结果顾客没听清,数据白传了!
情况2:A至少喊"2个字"(最短帧长)
A知道声音传1秒到B,那自己得喊够"2个字"(用2秒)------为啥是2秒?
因为2秒="A的声音传到B(1秒) + 碰撞声音传回A(1秒)"(这2秒就是争用期=2τ )。
这样:
- 如果B在A喊第1个字时抢话(比如0.5秒时喊),碰撞的声音会在1秒后传回A------此时A还在喊第2个字(还在听喇叭),能立刻发现碰撞,停嘴重传。
- 如果A喊完2个字,都没听到碰撞------说明B那边没抢话(B要么听到A的声音了,要么没打算喊),后面也不会撞了,数据传成功了!
联系实际考点:以太网的"最短帧长64字节"咋来的?
把菜市场例子换成以太网参数:
- 早期10Mbit/s以太网(像小贩每秒喊10^7个"比特字")
- 争用期=51.2μs(相当于菜市场的"2秒",是信号往返的最长时间,考虑了网线长度、集线器延迟)
- 最短帧长=发送速率 × 争用期 = 10Mbit/s × 51.2μs = 512bit = 64字节(1字节=8bit)
这就是考点:最短帧长必须≥发送速率×争用期(2τ),10M以太网最短64字节------如果帧比64字节短,就会像"只喊1个字",撞了也不知道,传错了还以为成功了。
第四步:核心考点2------等待时间:撞了之后等多久?(二进制指数退避)
还是菜市场例子:A和B撞了之后,不能同时再喊,得"随机等",但怎么等才公平?
以太网的规矩(二进制指数退避算法),咱们换成"等几秒":
- 第一次碰撞:从"0、1"里随机选一个数------比如A选0,等0×2秒(0秒);B选1,等1×2秒(2秒)------A先喊,不撞了。
- 第二次又碰撞:从"0、1、2、3"里选------范围翻倍(2²=4个数),比如A选3,等3×2=6秒;B选1,等2秒------错开时间,减少再撞概率。
- 最多撞10次:每次碰撞,选数范围都翻倍(2^k,k是碰撞次数),但k最多到10------如果撞了16次还没成功,就干脆不发了,告诉上层"传不过去"。
考点总结:
- 等待时间=随机数 × 争用期(2τ)
- 随机数范围:第一次[0,1],第二次[0,3],第三次[0,7]... 最多[0,2^10-1]
- 16次重传失败→丢帧
最后:3个考点一句话总结(保证记牢)
- 碰撞检测(CSMA/CD):说话前听,说话时听,撞了停嘴喊"别吵",等会儿再试。
- 最短帧长:至少要"喊够争用期(2τ)的时长"------10M以太网是64字节,太短会漏检碰撞。
- 等待时间:撞一次,等的时间范围翻一倍(二进制指数退避),别跟别人又撞。
信道占用讲解
咱们还是用最熟悉的「菜市场公共喇叭」场景,把「以太网信道利用率」和「信道被占用情况」拆成"喇叭怎么用、用得好不好"的事儿,保证连"小白"都能秒懂!
第一步:先对应概念------把"以太网"翻译成"菜市场"
先明确几个核心对应关系,后面全程不脱离这个类比:
以太网术语 | 菜市场场景类比 | 通俗理解 |
---|---|---|
信道 | 菜市场唯一的公共喇叭 | 所有小贩只能用这一个"说话通道" |
信道被占用 | 喇叭在"出声"(不管是有用还是没用) | 喇叭没闲着,有人在喊或在处理碰撞 |
信道利用率 | 喇叭用来"正经喊价"的时间比例 | 喇叭没被浪费的程度,越高越好 |
发送时间T0 | 小贩一次喊完一整句话的时间 | 比如喊"白菜3块钱一斤"用5秒 |
传播时延τ | 声音从东头传到西头的时间 | 比如东头A喊的话,1秒到西头B |
碰撞 | 两个小贩同时喊,声音混了 | 喇叭出杂音,顾客听不清 |
第二步:信道被占用的两种情况------"有用占用"和"浪费占用"
以太网的信道不是"要么传数据,要么空闲",很多时候是"看似在忙,其实在浪费",就像菜市场的喇叭,不是所有"出声"都是在正经喊价。咱们分两种情况看:
情况1:有用占用------喇叭在"正经喊价"(成功传数据)
比如小贩A要喊"白菜3块钱一斤"(对应一个"数据帧"),整个有用占用过程分3步:
- 等喇叭空闲:A先听喇叭,确定没人在喊(信道空闲),才开始张嘴。
- 喊价时间(T0):A用5秒喊完"白菜3块钱一斤"(这5秒是「发送时间T0」,纯有用时间,顾客能听清)。
- 等声音传完(τ):A喊完后,声音不会立刻消失,要1秒才能传到西头(「传播时延τ」)------这1秒里,喇叭还在"播A的回声",别人不能抢着喊(不然会撞),所以喇叭还是被占用的,但这部分时间不算"主动喊价",算"收尾占用"。
→ 这部分"有用占用总时间"= 喊价时间(T0)+ 收尾传播时间(τ)= 5+1=6秒,其中真正有用的是5秒。
情况2:浪费占用------喇叭在"吵架/等吵架结束"(碰撞+等待)
这是以太网信道利用率低的核心原因,就像菜市场喇叭总被"抢话杂音"占着:
- 碰撞时间:A刚喊"白"(1秒),西头B没听到A的声音(声音还在传,要1秒才到B),也抢着喊"萝"------俩声音撞了,喇叭出杂音(碰撞时间比如0.5秒),顾客啥也听不清,这0.5秒纯浪费。
- 喊"别吵了"时间:A和B发现撞了,立刻停嘴,还得额外喊一嗓子"别吵了!"(发送干扰信号,比如0.1秒),提醒其他小贩"现在乱,别喊",这0.1秒也浪费。
- 等待重传时间:A和B按规矩"随机等"------A等2秒,B等3秒(对应「二进制指数退避」),这2-3秒里,喇叭空闲吗?不!虽然没人喊,但A和B在等,喇叭相当于"被占用着等",也没传有用数据,算浪费。
→ 这部分"浪费占用总时间"= 碰撞杂音时间 + 干扰信号时间 + 等待重传时间,全是没传有用数据的"无效占用"。
第三步:信道利用率------喇叭"正经干活"的比例(考点核心)
利用率的本质就是「有用时间 ÷ 总占用时间」,咱们用具体数字算一遍,比公式好懂10倍:
例子:一天里喇叭的占用情况
假设菜市场一天(100分钟)里,喇叭的占用分两部分:
- 有用占用:10个小贩成功喊价,每个小贩"喊价5秒+收尾1秒",总有用占用时间=10×(5+1)=60分钟,其中真正有用的"喊价时间"=10×5=50分钟。
- 浪费占用:发生了5次碰撞,每次碰撞+等待浪费4分钟,总浪费时间=5×4=20分钟。
→ 总占用时间=有用占用时间+浪费占用时间=60+20=80分钟(剩下20分钟喇叭完全空闲)。
→ 信道利用率=有用喊价时间 ÷ 总占用时间=50÷80=62.5%(这就是"喇叭真正干活的比例")。
联系以太网考点:两个关键结论
结论1:利用率不是100%,因为有"浪费占用"
哪怕所有小贩都很守规矩,也会因为"声音传播需要时间"(τ)导致碰撞,产生浪费------所以以太网的信道利用率永远达不到100%,实际中只要利用率到30%,就说明"喇叭很忙"(网络重载),再增加小贩(主机),碰撞会更多,利用率反而下降。
结论2:"a值"越小,利用率越高(考点公式a=τ/T0)
这里的"a"就是「传播时延τ ÷ 发送时间T0」,对应菜市场的"声音传1秒 ÷ 喊一句话5秒=0.2"。
- 如果a小(比如τ=1秒,T0=10秒,a=0.1):小贩喊的句子长,声音传1秒就到,碰撞后很快能发现,浪费时间少,利用率高。
- 如果a大(比如τ=1秒,T0=0.5秒,a=2):小贩只喊"1个字"(短帧),声音还没传到西头,就喊完了,很容易撞,浪费时间多,利用率低。
这就是为什么以太网要规定"最短帧长64字节"------其实就是为了让T0足够大,把a值压小,减少碰撞浪费,提高利用率!
最后:3句话总结考点(保证记牢)
- 信道被占用=有用占用(传数据+等数据传完)+浪费占用(碰撞+等重传),不是"没传数据就是空闲"。
- 信道利用率=真正传有用数据的时间 ÷ 信道被占用的总时间,越高说明信道没被浪费。
- 考点关键:a=τ/T0(传播时延÷发送时间)越小,利用率越高;最短帧长就是为了保证T0足够大,压小a值。