以太网交换机:学习、泛洪、转发与VLAN基础
交换机做什么
交换机是一个链路层设备:它接收链路层帧,根据帧的目的MAC地址把它们转发到相应的输出链路上。交换机对主机和路由器是透明的,主机发送帧时只填写目的结点的MAC地址,并不知道中间有交换机。交换机的每个接口都有缓存,当多个帧同时要从同一个接口发出时,它们会在缓存中排队。
交换机的核心是一张交换机表(switch table),每个表项记录一个MAC地址、通往该地址的交换机接口,以及表项写入的时间。
过滤与转发
过滤(filtering)决定一个帧是应该转发还是丢弃,转发(forwarding)决定帧应该从哪个接口发出。假设目的地址为DD的帧从接口到达交换机,交换机用DD查表:
| 情况 | 交换机的动作 |
|---|---|
| 表中没有DD | 泛洪(flooding):把帧从除接口以外的所有接口转发出去 |
| DD对应的接口就是 | 过滤:目的结点与发送方在同一个网段上,它已经收到了这个帧,交换机丢弃该帧 |
| DD对应另一个接口 | 转发:只把帧放进接口的输出缓存 |
目的地址为广播地址的帧总是被泛洪。
自学习
交换机表不需要管理员配置,而是自动建立的,交换机因此是即插即用的设备:
- 交换机表最初是空的。
- 每收到一个帧,交换机就把帧的源MAC地址、帧到达的接口和当前时间记入表中。只要局域网中的每台主机最终都会发送帧,交换机就能学到每台主机的位置。
- 如果一个表项在一段时间(老化时间,例如300秒)内没有被更新,交换机就把它删除。这样,当主机更换位置或适配器被替换时,表也能保持正确。
通过发送帧来“教会”交换机
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
交换机与路由器
交换机和路由器都是存储转发的分组交换机,但它们工作在不同的层次,各有优缺点:
| 比较项 | 交换机 | 路由器 |
|---|---|---|
| 工作层次 | 链路层,根据MAC地址转发 | 网络层,根据IP地址转发 |
| 配置 | 即插即用,自学习 | 需要配置IP地址、运行路由协议 |
| 拓扑 | 活动拓扑必须是一棵生成树,否则广播帧会无休止地循环 | 可以有环路,选路协议会选择最佳路径 |
| 广播 | 转发广播帧,大型网络中可能出现广播风暴 | 隔离广播,为广播提供“防火墙” |
| 处理速度 | 只处理到第二层,转发很快 | 要处理到第三层,开销更大 |
因此,几百台主机规模的小型网络通常只用交换机就够了;更大的网络则会在交换机之上部署路由器,以隔离广播并提供更智能的选路。
与集线器相比,交换机的每个接口都是一个独立的冲突域。全双工链路上根本不会发生冲突,不同接口上的结点可以同时以链路的全部速率发送,这正是交换机取代集线器的原因。
虚拟局域网(VLAN)
在一个大型机构中,如果所有部门都连在同一个交换网络里,会遇到几个问题:所有广播帧(例如ARP和DHCP报文)都会传遍整个网络,既浪费带宽,又带来安全和隐私隐患;而按部门分别配置交换机,又会让交换机利用率很低,员工换部门时还必须重新布线。
支持VLAN(Virtual Local Area Network)的交换机允许在一个物理局域网上定义多个虚拟局域网。在基于端口的VLAN中,网络管理员把交换机的端口划分成若干组,每一组就是一个VLAN,组成一个独立的广播域:广播帧只会被交付给同一个VLAN的端口。改变一台主机所属的VLAN,只需要在交换机上修改端口配置,不需要动线缆。不同VLAN之间的通信,必须经过路由器转发。
当VLAN跨越多台交换机时,可以在交换机之间使用一条干线(trunk)链路,它属于所有VLAN。为了让对端交换机知道一个帧属于哪个VLAN,在干线上发送的帧会插入一个4字节的IEEE 802.1Q标签:
| 字段 | 长度 | 含义 |
|---|---|---|
| TPID | 16位 | 固定为0x8100,表明这是一个带VLAN标签的帧 |
| 优先级(PCP) | 3位 | 帧的优先级,用于服务质量 |
| DEI | 1位 | 拥塞时该帧是否可以优先被丢弃 |
| VLAN ID | 12位 | 帧所属的VLAN,可用值为1~4094 |
标签由发送一侧的交换机加上,由接收一侧的交换机去掉,主机看到的仍是普通的以太网帧。由于插入标签改变了帧的内容,交换机还要重新计算CRC。
把一个交换网络划分成多个VLAN
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
数一数冲突域和广播域
路由器R连接交换机S1和S2。H1~H3直接连到S1,H4和H5通过一个集线器连到S1,H6~H9直接连到S2。除集线器上的链路外,所有链路都是全双工的。
- 共有多少个冲突域?
- 共有多少个广播域?
- 把集线器换成交换机,答案如何变化?
- 改为(恢复集线器后)在S2上把H6、H7划入VLAN 10,把H8、H9划入VLAN 20。此时有多少个广播域?
用Python模拟自学习交换机
主机A、B、E分别连在交换机端口1、2、4上;C和D通过集线器共用端口3。编写Python函数receive(now, src, dst):删除超过300秒的表项,学习源地址,并返回处理动作(flood、forward或filter)和输出端口。用帧(0, A→E)、(1, E→A)、(2, C→D)、(3, D→C)、(4, B→A)、(400, B→E)运行它,并在每个帧之后打印交换机表。