简介:这份文档面向网络基础入门者与嵌入式方向学习者,系统梳理物理层相关知识,帮助读者理解数据从应用层到物理层的封装与解封装全过程,并厘清不同数据交换方式的差异。内容围绕电路交换、报文交换与分组交换展开,结合快递包裹的类比讲解封装思路,同时介绍网络最小三要素、同轴电缆与双绞线等传输介质、以太网标准、冲突域及 CSMA/CD 载波侦听多路访问/冲突检测机制,兼顾概念理解与排错思路。资源包共 1 个 docx 文件,约 3.46MB,以图文笔记形式组织,便于按知识点检索与复习。目前已有 104 人学习,适合需要打牢 Ethernet 与 TCP/IP 底层基础、补齐物理层认知短板的读者参考。
1. 物理层不是“拉根网线”:从比特流到冲突域,网络最底层的真相
很多人学网络时把物理层当成“网线插上就能通”的废话章节,直到某天在嵌入式板子上抓包发现链路时通时断,才回头翻数据手册。物理层真正解决的问题只有一个:把上层交下来的 0 和 1,变成传输介质上可被识别的物理信号,并且让多台设备共享同一根线时不至于互相踩踏。这份资料从电路交换、报文交换讲到分组交换,再落到同轴电缆、CSMA/CD 和双绞线,恰好把“为什么以太网长成今天这样”的因果链串了起来。搞懂这一层,你再看 TCP/IP 协议栈的封装解封装,就不会觉得那是玄学,而是一层层可验证的工程取舍。
2. 三种交换方式:为什么分组交换成了以太网的底座
2.1 电路交换的“独占”代价
电路交换的核心动作是通信前先建立一条逻辑电路,这条线路在会话期间只传递这一对设备的数据。资料里说得很直白:当某一时刻不通信了,这条逻辑电路仍然被占用,别人无法使用。这就像两个人打电话,从拨通到挂断,中间那条话路资源一直锁着,哪怕双方沉默十分钟,别人也打不进来。
这种机制在语音场景下是合理的,因为语音需要连续、稳定的带宽,建立连接的开销可以被长时间通话摊薄。但放到数据通信里就翻车了:数据是突发的,你发一个请求可能只占几毫秒,剩下时间线路空转。常见的实现思路是,电路交换适合“持续流”型业务,不适合“短促突发”型业务。资料没有展开信令建立的具体过程,但结论已经足够清楚:独占式资源分配在数据场景下利用率太低。
2.2 报文交换的标识机制
为了提升效率,报文交换允许两个以上设备同时想用同一条线路发送数据。防止混乱的手段是加标识:每个人把自己要传的数据加上标识,接收端根据标识判断这段数据属于谁。资料里用“防止数据在传输过程中传输混乱”来描述这个动机,本质上就是让共享链路具备区分数据归属的能力。
这里的关键设计是“存储转发”的雏形:数据不再要求端到端独占通路,而是带着身份信息上路。但报文交换有一个隐患资料没有明说但可以推出来:如果一份报文很大,它会长时间占住链路,其他设备的报文只能排队。标识解决了“是谁的”问题,没解决“一次占多久”的问题。
2.3 分组交换:给数据定一个上限
分组交换在报文交换的基础上多做了一件事:给每个数据段的大小定义一个上限,先做分片,每段带标识,标明从哪个设备到哪个设备。资料原文是“将每个数据的大小进行定义,先做一个分片,每个数据段的值是有一个上限值的,同时加一个标识”。
这一步的意义在于把“大块占用”拆成“小块轮转”。多台设备可以交替使用同一条链路,每台设备每次只传一个固定大小的分组,传完就让出。资料也点出了随之而来的问题:数据大小不一致时会出现转发的不公平现象,所以进一步规定一个固定值,每次只传这么大的值。这个“固定值”就是后来以太网帧长上限的思想源头。
用一段伪代码来还原分组转发的调度逻辑,帮助理解“固定大小”为什么能缓解不公平:
# 简化的分组轮转调度示意 MAX_PACKET_SIZE = 1500 # 分组大小上限,对应以太网帧的数据字段上限 def schedule(devices): queues = {dev: split_into_packets(data, MAX_PACKET_SIZE) for dev, data in devices.items()} while any(queues.values()): for dev in queues: if queues[dev]: pkt = queues[dev].pop(0) # 每次只取一个固定大小分组 transmit(pkt) # 占用链路一个时间片这段逻辑里,MAX_PACKET_SIZE是硬约束,split_into_packets负责分片,transmit每次只处理一个分组。参数MAX_PACKET_SIZE取多大,直接决定单次占用链路的时间上限;取值越小,轮转越公平,但报头开销占比越高。资料没有给出具体数值,但“固定值”这个设计动机已经交代得很清楚:用统一尺寸换取可预测的调度粒度。
提示:分组交换的“公平”是相对的,固定大小只是让每个设备单次占用时间有上界,并不保证带宽均分。真正的公平性还要靠上层协议和队列管理。
3. 封装与解封装:快递包裹模型背后的分层账本
3.1 从应用数据到比特流
资料用快递包裹打比方:快递包装盒塞了很多东西,最终对方要的只是里面的小物件,这个小物件就像应用层的数据。对于接收者而言,只是把数据拆开看看,没问题就行了。封装是从上层到下层,解封装是从下层到上层一层层拆。
这个比喻的价值在于说清“额外开销”的合理性。每一层加自己的报头,就像包裹外面贴的运单、防震填充、外箱标签,收件人最终只关心里面的物品,但运输过程必须靠这些外层信息才能正确路由和校验。物理层处在最底下,它看到的是经过层层封装后的完整帧,然后通过网卡/口把帧变成传输介质上的 010101 比特流。
常见的实现思路是,封装过程每一层只关心自己那一层的报头,不关心上层载荷的具体内容。应用层数据交给传输层,传输层加端口号等信息;到了网络层加地址信息;到了数据链路层加帧头和帧尾;物理层负责编码成信号。解封装则严格反向,每一层剥掉自己的报头后把载荷上交。
3.2 最小网络三要素:网线、网卡、协议栈
资料给了一个很干脆的结论:网络诞生前是刻录,网络诞生后是网线、网卡、协议栈,称为想要完成最小网络的三要素。网线上是比特流,通过网卡转换,现在的协议栈 TCP/IP 几乎都集成在设备上,只要买的设备跟网络相关,基本上都支持 TCP/IP。
这三要素对应三个层次的责任:网线是传输介质,负责物理信号的承载;网卡是物理层和链路层的交界,负责把比特流和帧互相转换;协议栈是软件侧的分层处理逻辑。缺了任何一个,最小网络都跑不起来。嵌入式场景下这一点尤其明显:很多 SoC 内置了 MAC 控制器,但外部还要接 PHY 芯片和变压器,才能把数字信号变成双绞线上可传输的差分信号。资料没有展开 PHY 细节,但“网卡转换”四个字已经点到了这个边界。
3.3 封装顺序为什么不能颠倒
封装从上层到下层,解封装从下层到上层,这个顺序不是随便定的。上层协议依赖下层提供的服务,下层不知道也不关心上层的语义。如果顺序颠倒,接收端就无法在正确的层次上解析对应报头。举个具体例子:链路层帧头里有一个字段标识上层协议类型,接收端必须先剥掉帧头,才能知道载荷该交给网络层的哪个模块处理。这个“先拆外箱再拆内盒”的顺序,就是分层协议栈能工作的前提。
资料里“没问题就行了”这句话看似随意,其实对应解封装过程中的校验动作:帧尾的校验字段用来判断这段数据在传输中是否出错,出错就丢弃,不出错就继续往上交。物理层不负责纠错,只负责把信号还原成比特,校验是链路层的事。这个分工在排查链路问题时非常关键,后面避坑章节会展开。
4. 同轴电缆与冲突域:共享介质为什么要靠 CSMA/CD 续命
4.1 10BASE5 标准拆解
资料给出了以太网标准的读法:10BASE5,10 表示每秒传 10M,BASE 表示基于某种标准在同轴电缆上进行曼彻斯特编码传输,5 表示传输距离 500 米。同轴电缆中所有设备共享一根网络线,称为共享型网络。缺点很直接:传输速度慢,没有私密性可言。
这里每个参数都有物理含义。10M 是速率上限,受编码方式和电缆特性限制;BASE 指基带传输,即整根电缆的频带只传一路信号;5 是 500 米,超过这个距离信号衰减到无法可靠识别。曼彻斯特编码的作用是把时钟信息嵌入信号跳变中,接收端可以从数据流里恢复时钟,不需要额外时钟线。常见的实现思路是,曼彻斯特编码的代价是带宽效率只有 50%,但换来了自同步能力,在早期共享介质上这是划算的取舍。
同轴电缆要实现多设备互联,可以用耦合器,每个接口下接一个设备,画图时用一根线表示,一根线上承载多个设备。这种拓扑就是后来“总线型网络”的典型形态,所有设备挂在同一根总线上,任何一台发送,其他所有设备都能听到。
4.2 冲突域是怎么形成的
资料定义冲突域:设备互相传输会产生数据碰撞,数据在这个范围称为冲突域。设备越多,传输越慢,冲突域也就越大。这个因果链很清晰:共享一根线,同一时刻只能有一个信号在线上传播,两台设备同时发送,信号叠加后双方的数据都损坏,只能重发。设备数量增加,同时发送的概率上升,碰撞次数增加,有效吞吐下降。
冲突域的大小由物理连接范围决定,耦合器连接的整根同轴电缆就是一个冲突域。这个概念的实用价值在于:它告诉你为什么后来要用网桥和交换机把大冲突域切小。资料没有讲交换机,但冲突域的定义已经为理解“隔离冲突域”埋了伏笔。
4.3 CSMA/CD 的听、发、停、退四步
避免冲突的机制是 CSMA/CD,资料拆得很细:先听后发,一个设备先去听线上有没有电压摆动值,听完后若发现线是静止的,就开始发送数据。边听边发,同时有两台设备都听到了线是静止的,那么先听到线上有电压摆动的就不往线上发送数据,停止发送,冲突停发。这时会有一个退避算法,计算一个值,比如 10 秒,此时 10 秒内不往线上发,10 秒后再次去听线上是否还是被占用,这里计算称为随机延迟后重发。
把这四步对应到机制上:载波侦听解决“发之前线空不空”,冲突检测解决“发的时候有没有撞”,冲突停发解决“撞了别继续糟蹋线路”,随机退避解决“撞了之后别同时再撞”。退避时间取随机值是为了让碰撞双方错开重试时刻,如果固定 10 秒,两台设备会再次同时发送,形成二次碰撞。
用一段简化逻辑还原退避过程:
import random def csma_cd_send(frame, medium): while True: if medium.is_idle(): # 先听后发 medium.start_transmit(frame) if not medium.collision_detected(): # 边听边发 return True # 发送成功 medium.stop_transmit() # 冲突停发 backoff = random.randint(0, 2**retry_count - 1) # 随机退避 wait(backoff * slot_time) # 随机延迟后重发 retry_count += 1 else: wait(random_slot()) # 线忙则继续等medium.is_idle()对应“听电压摆动值”,collision_detected()对应“边听边发”,stop_transmit()对应“冲突停发”,random.randint对应退避算法。参数slot_time是争用窗口的基本单位,retry_count控制退避范围随重试次数扩大。资料里“比如 10 秒”只是举例,实际退避是随机时隙的倍数,不是固定秒数。
注意:CSMA/CD 只适用于半双工共享介质。后来双绞线配合交换机实现全双工点对点连接后,冲突域消失,CSMA/CD 在多数现代网络中已经不再实际启用,但它的设计思想仍是理解共享介质争用的基础。
5. 双绞线与光纤:从共享总线到点对点链路的物理演进
5.1 UTP 与 STP 的屏蔽取舍
资料列举双绞线类型:UTP 非屏蔽双绞线,STP 屏蔽双绞线,5 类、6 类指的是双绞线的类型。双绞线如果是千兆,那么八根线都用了。这几句话信息密度不低,拆开看:双绞的“绞”是为了抵消电磁干扰,两根线绞在一起,外界干扰在两根线上感应出的噪声近似相等,接收端做差分运算时噪声被减掉。UTP 靠绞距和差分信号抗干扰,成本低、施工方便;STP 额外加屏蔽层,抗干扰能力更强,但屏蔽层需要正确接地,否则屏蔽层本身会变成天线,反而引入干扰。
5 类、6 类是类别标准,类别越高,支持的带宽和抗串扰指标越好。千兆以太网用满八根线,是因为千兆速率需要四对线同时双向传输,每对线承担 250M 左右的信号速率。资料没有展开线序和差分对分配,但“八根线都用了”这个事实说明:物理层的线材规格直接决定了链路能跑多快,不是协议栈软件能弥补的。
5.2 光纤为什么出现在这份资料的末尾
资料在光纤处戛然而止,只写了“光纤:”三个字。从上下文推断,光纤是作为传输介质的下一站出现的:同轴电缆贵、共享冲突、距离受限;双绞线便宜、适合短距离点对点;光纤则用光信号替代电信号,彻底避开电磁干扰,传输距离和带宽都上一个量级。常见的实现思路是,光纤分单模和多模,单模芯径小、光源用激光、适合长距离;多模芯径大、光源用 LED 或 VCSEL、适合短距离。资料没有给出这些细节,但物理层的演进逻辑是一致的:介质特性决定信号形式,信号形式决定编码方式,编码方式决定链路能提供的速率和距离。
从共享同轴总线到双绞线点对点,再到光纤,物理层的变化本质上是在解决同一个问题:如何在给定介质上可靠、高效地搬运比特流。冲突域从“整根电缆”缩小到“一根双绞线两端”,CSMA/CD 的必要性随之消失,这是物理层和链路层协同演进的结果。
6. 避坑与排查:物理层问题为什么总像黑匣子
6.1 链路时通时断,先查介质和接头而不是协议栈
现象:设备 ping 时通时不通,换一台设备又正常。原因:物理层接触不良或线序错误,比如双绞线水晶头压接不牢、线对绞距被破坏。解决:用线缆测试仪测通断和线序,替换法换一根已知良好的线,确认网卡指示灯状态。物理层故障不会在协议栈日志里留下清晰报错,只能靠介质层排查。
6.2 共享介质下吞吐远低于标称速率
现象:10M 共享网络上多台设备同时通信,实际吞吐只有标称值的一小部分。原因:冲突域内碰撞频繁,CSMA/CD 退避重发消耗了大量时间。解决:减少同一冲突域内的设备数量,或用网桥/交换机隔离冲突域。资料里“设备越多,传输越慢,冲突域也就越大”就是这个问题的一句话版本。
6.3 千兆链路只协商到百兆
现象:双绞线标称支持千兆,实际链路速率只有百兆。原因:八根线中没有全部接通,千兆需要四对线全通,百兆只需要两对。解决:检查水晶头八根线是否全部压接、线序是否符合标准、网卡和交换机端口是否都支持千兆。物理层协商结果会直接反映在链路速率上,这是最容易验证的一层。
6.4 屏蔽线接了却没效果甚至更差
现象:换了 STP 屏蔽双绞线,干扰反而变大。原因:屏蔽层未正确接地,形成天线效应,把外界干扰耦合进信号对。解决:确认屏蔽层按规范单端接地,检查连接器屏蔽壳与设备接地是否导通。屏蔽不是“加了就稳”,接地路径不对就是负优化。
6.5 把封装顺序搞反导致解析失败
现象:自己写的抓包工具解析帧时字段错位。原因:解封装顺序错误,没有先剥链路层帧头就去读网络层字段。解决:严格按“物理层比特流 → 链路层帧 → 网络层包 → 传输层段 → 应用层数据”的顺序逐层剥离,每层先读该层报头长度字段,再定位载荷起点。资料里“封装从上层到下层,解封装从下层到上层”就是这条排查原则的原始表述。
7. 设计取舍:固定分组大小与共享介质争用的边界在哪里
分组交换用固定大小上限换调度公平,CSMA/CD 用随机退避换冲突后的再次碰撞概率下降,双绞线用差分绞合换抗干扰能力,这些取舍有一个共同点:都是在物理约束下用“可预测的代价”替换“不可控的混乱”。固定分组大小让单次占用链路的时间有上界,代价是报头开销占比上升;随机退避让碰撞双方错开重试,代价是空闲时隙的浪费;双绞线绞距换抗干扰,代价是线材工艺要求提高。
验证这些取舍是否成立,不需要复杂工具。拿一根双绞线,用线缆测试仪看线序和长度;在共享介质环境里用抓包工具统计碰撞重传比例;对比不同分组大小下小包业务的吞吐变化。这些动作都能把“为什么这么设计”从纸面结论变成可观测的数据。
我自己的习惯是,每次遇到链路层诡异问题,先强制走一遍物理层检查:看指示灯、测线序、确认速率协商结果,再往上查协议栈。这个顺序帮我省掉了很多在软件层反复翻找的时间。希望帮到你。
本文还有配套的精品资源,点击获取