我将继续沿用“友人畅谈、深度解剖”的风格像拆解一个精致的机械手表一样把每一个比特、每一个字段、每一行数学公式都拆明白并结合真实世界的运作逻辑让您看到这些冰冷的数字背后藏着怎样精妙的设计智慧。 亲密的网络旅程三物理世界的“信封信纸”——以太网帧的深度解剖与CRC数学的浪漫引言从宏观到微观我们从“高速公路”走向“卡车拼装”朋友我们又见面了。回想昨天我们谈了链路层作为“交通警察”和“收费站”的职责探讨了“共享大通铺”与“交换式写字楼”的演进史。今天我们需要把镜头拉得更近把焦距推到最小。想象一下网络世界里的数据包就像在高速公路上飞奔的快递卡车。我们昨天了解了整条公路的路况CSMA/CD、收费站管理交换机、以及公路编号802.3802.11等。而今天这两页书告诉我们的却是这辆卡车的车厢里具体堆放着什么卡车的车头是什么样子的每一颗螺丝比特是怎么拧上去的这就是以太网帧Ethernet Frame——它是网络数据传输的终极物理载体。它不是抽象的IP数据报而是你在网线、光纤里肉眼看不见的电脉冲或光脉冲的具体排列方式。这张图3-3左侧图片就是一份关于“卡车组装”的蓝色工程图纸。而右侧关于“CRC计算”的内容则是质检部门的精密仪器用来确保卡车里的货物没有在半路被颠碎。第一章“卡车”的组装图纸——图3-3的逐层拆解让我们先深吸一口气翻开第一张图。看到那个长长的、被分成好几个小格子的横条了吗这就是以太网帧的结构图。书里说“所有的以太网802.3帧都基于一个共同的格式。” 就像无论福特、丰田还是奔驰它们造的车本质上都是四个轮子一个方向盘以太网帧也一样。不管速度是10Mb/s还是1000Gb/s万兆它们的基础框架几乎是一致的。让我们从图3-3的最左侧一个一个拆解这些“部件”。1.1 前导码Preamble7字节与SFD帧首定界符1字节“醒醒快递来了”在图3-3的最左边你能看到“前导”Preamble和“SFD”两个栏目。书里专门描述了一段关于曼彻斯特编码的内容把它放在这里重点讲一下。这段设计是整台机器的“启动机关”。想象一下你正躺在沙发上睡得昏天黑地突然门铃响了。但是如果门铃只是个安静的震动器可能根本叫不醒你。前导码就是那个刺耳的、持续不断的、有特定节奏的门铃声。在数字世界里不同的网卡比如你的笔记本电脑和公司的千兆交换机内部它们的定时时钟晶振频率不可能100%完美同步。你家的网卡可能是以99.99%的精准度在“读”电压变化而交换机的网卡可能是以100.01%的精准度在“发”电压变化。如果没有前导码交换机发出的“1,0,1,0”这种波形传到你的网卡时可能会因为细微的时间漂移被读成“0,1,1,0”这种乱码。前导码7字节“10101010…”这就是一串连续的、规则的“滴答、滴答”声。当你的网卡检测到这串信号时它内部的电路会启动一个叫**PLL锁相环**的硬件模块这个模块会自动根据前导码的节奏精准锁定发射方的时钟频率。它就像是有经验的老司机在听发动机的声音不需要看仪表盘也知道转速是多少。SFD1字节“10101011”当网卡听到连续7个字节的“101010…”后突然听到最后两位变成了“11”这就好比门铃声突然变成了“叮咚”的变调。这个变调就是SFD。它告诉网卡“前边的101010只是热身用的热身曲现在正式的快递包裹就要送到门口了请立刻切换到‘高强度工作模式’”如果没有这8个字节网卡就会找不到“从哪里开始读”。它们确保了即使在物理层存在微小时钟偏差的情况下网络也能完美地同步启动。1.2 MAC地址DA和SA各6字节“寄件人”与“收件人”接下来是最关键的部分目的地址Destination Address6字节和源地址Source Address6字节。每个网卡或网络接口出厂时都被分配了一个全球唯一的48位二进制编号。这就是MAC地址比如00:1A:2B:3C:4D:5E。它就像是你房子的地理GPS坐标或者是你身份证上的唯一编号。目的地址DA这是收件人的名字。当你的电脑发出一个帧它必须明确写上“这个包裹是寄给192.168.1.101这台电脑的”。但是IP地址只是逻辑地址。在物理世界中交换机和网卡只认MAC地址。所以IP协议网络层会把“我要发给IP XXX”的请求扔给ARP地址解析协议ARP去问“谁是IP XXX”对方回答“我是我的MAC是YYY”。然后你的电脑就把这个MAC地址填进DA这个字段里。源地址SA这是寄件人的名字。它是“你是谁”的证明。当收到一个帧时交换机会根据SA学习到“哦原来这个MAC地址连接在我的7号端口上”。这就像邮递员看到信封上的回信地址下次不用问也知道怎么回信。特殊地址“广播”Broadcast如果DA填的是FF-FF-FF-FF-FF-FF全F那代表这封信是发给所有人的。交换机看到这个地址必须把它复制一份发给连接在它上面的每一个端口。这是网络协议比如ARP、DHCP用来寻找特定设备或配置的紧急手段。1.3 长度/类型Length/Type2字节关于“这封信是什么方言”的世纪争议这是图3-3中最具有设计争议和历史瑕疵的部分。请看左侧图片左下角的文字框“最初的IEEE802.3规范将长度/类型字段作为长度字段而不是类型字段使用…”这是什么意思呢这里有两套规则在打架规则一老IEEE 802.3思想这个字段应该代表“数据字段有多长字节数”。比如你写了1500个字节的数据这里就填1500。规则二Ethernet II今天互联网的主流思想这个字段应该代表“数据字段里装的是什么协议”。比如如果是IP数据包这里填0x0800如果是ARP数据包这里填0x0806。为什么会有冲突因为早期的网络设计者认为既然物理层有了MAC地址来区分谁在发那数据包里装的是什么协议IP, ARP, 或者其他应该由数据包内部的一个小标签LLC头部802.2来指明所以主MAC头里的这个字段只需要标“数据包有多长”就行了。但后来大家发现这样太麻烦了。为了省去额外的一个小头LLC头大家更喜欢用Ethernet II格式直接在MAC头部里就指明协议类型。解决矛盾的黄金法则现在绝大部分的TCP/IP网络通信都使用Ethernet II格式。那么怎么区分这两者呢标准规定如果该字段的数值小于等于15000x05DC那就表示它是长度字段。如果该字段的数值大于等于15360x0600那就表示它是类型字段。这意味着今天你抓取到的绝大多数包这个字段实际扮演的都是“类型”的角色。它告诉你“哥们儿这是个IP包拿给IP层处理”1.4 802.1Q标签VLAN Tag可选4字节大楼里的“门禁卡”注意看图3-3中间有一个可选的部分802.1Q标签。它由两部分组成TPID2字节固定0x8100和TCI2字节。这非常有意思。想象一下一个大型写字楼里有很多不同公司比如腾讯、阿里、百度都在同一栋楼里它们共享一整套物理网络电缆交换机。但是它们的数据需要互相隔离腾讯的数据不能发到阿里的端口上。物理隔离给每家公司拉一根独立的网线。这太浪费了逻辑隔离这就是VLAN虚拟局域网。通过在以太网帧里插入一个特殊的4字节标签802.1Q交换机就知道“啊这个帧是腾讯公司的VLAN ID 10我只能把它发给属于VLAN 10的端口。”这个字段就像一个门禁卡。没有这个标签的帧就是普通访客默认VLAN。有这个标签的帧有特定的权限可以穿越不同物理交换机组建虚拟的专属网络。这个设计非常聪明它让网络管理员可以在一根网线上划出好几百个互相隔离的逻辑网络极大地节省了硬件成本。1.5 数据与填充Data Pad46-1500字节真正的“邮件”与“补丁”这是一个套娃结构。数据这是真正的上层协议IPARP等封装下来的数据报。它是发的内容。填充Pad这是一个极其容易忽略的小细节但非常重要。图3-3明确写了“填充0~46个字节”。为什么需要填充还记得我们在前一天聊到的CSMA/CD吗那个“大通铺”模式最大的问题就是碰撞。为了让碰撞检测机制CD生效以太网标准规定一个有效帧的最小长度不能小于64字节。如果IP层给你的数据包只有1个字节比如一个“ping”命令的响应包那么加上MAC头、类型字段、FCS校验和整个帧的总长度可能只有20多个字节小于64字节。这时候以太网硬件就会决定“这列火车太短了根本检测不到我是不是撞车了。不行我得往车尾加一些压舱物填充数据” 这些填进去的“垃圾数据”接收方收到后会直接丢弃它们纯粹是为了延长帧的物理长度。所以当网络包特别小的时候你抓包时会看到很多0x00或奇怪的数据它们就是“填充”它们不是真实的数据。1.6 帧校验序列FCS4字节质检员的“防伪封泥”这是帧的最末尾是全书的“必考点”和右侧图片重点讲解的内容。我们先用一句话理解它的作用它是一道精密数学题。网卡在发送帧之前会把整个帧除了FCS本身当成一个巨大的数字用一个复杂的公式算出一段代码附在后面。接收方收到后用同样的公式算一遍看看算出来的代码和收到的代码是不是一样的。对上了说明路上没有坏掉。对不上说明路上有噪音导致了比特翻转。接收方会直接把整个帧当作垃圾扔掉并请求发送方重传由上层TCP协议负责。它就是网络包上的数字防伪封条。我们将专门用一大章节第三章来深入解析右侧图片中的CRC计算过程。第二章被遗忘的精彩——书里为何特意提到“曼彻斯特相位编码”在图3-3中文字框特别提到“注意虽然以太网的最低位编码使用了两种电压等级的曼彻斯特相位编码…。通过MPE…进行解码。”为什么要在讲解帧格式的书页里特意提到编码方式这里藏着一个关于物理层和时钟同步的宏大智慧。如果不用曼彻斯特编码直接用非归零码NRZ即高电平代表1低电平代表0会发生什么想象你要发送一串111111111111。在物理层上你会发出一条持续不变的、高高的直线电压。接收方收到这个信号后它只能看到“嗯是个高电平。”但是这个“高电平”里到底包含多少个1呢是12个还是13个还是8个接收方根本无法从信号的“电平高低”本身判断出比特的数量因为它丢失了“时钟”信号。曼彻斯特编码为了解决这个问题规定1代表“从高电平跳变到低电平”。0代表“从低电平跳变到高电平”。这就意味着无论你是发送0还是1每个比特内部都必然包含一次电压跳变接收方通过检测跳变就可以精准地提取出时钟频率从而知道每一个比特的开始和结束位置。这也是为什么很早以前的10Mb/s以太网不使用光纤因为光纤很难实现这种双向跳变检测而是用信号比较“嘈杂”的铜线。这是一种物理妥协。第三章数学之美——深度拆解右侧图片的CRC计算模2除法好的现在我们把目光移到第二张图的底部。这部分文字把整个数学逻辑推向了顶点。书中展示了图3-4 长mod 2二进制除法演示。书中用一串特定的二进制数字100111000110101116位消息来进行计算。我们需要以一个“看天书”的心态把这段文字彻底剥开。这是以太网中最神秘的加密算法——**CRC-32循环冗余校验**的一个简化教学版。3.1 为何要做除法生成多项式在CRC中发送方和接收方需要事先约定一个数字这个数字被称为生成多项式Generator。在这个例子中文本中提到“这个多项式是10000100000100001”。这是一个17位的数字。我们可以把它看作是质数的概念。就像在模算术里我们希望用这个特殊的数字做除数来检验被除数是否能被整除。3.2 为什么要加上“13个0”——模2除法的前奏书中写道“首先开始进行图3-4所示的mod 2二进制除法。” “余数的二进制…是0010。该余数如余数为0010加上13个‘0’组成一个16位FCS…”。这里有一个非常重要的细节需要厘清。标准的CRC计算流程是确定多项式次数生成多项式10000100000100001的长度是17位最高位是2的16次方所以它的次数是16。填充0为了计算出16位余数你需要给原来的信息末尾加上16个0而不是13个0。这是非常标准的。书中提到的13可能是一个教学简化的特例或者是一个印刷错误。但让我们按逻辑推演我们先把校验位算出来按照标准方法原始信息1001110001101011加上16个010011100011010110000000000000000下一步执行mod 2长除法。书上写的是“模2”除法。普通除法除数10000100000100001模2减法它也是“异或”XOR运算。1 XOR 1 0 1 XOR 0 1 0 XOR 1 1 0 XOR 0 0。我们来做个模拟的模2除法取被除数的前17位因为除数有17位10011100011010110。比较前17位与除数10000100000100001第一位是1表示可以进行除法。执行异或运算10011100011010110XOR1000010000010000100011000011110111把剩下的位数拉下来。11000011110111加上后面剩下的位数…不断重复这个过程直到除完所有填上去的0。最终你会得到一个16位的余数。这个余数就是我们要填到FCS字段里发送出去的那个**4字节32位**数据的本源在这个简化16位余数的情况下对应2字节FCS。3.3 书中那个特定计算的秘密如果我们仔细观察书中那个表格它的余数是00104位而不是16位。这说明书中只是用一个“非常非常缩水的、伪装成16位CRC”的小型例子来教学演示“模2除法”的概念。它并不是真实的CRC-32它的核心目标是让你理解异或运算的规则并看到余数是怎么算出来的。3.4 为什么强调FCS是4字节在真实世界的以太网802.3中FCS使用的是32位的CRC-32。它的生成多项式是一个固定的国际标准。当接收方计算完CRC后如果最终余数不是全0或者不符合一个特定的“魔术数值”就会断定这个帧是坏的。一个有趣的事实很多时候物理层的噪音并不会导致帧被完全破坏而是导致帧里的数据比特发生意外翻转。如果没有CRC应用层可能会收到错误的金融转账数据而CRC就是守住这层防线的最后一道安全门。第四章实战场景——一封电子邮件的“DNA旅程”把这个帧格式带入一个真实的场景场景你在家里用笔记本电脑打开网页。拼装帧你你的浏览器把“GET /index.html”封装成一个IP数据包。IP数据包被交给以太网层。你的网卡芯片MAC地址00:11:22:33:44:55准备向你们的家庭路由器MAC地址AA:BB:CC:DD:EE:FF发送这个包。目标MACAA-BB-CC-DD-EE-FF路由器源MAC00-11-22-33-44-55你类型0x0800IP数据IP包的二进制内容。FCS网卡硬件自动算好这个32位的校验码附在尾部。填充不需要因为数据包足够大。发送网卡网卡加上前导码和SFD通过网线发送出去。信号转化为曼彻斯特编码如果是10Mb/s现代千兆网则用更复杂的PAM编码在铜线里流淌。穿越交换机交换机的网卡接收到这串电信号。它检测SFD定位起始位置。它拿出目的MAC地址AA:BB:CC:DD:EE:FF发现在它的转发表里这个MAC地址指向路由器的端口。于是它只把这个帧转发到路由器那个端口。到达路由器路由器的网卡收到帧。它先计算FCS发现跟帧尾的校验码完全吻合。它剥掉以太网帧头丢给上层IP层处理。IP层再把它发给互联网。返回从服务器服务器发回一个“网页内容”的数据包。跟流程一样唯一的区别是这个返回包里的源MAC是路由器目标MAC是笔记本。第五章终极思考——设计背后的博弈与权衡为什么以太网帧要设计成现在这个样子这背后绝不是拍脑袋的产物而是物理极限、成本、历史遗留和未来扩展的不断博弈。为什么要留“填充”主要是为了兼容那个已经几乎消失的CSMA/CD。在那个“大通铺”时代你必须保证帧的长度足以让碰撞检测器监听器在发完信号前就能听到自己产生的冲突信号。这是为了服务古老技术的兼容性。为什么要有VLAN标签802.1Q是为了让网络从“物理基础设施”升级为“高度可管理的逻辑资源”。在一座大型数据中心里一根光纤可以切割成几百个互相独立的VLAN极大地节省了布线成本。为什么要用Ethernet II而不用纯粹的IEEE 802.3格式这是市场选择的胜利。TCP/IP协议是互联网的绝对霸主而TCP/IP最终选择了简单明了的Ethernet II。这证明了在开放标准体系里最简单、最高效的实现往往会击败那些设计得过于完美但过于复杂的理论模型。结语从比特到奇迹当你再次凝视这两张书页时我希望你看到的不仅仅是一堆表格和数字。你应该看到一个完整的、相互依存、精妙绝伦的工程系统。图3-3展示了从“唤醒信号前导码”到“电子邮戳CRC”的完整流程。图3-4展示了保证这些比特正确无误的底层数学逻辑。从曼彻斯特编码到802.1Q从SFD到CRC每一个比特都是为了实现一个目标让数据在无数个物理线缆、光纤和交换机之间安全、快速、准确地抵达目的地。这就是以太网帧。它是计算机网络所有奇迹的基石是TCP/IP这块宏伟交响乐的初始乐章。希望这次的“解剖之旅”能为你提供一个更立体的视角去审视那个每时每刻都在高速运转、满载着人类智慧与信息的看不见的物理世界。下次当你看到网卡灯闪烁时你可以想象在那微弱的亮光背后每秒钟有数百万个像图3-3那样完美的“信件”正在被精密地阅读、核验、并送达。这就是属于数字时代的奇迹与浪漫。
亲密的网络旅程(三):物理世界的“信封信纸”——以太网帧的深度解剖与CRC数学的浪漫
我将继续沿用“友人畅谈、深度解剖”的风格像拆解一个精致的机械手表一样把每一个比特、每一个字段、每一行数学公式都拆明白并结合真实世界的运作逻辑让您看到这些冰冷的数字背后藏着怎样精妙的设计智慧。 亲密的网络旅程三物理世界的“信封信纸”——以太网帧的深度解剖与CRC数学的浪漫引言从宏观到微观我们从“高速公路”走向“卡车拼装”朋友我们又见面了。回想昨天我们谈了链路层作为“交通警察”和“收费站”的职责探讨了“共享大通铺”与“交换式写字楼”的演进史。今天我们需要把镜头拉得更近把焦距推到最小。想象一下网络世界里的数据包就像在高速公路上飞奔的快递卡车。我们昨天了解了整条公路的路况CSMA/CD、收费站管理交换机、以及公路编号802.3802.11等。而今天这两页书告诉我们的却是这辆卡车的车厢里具体堆放着什么卡车的车头是什么样子的每一颗螺丝比特是怎么拧上去的这就是以太网帧Ethernet Frame——它是网络数据传输的终极物理载体。它不是抽象的IP数据报而是你在网线、光纤里肉眼看不见的电脉冲或光脉冲的具体排列方式。这张图3-3左侧图片就是一份关于“卡车组装”的蓝色工程图纸。而右侧关于“CRC计算”的内容则是质检部门的精密仪器用来确保卡车里的货物没有在半路被颠碎。第一章“卡车”的组装图纸——图3-3的逐层拆解让我们先深吸一口气翻开第一张图。看到那个长长的、被分成好几个小格子的横条了吗这就是以太网帧的结构图。书里说“所有的以太网802.3帧都基于一个共同的格式。” 就像无论福特、丰田还是奔驰它们造的车本质上都是四个轮子一个方向盘以太网帧也一样。不管速度是10Mb/s还是1000Gb/s万兆它们的基础框架几乎是一致的。让我们从图3-3的最左侧一个一个拆解这些“部件”。1.1 前导码Preamble7字节与SFD帧首定界符1字节“醒醒快递来了”在图3-3的最左边你能看到“前导”Preamble和“SFD”两个栏目。书里专门描述了一段关于曼彻斯特编码的内容把它放在这里重点讲一下。这段设计是整台机器的“启动机关”。想象一下你正躺在沙发上睡得昏天黑地突然门铃响了。但是如果门铃只是个安静的震动器可能根本叫不醒你。前导码就是那个刺耳的、持续不断的、有特定节奏的门铃声。在数字世界里不同的网卡比如你的笔记本电脑和公司的千兆交换机内部它们的定时时钟晶振频率不可能100%完美同步。你家的网卡可能是以99.99%的精准度在“读”电压变化而交换机的网卡可能是以100.01%的精准度在“发”电压变化。如果没有前导码交换机发出的“1,0,1,0”这种波形传到你的网卡时可能会因为细微的时间漂移被读成“0,1,1,0”这种乱码。前导码7字节“10101010…”这就是一串连续的、规则的“滴答、滴答”声。当你的网卡检测到这串信号时它内部的电路会启动一个叫**PLL锁相环**的硬件模块这个模块会自动根据前导码的节奏精准锁定发射方的时钟频率。它就像是有经验的老司机在听发动机的声音不需要看仪表盘也知道转速是多少。SFD1字节“10101011”当网卡听到连续7个字节的“101010…”后突然听到最后两位变成了“11”这就好比门铃声突然变成了“叮咚”的变调。这个变调就是SFD。它告诉网卡“前边的101010只是热身用的热身曲现在正式的快递包裹就要送到门口了请立刻切换到‘高强度工作模式’”如果没有这8个字节网卡就会找不到“从哪里开始读”。它们确保了即使在物理层存在微小时钟偏差的情况下网络也能完美地同步启动。1.2 MAC地址DA和SA各6字节“寄件人”与“收件人”接下来是最关键的部分目的地址Destination Address6字节和源地址Source Address6字节。每个网卡或网络接口出厂时都被分配了一个全球唯一的48位二进制编号。这就是MAC地址比如00:1A:2B:3C:4D:5E。它就像是你房子的地理GPS坐标或者是你身份证上的唯一编号。目的地址DA这是收件人的名字。当你的电脑发出一个帧它必须明确写上“这个包裹是寄给192.168.1.101这台电脑的”。但是IP地址只是逻辑地址。在物理世界中交换机和网卡只认MAC地址。所以IP协议网络层会把“我要发给IP XXX”的请求扔给ARP地址解析协议ARP去问“谁是IP XXX”对方回答“我是我的MAC是YYY”。然后你的电脑就把这个MAC地址填进DA这个字段里。源地址SA这是寄件人的名字。它是“你是谁”的证明。当收到一个帧时交换机会根据SA学习到“哦原来这个MAC地址连接在我的7号端口上”。这就像邮递员看到信封上的回信地址下次不用问也知道怎么回信。特殊地址“广播”Broadcast如果DA填的是FF-FF-FF-FF-FF-FF全F那代表这封信是发给所有人的。交换机看到这个地址必须把它复制一份发给连接在它上面的每一个端口。这是网络协议比如ARP、DHCP用来寻找特定设备或配置的紧急手段。1.3 长度/类型Length/Type2字节关于“这封信是什么方言”的世纪争议这是图3-3中最具有设计争议和历史瑕疵的部分。请看左侧图片左下角的文字框“最初的IEEE802.3规范将长度/类型字段作为长度字段而不是类型字段使用…”这是什么意思呢这里有两套规则在打架规则一老IEEE 802.3思想这个字段应该代表“数据字段有多长字节数”。比如你写了1500个字节的数据这里就填1500。规则二Ethernet II今天互联网的主流思想这个字段应该代表“数据字段里装的是什么协议”。比如如果是IP数据包这里填0x0800如果是ARP数据包这里填0x0806。为什么会有冲突因为早期的网络设计者认为既然物理层有了MAC地址来区分谁在发那数据包里装的是什么协议IP, ARP, 或者其他应该由数据包内部的一个小标签LLC头部802.2来指明所以主MAC头里的这个字段只需要标“数据包有多长”就行了。但后来大家发现这样太麻烦了。为了省去额外的一个小头LLC头大家更喜欢用Ethernet II格式直接在MAC头部里就指明协议类型。解决矛盾的黄金法则现在绝大部分的TCP/IP网络通信都使用Ethernet II格式。那么怎么区分这两者呢标准规定如果该字段的数值小于等于15000x05DC那就表示它是长度字段。如果该字段的数值大于等于15360x0600那就表示它是类型字段。这意味着今天你抓取到的绝大多数包这个字段实际扮演的都是“类型”的角色。它告诉你“哥们儿这是个IP包拿给IP层处理”1.4 802.1Q标签VLAN Tag可选4字节大楼里的“门禁卡”注意看图3-3中间有一个可选的部分802.1Q标签。它由两部分组成TPID2字节固定0x8100和TCI2字节。这非常有意思。想象一下一个大型写字楼里有很多不同公司比如腾讯、阿里、百度都在同一栋楼里它们共享一整套物理网络电缆交换机。但是它们的数据需要互相隔离腾讯的数据不能发到阿里的端口上。物理隔离给每家公司拉一根独立的网线。这太浪费了逻辑隔离这就是VLAN虚拟局域网。通过在以太网帧里插入一个特殊的4字节标签802.1Q交换机就知道“啊这个帧是腾讯公司的VLAN ID 10我只能把它发给属于VLAN 10的端口。”这个字段就像一个门禁卡。没有这个标签的帧就是普通访客默认VLAN。有这个标签的帧有特定的权限可以穿越不同物理交换机组建虚拟的专属网络。这个设计非常聪明它让网络管理员可以在一根网线上划出好几百个互相隔离的逻辑网络极大地节省了硬件成本。1.5 数据与填充Data Pad46-1500字节真正的“邮件”与“补丁”这是一个套娃结构。数据这是真正的上层协议IPARP等封装下来的数据报。它是发的内容。填充Pad这是一个极其容易忽略的小细节但非常重要。图3-3明确写了“填充0~46个字节”。为什么需要填充还记得我们在前一天聊到的CSMA/CD吗那个“大通铺”模式最大的问题就是碰撞。为了让碰撞检测机制CD生效以太网标准规定一个有效帧的最小长度不能小于64字节。如果IP层给你的数据包只有1个字节比如一个“ping”命令的响应包那么加上MAC头、类型字段、FCS校验和整个帧的总长度可能只有20多个字节小于64字节。这时候以太网硬件就会决定“这列火车太短了根本检测不到我是不是撞车了。不行我得往车尾加一些压舱物填充数据” 这些填进去的“垃圾数据”接收方收到后会直接丢弃它们纯粹是为了延长帧的物理长度。所以当网络包特别小的时候你抓包时会看到很多0x00或奇怪的数据它们就是“填充”它们不是真实的数据。1.6 帧校验序列FCS4字节质检员的“防伪封泥”这是帧的最末尾是全书的“必考点”和右侧图片重点讲解的内容。我们先用一句话理解它的作用它是一道精密数学题。网卡在发送帧之前会把整个帧除了FCS本身当成一个巨大的数字用一个复杂的公式算出一段代码附在后面。接收方收到后用同样的公式算一遍看看算出来的代码和收到的代码是不是一样的。对上了说明路上没有坏掉。对不上说明路上有噪音导致了比特翻转。接收方会直接把整个帧当作垃圾扔掉并请求发送方重传由上层TCP协议负责。它就是网络包上的数字防伪封条。我们将专门用一大章节第三章来深入解析右侧图片中的CRC计算过程。第二章被遗忘的精彩——书里为何特意提到“曼彻斯特相位编码”在图3-3中文字框特别提到“注意虽然以太网的最低位编码使用了两种电压等级的曼彻斯特相位编码…。通过MPE…进行解码。”为什么要在讲解帧格式的书页里特意提到编码方式这里藏着一个关于物理层和时钟同步的宏大智慧。如果不用曼彻斯特编码直接用非归零码NRZ即高电平代表1低电平代表0会发生什么想象你要发送一串111111111111。在物理层上你会发出一条持续不变的、高高的直线电压。接收方收到这个信号后它只能看到“嗯是个高电平。”但是这个“高电平”里到底包含多少个1呢是12个还是13个还是8个接收方根本无法从信号的“电平高低”本身判断出比特的数量因为它丢失了“时钟”信号。曼彻斯特编码为了解决这个问题规定1代表“从高电平跳变到低电平”。0代表“从低电平跳变到高电平”。这就意味着无论你是发送0还是1每个比特内部都必然包含一次电压跳变接收方通过检测跳变就可以精准地提取出时钟频率从而知道每一个比特的开始和结束位置。这也是为什么很早以前的10Mb/s以太网不使用光纤因为光纤很难实现这种双向跳变检测而是用信号比较“嘈杂”的铜线。这是一种物理妥协。第三章数学之美——深度拆解右侧图片的CRC计算模2除法好的现在我们把目光移到第二张图的底部。这部分文字把整个数学逻辑推向了顶点。书中展示了图3-4 长mod 2二进制除法演示。书中用一串特定的二进制数字100111000110101116位消息来进行计算。我们需要以一个“看天书”的心态把这段文字彻底剥开。这是以太网中最神秘的加密算法——**CRC-32循环冗余校验**的一个简化教学版。3.1 为何要做除法生成多项式在CRC中发送方和接收方需要事先约定一个数字这个数字被称为生成多项式Generator。在这个例子中文本中提到“这个多项式是10000100000100001”。这是一个17位的数字。我们可以把它看作是质数的概念。就像在模算术里我们希望用这个特殊的数字做除数来检验被除数是否能被整除。3.2 为什么要加上“13个0”——模2除法的前奏书中写道“首先开始进行图3-4所示的mod 2二进制除法。” “余数的二进制…是0010。该余数如余数为0010加上13个‘0’组成一个16位FCS…”。这里有一个非常重要的细节需要厘清。标准的CRC计算流程是确定多项式次数生成多项式10000100000100001的长度是17位最高位是2的16次方所以它的次数是16。填充0为了计算出16位余数你需要给原来的信息末尾加上16个0而不是13个0。这是非常标准的。书中提到的13可能是一个教学简化的特例或者是一个印刷错误。但让我们按逻辑推演我们先把校验位算出来按照标准方法原始信息1001110001101011加上16个010011100011010110000000000000000下一步执行mod 2长除法。书上写的是“模2”除法。普通除法除数10000100000100001模2减法它也是“异或”XOR运算。1 XOR 1 0 1 XOR 0 1 0 XOR 1 1 0 XOR 0 0。我们来做个模拟的模2除法取被除数的前17位因为除数有17位10011100011010110。比较前17位与除数10000100000100001第一位是1表示可以进行除法。执行异或运算10011100011010110XOR1000010000010000100011000011110111把剩下的位数拉下来。11000011110111加上后面剩下的位数…不断重复这个过程直到除完所有填上去的0。最终你会得到一个16位的余数。这个余数就是我们要填到FCS字段里发送出去的那个**4字节32位**数据的本源在这个简化16位余数的情况下对应2字节FCS。3.3 书中那个特定计算的秘密如果我们仔细观察书中那个表格它的余数是00104位而不是16位。这说明书中只是用一个“非常非常缩水的、伪装成16位CRC”的小型例子来教学演示“模2除法”的概念。它并不是真实的CRC-32它的核心目标是让你理解异或运算的规则并看到余数是怎么算出来的。3.4 为什么强调FCS是4字节在真实世界的以太网802.3中FCS使用的是32位的CRC-32。它的生成多项式是一个固定的国际标准。当接收方计算完CRC后如果最终余数不是全0或者不符合一个特定的“魔术数值”就会断定这个帧是坏的。一个有趣的事实很多时候物理层的噪音并不会导致帧被完全破坏而是导致帧里的数据比特发生意外翻转。如果没有CRC应用层可能会收到错误的金融转账数据而CRC就是守住这层防线的最后一道安全门。第四章实战场景——一封电子邮件的“DNA旅程”把这个帧格式带入一个真实的场景场景你在家里用笔记本电脑打开网页。拼装帧你你的浏览器把“GET /index.html”封装成一个IP数据包。IP数据包被交给以太网层。你的网卡芯片MAC地址00:11:22:33:44:55准备向你们的家庭路由器MAC地址AA:BB:CC:DD:EE:FF发送这个包。目标MACAA-BB-CC-DD-EE-FF路由器源MAC00-11-22-33-44-55你类型0x0800IP数据IP包的二进制内容。FCS网卡硬件自动算好这个32位的校验码附在尾部。填充不需要因为数据包足够大。发送网卡网卡加上前导码和SFD通过网线发送出去。信号转化为曼彻斯特编码如果是10Mb/s现代千兆网则用更复杂的PAM编码在铜线里流淌。穿越交换机交换机的网卡接收到这串电信号。它检测SFD定位起始位置。它拿出目的MAC地址AA:BB:CC:DD:EE:FF发现在它的转发表里这个MAC地址指向路由器的端口。于是它只把这个帧转发到路由器那个端口。到达路由器路由器的网卡收到帧。它先计算FCS发现跟帧尾的校验码完全吻合。它剥掉以太网帧头丢给上层IP层处理。IP层再把它发给互联网。返回从服务器服务器发回一个“网页内容”的数据包。跟流程一样唯一的区别是这个返回包里的源MAC是路由器目标MAC是笔记本。第五章终极思考——设计背后的博弈与权衡为什么以太网帧要设计成现在这个样子这背后绝不是拍脑袋的产物而是物理极限、成本、历史遗留和未来扩展的不断博弈。为什么要留“填充”主要是为了兼容那个已经几乎消失的CSMA/CD。在那个“大通铺”时代你必须保证帧的长度足以让碰撞检测器监听器在发完信号前就能听到自己产生的冲突信号。这是为了服务古老技术的兼容性。为什么要有VLAN标签802.1Q是为了让网络从“物理基础设施”升级为“高度可管理的逻辑资源”。在一座大型数据中心里一根光纤可以切割成几百个互相独立的VLAN极大地节省了布线成本。为什么要用Ethernet II而不用纯粹的IEEE 802.3格式这是市场选择的胜利。TCP/IP协议是互联网的绝对霸主而TCP/IP最终选择了简单明了的Ethernet II。这证明了在开放标准体系里最简单、最高效的实现往往会击败那些设计得过于完美但过于复杂的理论模型。结语从比特到奇迹当你再次凝视这两张书页时我希望你看到的不仅仅是一堆表格和数字。你应该看到一个完整的、相互依存、精妙绝伦的工程系统。图3-3展示了从“唤醒信号前导码”到“电子邮戳CRC”的完整流程。图3-4展示了保证这些比特正确无误的底层数学逻辑。从曼彻斯特编码到802.1Q从SFD到CRC每一个比特都是为了实现一个目标让数据在无数个物理线缆、光纤和交换机之间安全、快速、准确地抵达目的地。这就是以太网帧。它是计算机网络所有奇迹的基石是TCP/IP这块宏伟交响乐的初始乐章。希望这次的“解剖之旅”能为你提供一个更立体的视角去审视那个每时每刻都在高速运转、满载着人类智慧与信息的看不见的物理世界。下次当你看到网卡灯闪烁时你可以想象在那微弱的亮光背后每秒钟有数百万个像图3-3那样完美的“信件”正在被精密地阅读、核验、并送达。这就是属于数字时代的奇迹与浪漫。