以太网:帧、共享介质历史与现代全双工链路
从共享总线到交换机
以太网诞生于20世纪70年代中期,是目前使用最广泛的有线局域网技术。最初的以太网使用一根同轴电缆作为总线,所有结点都连接在这根总线上,正是上一节所说的共享介质型网络:任何结点发送的帧都会被其他所有结点收到,各结点用CSMA/CD协调发送。
20世纪90年代,以太网改用双绞线连接成星形拓扑,中心是集线器(hub)。集线器是一个物理层设备,它把从一个接口收到的比特原样转发到所有其他接口,因此网络在逻辑上仍然是一条共享的“总线”,冲突照样会发生。
如今,星形拓扑的中心几乎都是交换机(switch)。交换机是一个链路层设备,它存储并转发整个帧,而且只把帧转发到通往目的结点的接口上。
非共享介质型网络
在非共享介质型网络下,网络中的每个介质会直接连上交换机,由交换机来转发数据帧。这种网络传输方式一般采用的是全双工通信。
假设A发送了一个目标地址为B的数据,交换机负责将数据转发给介质B。
由于每条链路只连接一个结点和一个交换机接口,并且两个方向可以同时传输,链路上根本不会发生冲突,也就不再需要CSMA/CD。A向B发送的同时,C也可以向D发送,交换机会分别转发这两个帧。
以太网帧结构
无论物理介质和速率如何变化,以太网的帧格式几十年来基本保持不变:
| 字段 | 长度 | 作用 |
|---|---|---|
| 前同步码 + SFD | 8字节 | 7个字节10101010让接收方与发送方的时钟同步,最后一个字节10101011(帧开始定界符)表示帧即将开始 |
| 目的MAC地址 | 6字节 | 接收方适配器只接收目的地址是自己或广播地址的帧,其余的帧直接丢弃 |
| 源MAC地址 | 6字节 | 发送方适配器的MAC地址 |
| 类型 | 2字节 | 指出数据部分属于哪个网络层协议,例如0x0800为IPv4、0x86DD为IPv6、0x0806为ARP,接收方据此分用 |
| 数据 | 46~1500字节 | 装着网络层数据报;1500字节就是以太网的MTU,不足46字节时要填充 |
| CRC | 4字节 | CRC-32校验码,接收方发现差错就直接丢弃该帧 |
以太网提供的是无连接、不可靠的服务:发送前不需要握手,CRC校验失败的帧被直接丢弃,既不确认也不重传。如果需要可靠传输,由上层的TCP负责发现丢失并重传。
组装以太网帧,看接收方如何过滤
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
CSMA/CD与二进制指数退避
在共享介质的以太网中,适配器按CSMA/CD的规则发送帧:
- 适配器从网络层得到数据报,封装成帧。
- 侦听信道:如果信道空闲,就开始发送;如果信道忙,就一直等到信道空闲后再发送。
- 发送过程中持续检测信道。如果整个帧发送完毕都没有检测到其他信号,这一帧就发送成功了。
- 如果检测到冲突,立即停止发送,并发送48比特的阻塞信号,确保所有结点都知道发生了冲突。
- 中止发送后进入二进制指数退避:第次冲突后,从中随机选取,其中,等待个比特时间后回到第2步。连续16次失败后放弃发送。
冲突越多,说明竞争的结点可能越多,可选的等待时间范围就成倍扩大,从而迅速降低再次冲突的概率;而竞争者少时,等待时间又很短。
最小帧长也来自CSMA/CD:发送一个最小帧(64字节,即512比特)所需的时间必须不小于信号在网络中往返一次的时间,这样冲突发生时发送方仍在发送,一定能检测到冲突。
玩一局二进制指数退避
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
以太网标准
以太网有许多标准,它们的名称常常形如“速率 + BASE + 介质”:BASE表示基带传输,T表示双绞线,F、SX、LR等表示光纤。
| 标准 | 速率 | 介质 |
|---|---|---|
| 10BASE-T | 10 Mbps | 双绞线 |
| 100BASE-TX | 100 Mbps | 双绞线 |
| 1000BASE-T | 1 Gbps | 双绞线 |
| 10GBASE-T / 10GBASE-LR | 10 Gbps | 双绞线 / 单模光纤 |
| 40GBASE、100GBASE | 40~100 Gbps | 主要是光纤,用于数据中心 |
速率提高了几个数量级,但帧格式没有改变,所以上层协议完全感觉不到底层链路的变化。现代交换式以太网都工作在全双工模式下,CSMA/CD只是为了兼容而保留。
以太网的开销、帧速率与时间
把8字节前同步码/SFD、14字节首部、4字节CRC和12字节帧间隙都算作开销。
- 每帧数据分别为1500、46、10字节时,线路时间中传送数据的比例各是多少?
- 1 Gbps链路每秒最多能传送多少个最大帧?多少个最小帧?
- 在10 Mbps共享以太网中,64字节(512比特)的最小帧的发送时间至少要等于一个往返传播时延。信号速度为2 × 10⁸ m/s时,电缆最长可以是多少?
- 在100 Mbps以太网中,第4次冲突后最长的退避时间是多少?
用Python解析以太网首部
下面的字节是一个不含前同步码和CRC的以太网帧。编写Python程序:取出目的和源MAC地址(格式为AA:BB:…),说出类型的名称(IPv4 0x0800、IPv6 0x86DD、ARP 0x0806),判断是否为广播,并计算填充长度和线路效率(前同步码8 + 首部14 + 数据 + 填充 + CRC 4 + 帧间隙12)。
ffffffffffff 0800200a8c6d 0806 0001080006040001 0800200a8c6d c0a80105 000000000000 c0a80101