物理层与数据链路层:以太网协议、MAC地址、ARP协议、交换机工作原理
各位同学,咱们今天聊点实在的。物理层和数据链路层,说白了就是网络世界的「地基」和「交通规则」。你写再多花里胡哨的应用层代码,底层要是没搞明白,出了问题照样抓瞎。我当年刚入行时,就被一个ARP缓存问题折腾了整整两天,从那以后,我再也不敢小看这两层了。
以太网协议:最熟悉的陌生人
以太网,你天天在用,但你真的懂它吗?
以太网协议定义了数据在物理介质上怎么传输。它工作在物理层和数据链路层。物理层管「怎么传」,数据链路层管「传给谁」。
一个标准的以太网帧长这样:
| 前导码(7B) | 帧起始定界符(1B) | 目标MAC(6B) | 源MAC(6B) | 类型/长度(2B) | 数据(46-1500B) | FCS(4B) |
嗯,这里要注意,前导码和帧起始定界符是物理层加的,数据链路层不关心这些。数据链路层真正关心的是从目标MAC开始到FCS结束的部分。
我个人习惯把以太网帧想象成一个快递包裹:
- 目标MAC:收件人地址
- 源MAC:寄件人地址
- 类型/长度:包裹里装的是啥(IPv4?ARP?还是别的?)
- 数据:包裹内容
- FCS:包裹有没有被拆过(校验和)
我在项目中遇到过一个问题:两台服务器直连,死活ping不通。查了半天,发现是其中一台网卡的MTU设置成了9000,而另一台是1500。大帧发过去,对方直接丢弃了。这就是以太网帧长度限制带来的坑。
MAC地址:设备的身份证
MAC地址,全称Media Access Control Address。48位,通常写成6组十六进制数,比如 00:1A:2B:3C:4D:5E。
你想想看,为什么需要MAC地址?IP地址不够用吗?
IP地址是逻辑地址,可以变。你换个网络,IP就变了。但MAC地址是物理地址,出厂就烧死在网卡里,理论上全球唯一。数据链路层只认MAC地址,不认IP。
重要概念:MAC地址工作在同一个广播域内。跨广播域通信,必须靠IP地址和路由器。
MAC地址还有几个特殊值:
- 广播地址:
FF:FF:FF:FF:FF:FF,发给所有人 - 组播地址:第一个字节最低位为1,比如
01:00:5E:xx:xx:xx
我曾经犯过一个低级错误:手写了一个发包程序,把源MAC地址填成了全F。结果交换机以为这是个广播帧,把数据复制给了所有端口。整个办公室的网络瞬间瘫痪。嗯,从那以后我写网络代码都格外小心。
ARP协议:IP到MAC的翻译官
ARP,Address Resolution Protocol。它的工作很简单:给我一个IP,我告诉你对应的MAC地址。
为什么需要ARP?因为上层(网络层)用IP地址,下层(数据链路层)用MAC地址。中间需要个翻译。
ARP的工作流程:
- 主机A想发数据给主机B(已知B的IP,未知B的MAC)
- A发送一个ARP请求广播:「谁是192.168.1.2?请告诉192.168.1.1」
- 同一广播域内的所有主机都收到这个请求
- 只有IP为192.168.1.2的主机B回应:「我是192.168.1.2,我的MAC是00:1A:2B:3C:4D:5E」
- A收到回应,把IP-MAC映射存入ARP缓存,然后开始通信
ARP报文格式:
| 硬件类型(2B) | 协议类型(2B) | 硬件地址长度(1B) | 协议地址长度(1B) | 操作码(2B) | 发送方MAC(6B) | 发送方IP(4B) | 目标MAC(6B) | 目标IP(4B) |
操作码:1表示请求,2表示回应。
小技巧:在Linux上可以用 arp -a 查看ARP缓存,用 arp -d 清除缓存。我调试网络问题时,经常先清一下ARP缓存,排除缓存污染的可能。
ARP有个著名的安全问题:ARP欺骗。攻击者伪造ARP回应,告诉受害者「网关的MAC地址是我」。这样所有发往网关的数据都会经过攻击者的机器。我在做安全审计时,就遇到过内网被植入ARP欺骗脚本的情况,所有员工的流量都被劫持了。
避坑指南:我曾经在生产环境遇到过ARP表溢出导致网络中断的问题。一个广播域内设备太多,ARP表满了,新设备无法通信。解决方案是划分VLAN,缩小广播域。
交换机工作原理:智能转发
交换机工作在数据链路层。它不像集线器那样无脑广播,而是根据MAC地址表来智能转发。
交换机的核心数据结构:MAC地址表。表里记录着「MAC地址 → 端口号」的映射。
交换机的转发流程:
- 学习:收到一个帧,记录源MAC地址和入端口
- 转发:查目标MAC地址,找到对应端口就单播转发
- 泛洪:找不到目标MAC,就向所有端口(除了入端口)广播
- 更新:MAC地址表有老化时间,超时未用的条目会被删除
举个例子:
| MAC地址 | 端口 | 老化时间 |
|---|---|---|
| 00:1A:2B:3C:4D:5E | Port 1 | 300s |
| 00:1A:2B:3C:4D:5F | Port 2 | 250s |
| 00:1A:2B:3C:4D:60 | Port 3 | 180s |
如果Port 1收到一个目标MAC为00:1A:2B:3C:4D:5F的帧,交换机查表发现这个MAC在Port 2,就直接把帧从Port 2转发出去。Port 3和Port 4完全不受影响。
这就是交换机和集线器的本质区别:交换机提供独享带宽,集线器是共享带宽。
我记得有一次,客户抱怨网络慢。我上去一看,发现交换机某个端口疯狂收发包,MAC地址表里这个端口关联了几百个MAC地址。一查,原来是有人在这个端口下级联了一个集线器,导致广播域扩大。换成交换机后,问题解决。
核心要点:交换机通过MAC地址表实现数据帧的精准转发,减少了冲突域,提高了网络效率。但广播域依然存在——ARP请求还是会广播到所有端口。
解决广播域问题的方法就是VLAN。VLAN可以把一个物理交换机划分成多个逻辑交换机,每个VLAN是一个独立的广播域。这个咱们后面章节会详细讲。
好了,物理层和数据链路层的基础知识就聊到这儿。下一章咱们讲网络层,IP协议和路由器的那些事儿。到时候你会发现,有了MAC地址和交换机打底,理解IP路由就轻松多了。