协议森林02 小喇叭开始广播 (以太网与WiFi协议) 📅 2026/7/4 8:35:25 小喇叭开始广播啦”如果你知道这个你一定是老一辈的人。“小喇叭”是五十年代到八十年代的儿童广播节目。在节目一开始都会有一段这样的播音“小朋友小喇叭开始广播了” 听到这里收音机前的小朋友就兴奋起来准备好听节目了这一期的内容是以太网(Ethernet)协议与WiFi。我们在邮差与邮局中说到以太网和WiFi是连接层的两种协议。在连接层信息以帧(frame)为单位传输。帧像信封一样将数据(payload)包裹起来并注明收信地址和送信地址。连接层实现了“本地社区”的通信。我们先来看看以太网的帧。以太网的帧格式帧本身是一段有限的0/1序列。它可以分为头部、数据(Payload)和尾部三部分:PreambleSFDDSTSRCTypePayload (Data)PadFCSExtension帧按照上面的顺序从头到尾依次被发送/接收。我们下面进一步解释各个区域。头部帧的最初7个byte被称为序言(preamble)。它的每个byte都是0xAA(这里是十六进制也就是二进制的10101010)。通常我们都会预定好以一定的频率发送0/1序列(比如每秒10bit)。如果接收设备以其他频率接收(比如每秒5bit)那么就会错漏掉应该接收的0/1信息。但是由于网卡的不同发送方和接收方即使预订的频率相同两者也可能由于物理原因发生偏差。这就好像两个人约好的10点见结果一个人表快一个人表慢一样。序言是为了让接收设备调整接收频率以便与发送设备的频率一致这个过程就叫做时钟复原(recover the clock)。(就像在收听广播之前调整转钮直到声音清晰。网卡会在接收序言的过程中不断微调自己的接收频率直到自己“听到”是...1010...)时钟调整好之后我们等待帧的起始信号(SFD, start frame delimiter)。SFD是固定的值0xAB。这个0xAB就好像“小喇叭开始广播啦”一样提醒我们好节目就要上演了。Preamble和SFD紧随SFD之后的是6 byte的目的地(DST, destination)和6 byte的发出地(SRC, source)。这就是我们在邮差和邮局中的介绍一样为信封写上目的地和发出地。要注意这里写在信封上的是对地址的“本地描述”也就是MAC地址。MAC地址是物理设备自带的序号只能在同一个以太网中被识别 (正如邮差只熟悉自己的社区一样)。头部的最后一个区域是Type用以说明数据部分的类型。(比如0x0800为IPv40x0806为ARP)数据数据一般包含有符合更高层协议的数据比如IP包。连接层协议本身并不在乎数据是什么它只负责传输。注意数据尾部可能填充有一串0(PAD区域)。原因是数据需要超过一定的最小长度。尾部跟随在数据之后的是校验序列(FCS, Frame Check Sequence)。校验序列是为了检验数据的传输是否发生错误。在物理层我们通过一些物理信号来表示0/1序列(比如高压/低压高频率/低频率等)但这些物理信号可能在传输过程中受到影响以致于发生错误。如何来发现我们的数据是正确的呢一个方法是将数据发送两遍然后对比一下是否一样。但这样就大大降低了网络的效率。FCS采用了CRC(Cyclic Redundancy Check)算法。这就好像是一家饭店的老板雇佣了一个收银员但他又担心收银员黑钱。可是每天营业额很大老板即使坐在旁边看也不能用记住收到的总数。所以他采取了一个聪明的办法只记住收到钱的最后一位 (比如收到19元老板记住9)。当有新的进账(比如13尾数为3)他就将新的尾数和旧的尾数相加再记住和的尾数(也就是2)。当收银员交给老板钱的时候老板只用看总额的最后一位是否和自己记的最后一位相同就可以知道收银员是否诚实了。如果说我们的数据是收银的总额的话我们的FCS就是老板记录的尾数。如果两者不相符我们就知道数据在传输的过程中出现错误不能使用。有FCS在盯着上面的比喻实际上是用营业总额不断的除以10获得最终的尾数。CRC算法也相类似。n位CRC算法取一个n bit的因子比如下面的1011。数据序列结尾增加n-1个0。因子与数据序列的不断进行XOR运算直到得到n-1位的余数也就是100。该余数各位取反(011)然后存储在FCS的位置。11010011101100 000 --- 数据序列末尾增加3位0 1011 --- 因子 01100011101100 000 --- XOR结果 1011 --- 因子 00111011101100 000 1011 00010111101100 000 1011 00000001101100 000 1011 00000000110100 000 1011 00000000011000 000 1011 00000000001110 000 1011 00000000000101 000 101 1 ----------------- 00000000000000 100 --- 3位余数上面例子用的是4位CRC。在Ethernet中使用的因子为32位的以达到更好的检测效果。集线器(Hub) vs. 交换器(Switch)以太网使用集线器或者交换器将帧从发出地传送到目的地。一台集线器或交换器上有多个端口每个端口都可以连接一台计算机(或其他设备)。集线器像一个广播电台。一台电脑将帧发送到集线器集线器会将帧转发到所有其他的端口。每台计算机检查自己的MAC地址是不是符合DST。如果不是则保持沉默。集线器是比较早期的以太网设备。它有明显的缺陷1) 任意两台电脑的通信在同一个以太网上是公开的。所有连接在同一个集线器上的设备都能收听到别人在传输什么这样很不安全。可以通过对信息加密提高安全性。2) 不允许多路同时通信。如果两台电脑同时向集线器发信集线器会向所有设备发出“冲突”信息提醒发生冲突。可以在设备上增加冲突检测算法(collision detection)一旦设备发现有冲突则随机等待一段时间再重新发送。交换器克服集线器的缺陷。交换器记录有各个设备的MAC地址。当帧发送到交换器时交换器会检查DST然后将帧只发送到对应端口。交换器允许多路同时通信。由于交换器的优越性交换器基本上取代了集线器。但比较老的以太网还有可能在使用集线器。下面的一个视频来自CISCO更加形象的解释了这两种设备