第3章:链路层(The Link Layer)
数据链路
一、导读
1.1 本章学习目标
第3章进入TCP/IP协议栈的最底层——链路层。链路层是协议栈与物理介质的交界面,它负责在相邻节点之间可靠地传输数据帧。理解链路层是理解整个网络通信的基础,因为所有上层协议的数据最终都要通过链路层变成物理信号发送出去。
本章的核心学习目标包括:
- 理解以太网帧的完整格式:各字段的含义、大小端序、帧长度限制
- 掌握MAC地址的结构和用途:48位硬件地址、单播/多播/广播地址、OUI分配
- 理解MTU(最大传输单元)的概念:以太网MTU为什么是1500字节,MTU对上层协议的影响
- 了解以太网的发展历程:从10Mbps到100Gbps,从共享介质到交换式以太网
- 掌握CSMA/CD的工作原理:冲突检测、退避算法、为什么现代交换式以太网不再需要CSMA/CD
- 理解链路层与网络层的交互:如何通过帧类型字段标识上层协议
1.2 为什么本章如此重要
链路层是TCP/IP协议栈的物理基础。没有链路层,IP数据报就无法在相邻节点之间传输。理解链路层有助于你理解以下关键问题:
- 为什么IP需要分片?因为IP数据报可能大于链路层的MTU
- 为什么ARP是必要的?因为IP地址不能直接用于链路层传输,需要转换为MAC地址
- 为什么交换机能提高网络性能?因为交换机在链路层进行帧转发,隔离了冲突域
- 为什么VLAN很重要?因为VLAN在链路层隔离了广播域
此外,很多网络故障发生在链路层:网线问题、双工模式不匹配、MTU不一致、MAC地址冲突等。理解链路层是排查这些故障的前提。
1.3 核心问题引导
在阅读本章时,请带着以下问题思考:
以太网帧为什么最小长度是64字节?这个限制与CSMA/CD有什么关系?
MAC地址真的"全球唯一"吗?有没有可能出现MAC地址冲突?
为什么现代交换式以太网不再使用CSMA/CD?交换机如何消除了冲突?
MTU为什么不设置得越大越好?大MTU有什么好处和坏处?
以太网帧的"类型"字段和"长度"字段有什么区别?Ethernet II和802.3帧格式有什么不同?
为什么需要VLAN?VLAN标签是如何嵌入以太网帧的?
二、核心概念详解
2.1 以太网帧格式
以太网(Ethernet)是当今最主流的局域网技术。Stevens在本书中主要讨论的是Ethernet II帧格式(也称为DIX Ethernet),这是TCP/IP协议栈中最常用的帧格式。
2.1.1 Ethernet II帧格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 目的MAC地址(6字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源MAC地址(6字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 类型(2字节) | 数据(46-1500字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FCS校验(4字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+各字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| 目的MAC | 6字节 | 接收方的MAC地址 |
| 源MAC | 6字节 | 发送方的MAC地址 |
| 类型 | 2字节 | 标识上层协议(0x0800=IP,0x0806=ARP,0x86DD=IPv6) |
| 数据 | 46-1500字节 | 上层协议的数据(IP数据报) |
| FCS | 4字节 | 帧校验序列(CRC-32) |
2.1.2 帧长度限制
以太网对帧长度有严格要求:
- 最小帧长度:64字节(从目的MAC到FCS结束)。如果数据不足46字节,需要填充到46字节
- 最大帧长度:1518字节(目的MAC 6 + 源MAC 6 + 类型 2 + 数据 1500 + FCS 4)
- MTU:1500字节(数据部分的最大长度)
最小帧长度的限制与CSMA/CD有关。在共享介质以太网中,发送方需要能够在发送完帧之前检测到冲突。以太网的往返延迟被设计为51.2微秒(对应64字节在10Mbps下的传输时间),因此最小帧长度必须是64字节。
2.2 MAC地址
MAC(Media Access Control)地址是链路层设备的物理地址,长度为48位(6字节),通常用十六进制表示:
00:1A:2B:3C:4D:5E2.2.1 MAC地址的结构
MAC地址的前24位是OUI(Organizationally Unique Identifier),由IEEE分配给设备制造商;后24位由制造商自行分配,确保全球唯一。
00:1A:2B:3C:4D:5E
└──┬──┘ └────┬────┘
OUI 制造商分配
(IEEE分配)2.2.2 MAC地址的类型
根据最低字节的最低两位,MAC地址分为三种类型:
| 类型 | 标识 | 示例 | 说明 |
|---|---|---|---|
| 单播 | 第0位=0 | 00:1A:2B:3C:4D:5E | 标识单个网络接口 |
| 多播 | 第0位=1 | 01:00:5E:xx:xx:xx | 标识一组网络接口 |
| 广播 | 全1 | FF:FF:FF:FF:FF:FF | 标识所有网络接口 |
2.2.3 MAC地址的管理
# 查看本机MAC地址
ifconfig eth0
# 或
ip link show eth0
# 查看ARP缓存中的MAC地址
arp -n
# 或
ip neigh show2.3 MTU与分片
MTU(Maximum Transmission Unit)是链路层帧数据部分的最大长度。以太网的MTU通常是1500字节。
2.3.1 MTU对IP层的影响
当IP数据报大于链路层的MTU时,路由器必须将IP数据报分片(fragment)。分片后的每个片段都小于MTU,可以独立传输。目的端负责将分片重新组装为原始的IP数据报。
IP数据报(2000字节)> MTU(1500字节)
↓ 路由器分片
片段1:1500字节(IP头部 + 1480字节数据)
片段2:520字节(IP头部 + 500字节数据)2.3.2 路径MTU发现
不同链路的MTU可能不同(以太网1500、PPP 576、Wi-Fi 2304等)。路径MTU发现(Path MTU Discovery)通过设置IP头部的DF(Don't Fragment)标志,让路由器在需要分片时返回ICMP"需要分片"差错报文,从而发现路径上的最小MTU。
# Linux下使用ping进行路径MTU发现
ping -c 4 -M do -s 1472 www.example.com
# -M do: 设置DF标志
# -s 1472: 数据部分1472字节 + IP头部20字节 = 1492(PPPoE的MTU)
# 如果返回"Message too long",说明路径MTU小于15002.4 以太网的发展
2.4.1 从共享到交换
早期的以太网使用共享介质(同轴电缆或集线器),所有设备共享同一条总线,使用CSMA/CD协议来协调访问。这导致了严重的冲突问题,网络利用率很低。
交换机(switch)的出现彻底改变了以太网。交换机为每个端口创建独立的冲突域,允许同时传输多对帧。这极大地提高了网络带宽和利用率。
共享式以太网(集线器): 交换式以太网:
H1 ──┐ H1 ──┐
H2 ──┤── Hub ── 共享总线 H2 ──┤
H3 ──┤ H3 ──┤── Switch ── 独立通道
H4 ──┘ H4 ──┘
所有设备共享带宽 每对设备独享带宽2.4.2 速率演进
| 标准 | 速率 | 年份 | 介质 |
|---|---|---|---|
| 10BASE-T | 10 Mbps | 1990 | 双绞线 |
| 100BASE-TX | 100 Mbps | 1995 | 双绞线 |
| 1000BASE-T | 1 Gbps | 1999 | 双绞线 |
| 10GBASE-T | 10 Gbps | 2006 | 双绞线/光纤 |
| 40GBASE/100GBASE | 40/100 Gbps | 2010 | 光纤 |
2.5 CSMA/CD协议
CSMA/CD(Carrier Sense Multiple Access with Collision Detection)是传统共享式以太网的介质访问控制协议。
2.5.1 工作流程
载波监听:发送前先监听介质是否空闲
多路访问:多个设备共享同一介质
冲突检测:发送过程中持续监听,检测是否发生冲突
冲突处理:检测到冲突后发送干扰信号,然后随机退避重试
2.5.2 二进制指数退避
发生冲突后,设备等待一段随机时间再重试。等待时间从 {0, 1} 个时隙中随机选择,重试次数增加后范围扩大:{0, 1, 2, 3}、{0, 1, ..., 7},直到 {0, 1, ..., 1023}。超过16次重试后放弃。
2.5.3 为什么现代以太网不需要CSMA/CD
交换式以太网中,每个端口是独立的冲突域,全双工模式下根本不会发生冲突。因此,千兆及以上以太网标准已经废弃了CSMA/CD。但最小帧长度64字节的限制仍然保留,以保持向后兼容。
2.6 VLAN(虚拟局域网)
VLAN(Virtual LAN)在链路层隔离广播域,允许在同一个物理网络上创建多个逻辑上独立的网络。
2.6.1 VLAN标签
IEEE 802.1Q在以太网帧的源MAC地址和类型字段之间插入4字节的VLAN标签:
原始帧:| 目的MAC | 源MAC | 类型 | 数据 | FCS |
802.1Q帧:| 目的MAC | 源MAC | 0x8100 | PRI|CFI|VID | 类型 | 数据 | FCS |
└───── 4字节 ─────┘- TPID(0x8100):标识这是一个802.1Q标签帧
- PRI(3位):优先级(802.1p)
- CFI(1位):规范格式指示器
- VID(12位):VLAN ID,范围1-4094
2.6.2 VLAN的作用
- 广播隔离:不同VLAN的广播帧不会互相传播
- 安全隔离:不同VLAN的设备不能直接通信,需要通过路由器或三层交换机
- 灵活管理:可以按部门、功能而非物理位置划分网络
三、实战案例
3.1 案例一:使用tcpdump观察以太网帧
sudo tcpdump -i eth0 -nn -e 'host 192.168.1.1'输出示例:
12:34:56.789 00:11:22:33:44:55 > 66:77:88:99:aa:bb, ethertype IPv4 (0x0800),
length 98: 192.168.1.1 > 192.168.1.100: ICMP echo request, id 1234, seq 1分析:
00:11:22:33:44:55 > 66:77:88:99:aa:bb:源MAC > 目的MACethertype IPv4 (0x0800):类型字段为0x0800,表示上层是IPlength 98:帧总长度(不含FCS)
3.2 案例二:观察ARP请求的广播帧
sudo tcpdump -i eth0 -nn -e 'arp'输出示例:
12:34:56.789 00:11:22:33:44:55 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806),
length 42: Request who-has 192.168.1.1 tell 192.168.1.100分析:
ff:ff:ff:ff:ff:ff:目的MAC是广播地址ethertype ARP (0x0806):类型字段为0x0806,表示上层是ARPRequest who-has:ARP请求,询问192.168.1.1的MAC地址
3.3 案例三:使用ethtool查看网卡信息
ethtool eth0
# Settings for eth0:
# Speed: 1000Mb/s
# Duplex: Full
# Link detected: yes四、常见误区与难点
4.1 误区一:"MAC地址永远不会改变"
MAC地址是烧录在网卡硬件中的,但可以通过软件修改(MAC地址欺骗)。此外,虚拟机的MAC地址是软件生成的。
4.2 误区二:"交换机比路由器快是因为交换机更简单"
交换机快是因为它工作在链路层,只需要查看MAC地址就可以转发,不需要像路由器那样解析IP头部、查找路由表。但现代三层交换机也能进行IP路由,速度接近二层交换。
4.3 难点:理解帧长度限制与CSMA/CD的关系
最小帧长度64字节的推导:假设网络最大长度为2500米(5个中继器),信号传播速度为2×10⁸ m/s,往返延迟约25.6微秒。10Mbps下25.6微秒传输256位=32字节。考虑冲突检测需要双倍时间,最小帧长度为64字节。
五、本章小结
第3章深入讲解了链路层的核心概念:
以太网帧由目的MAC、源MAC、类型、数据和FCS组成,最小64字节,最大1518字节。
MAC地址是48位硬件地址,用于链路层寻址。OUI前24位标识制造商,后24位由制造商分配。
MTU(1500字节)限制了IP数据报的大小,超过MTU的数据报需要分片。
CSMA/CD是共享式以太网的介质访问控制协议,现代交换式以太网已不再需要。
VLAN在链路层隔离广播域,通过802.1Q标签实现。
六、思考与练习
思考题
如果以太网的最小帧长度改为32字节,会对CSMA/CD产生什么影响?网络的最大长度会如何变化?
为什么交换机能消除冲突域?交换机和集线器的本质区别是什么?
VLAN标签只有12位用于VLAN ID,最多支持4094个VLAN。在大型数据中心中,这个限制是否足够?802.1ah(Q-in-Q)如何解决这个问题?
练习题
使用tcpdump抓取以太网帧,记录帧头部的各个字段值,验证类型字段的含义。
计算在10Mbps以太网中,传输一个最小帧(64字节)需要多长时间?在1Gbps以太网中呢?
使用ping测试不同大小的数据包(ping -s 100、500、1472、1473),观察哪些会导致IP分片。