搞网络久了你会发现一个很有意思的现象:很多人配交换机、路由器的时候命令敲得很熟练,拓扑也能画出来,可一旦问起“这台电脑发给另一台电脑的数据,到底是怎么一步一步过去的”,就支支吾吾了。我自己也带过不少刚入行的同事,大家卡住的点往往不在命令,而在脑子里没有一个完整、清晰的数据转发画面。这篇笔记就想把交换机、路由器在数据传输流程里各自干的事掰开揉碎讲清楚,适合正在学网络基础、准备认证,或者被网络故障折腾过几次想系统补课的人。看完你至少能回答:为什么交换机不查IP、路由器不查MAC?同网段和跨网段到底差在哪?
1. 先弄明白:转发数据时,交换机和路由器各管哪一段
1.1 二层转发与三层路由的本质差异
交换机和路由器虽然经常放在同一个机柜里,但它们的本职工作是错开的。交换机工作在二层,也就是数据链路层,眼睛只盯着以太网帧头里的源MAC和目的MAC;路由器工作在三层,也就是网络层,眼睛盯的是IP包头里的源IP和目的IP。这听起来简单,可很多人一遇到实际报文就乱了,原因是一个完整报文既有MAC头也有IP头,到底谁去看哪一段,取决于设备工作在哪一层。
你可以把MAC地址想象成“门牌号”,把IP地址想象成“城市里的详细地址”。二层交换机只负责在同一栋楼里把信件送到具体房间,它不需要知道收件人住在哪座城市;路由器则负责决定这封信该送到哪栋楼,它不需要关心楼里的哪个房间具体怎么走,只需要知道下一栋楼的入口在哪。这就是二层转发和三层路由的本质差异:一个在局域网内部做“点到点”投递,一个在网络之间做“端到端”寻路。
| 对比项 | 二层交换机 | 路由器 |
|---|---|---|
| 工作层次 | 数据链路层 | 网络层 |
| 转发依据 | MAC地址表 | 路由表 |
| 转发单位 | 以太网帧 | IP分组,会重新封装帧 |
| 广播域隔离 | 默认不隔离 | 默认隔离 |
所以,交换机转发的是帧(frame),路由器转发的是包(packet)。数据从一个网段走到另一个网段,必然需要先由交换机把帧送到路由器的接口,再由路由器剥掉旧的帧头、根据IP路由决定下一跳、包一层新的帧头。这个“剥一层、查一层、再包一层”的过程,就是整个数据链路里最关键也最容易迷糊的地方。
1.2 为什么必须通过MAC和IP双重身份来定位一台设备
MAC地址是网卡出厂时烧录的物理标识,正常情况下一台设备一个MAC,基本不会变;IP地址是网络管理员分配的逻辑位置,设备换一个网段,IP通常就要跟着改。所以一台设备在网络上其实有两个身份:你是谁,用MAC回答;你在哪,用IP回答。
如果只有MAC,理论上全球设备都能唯一标识,但MAC没有层次结构,谁也没办法让全世界的交换机都记下所有MAC地址。如果只有IP,数据包到了局域网边界,又没法直接映射到具体硬件的哪个网卡,最终还是要靠MAC把帧送到主机的网卡上。于是TCP/IP协议栈做了明确分工:用IP做跨网络寻址,用MAC做同网段投递,中间通过ARP协议搭一座桥。ARP负责“已知IP、求MAC”,它广播一个问题,对应主机单播回答,这个交互过程也是数据传输流程里躲不开的环节。
2. 交换机转发流程拆解:从学习、泛洪到精确转发
2.1 MAC地址表是怎样建立起来的
交换机之所以被称为“可学习”的二层设备,是因为它会持续监听收到的以太网帧。任意一个帧从某个接口进来,交换机会从二层头里取出源MAC,然后把它和入接口对应起来,记到MAC地址表里,这个过程叫学习。表项会带着时间戳,各厂商常见的默认老化时间在300秒左右,目的是让地址表跟着网络拓扑变化走。如果一台设备从旧接口换到新接口,老表项过期后新表项重新学习,网络基本不需要人工干预。
交换机转发的决策逻辑其实只有三句话:
- 目的MAC在MAC地址表里,且出接口不是入接口,就精确转发到对应接口。
- 目的MAC在MAC地址表里,但出接口和入接口是同一个,说明这个帧本来就不该由当前交换机收,应该丢弃。
- 目的MAC找不到,或者收到广播/组播帧,就泛洪,也就是复制到除入接口外的所有活跃接口。
很多新手会误以为交换机接到一个帧以后要“读IP地址做路由”,其实根本不会。交换机是个“不拆包”的二层设备,它最多看看帧头里的MAC就去查表,IP层内容通常原封不动地透传过去。这个特性也决定了交换机天然不知道网段边界在哪里,它只会按MAC机械地把帧送到对应端口。
2.2 同网段通信时,帧在交换机里发生了什么
拿一个最典型的场景说:PC-A和PC-B都在192.168.1.0/24网段,中间接了一台交换机S。PC-A要ping PC-B,整个过程是这样的。
第一步,PC-A会先判断目的IP和自己是否在同一个网段。计算方法是用自己的掩码和目的IP做二进制与运算,得到网络地址后发现和本机网络地址一样,于是判定不需要三层网关。
第二步,PC-A要构造二层帧,但目的MAC还不知道。它会先查ARP缓存,如果没有PC-B的MAC,就发一个ARP广播:“谁是192.168.1.20?请告诉192.168.1.10。”这个广播帧的目的MAC是全F,交换机收到后,会把它泛洪到除了入接口以外的所有接口,PC-B收到后发现自己就是被询问的IP,于是回一个ARP单播,告诉PC-A自己的MAC。就是在这一来一回里,交换机顺手把PC-A和PC-B的MAC地址表项都学全了。
第三步,PC-A拿着PC-B的MAC,发出ICMP Echo Request。这时以太网帧头是:源MAC=PC-A网卡MAC,目的MAC=PC-B网卡MAC,帧里的IP包是:源IP=192.168.1.10,目的IP=192.168.1.20。交换机收到这个帧,查目的MAC表项,发现PC-B在某个接口下,就会只从那个接口转发出去,整个过程不改任何内容。
PC-B回ICMP Reply时,帧头正好反过来,源MAC变成PC-B,目的MAC变成PC-A,交换机再按PC-A的MAC表项转发。整个同网段通信里,交换机从头到尾没有接触过IP路由,也不需要路由器出现。哪怕中间串了好几台交换机,只要所有主机都在同一广播域,流程都是一样。
2.3 交换机转发中的几个“反直觉”细节
第一个反直觉的地方:交换机默认不隔离广播域。初学者常常以为“不同的交换机就是不同的网络”,实际上每一台二层交换机都属于同一个大广播域,所有端口默认在同一个VLAN里。广播帧和未知单播帧会泛洪到整个广播域,设备越多,无效流量越多。这也是VLAN存在的根本原因:把一个大广播域切分成多个小广播域。
第二个反直觉的地方:一台交换机自己也能形成环路。有人觉得环路必须是有多台交换机互联才可能,其实两台交换机之间拉两根网线,或者一根网线把交换机的两个口连起来,都会造成二层环路。环路一旦出现,广播帧会在里面无限复制,最终形成广播风暴,表现为交换机所有接口疯狂闪灯、CPU占用极高、业务几乎瘫痪。所以生产环境必须开STP/RSTP/MSTP,让它把冗余链路阻塞掉,只留一条活跃路径。
第三个反直觉的地方:MAC地址表不是越大越好。交换机用于MAC表项的硬件容量有限,如果表被大量无效地址占满,新设备都要泛洪转发,泛洪流量会暴增,甚至带来安全风险。因此大二层网络里常见“MAC表溢出”导致的性能劣化,排查时不能只盯路由器和出口,也要看交换机的表项使用率。
3. 路由器转发流程拆解:从拆包、查表到重封装
3.1 路由表的结构与最长前缀匹配原则
路由器的核心是路由表。每个表项至少包含目的网络、掩码、下一跳、出接口,以及管理距离和度量值这些选路参数。IP包到达路由器后,路由器会取出目的IP,拿路由表里所有条目去匹配,选出掩码最长的那条转发。这个原则叫最长前缀匹配。
很多新手把路由器想成“从上到下查表,找到第一条匹配就用”,这是错的。IP路由匹配只看“谁更长、谁更精确”,而不是谁排在前面。举例:路由表里同时有192.168.0.0/16下一跳R1,以及192.168.1.0/24下一跳R2,目的IP是192.168.1.55,那一定走R2,因为/24比/16更具体。默认路由0.0.0.0/0永远最长匹配不上,只有没有任何更精确实体路由时才会被选中。
理解了这一点,就能解释很多诡异现象。比如一条默认路由和一条明细路由同时存在,明细路由覆盖的网段会精确走明细口,其余流量全走默认口,这不是配置“先后顺序”问题,而是最长前缀匹配的结果。检查路由故障时,不要只盯着有没有路由,还要看掩码是否写得太粗或太细。
3.2 跨网段通信时,IP包和MAC帧如何“接力”
跨网段通信是理解路由器的关键场景。假设PC-A地址192.168.1.10/24,网关192.168.1.1;PC-B地址192.168.2.10/24,网关192.168.2.1。路由器R的两个接口分别连着这两个网段,PC-A访问PC-B时发生的事,比同网段复杂得多。
PC-A经过判断发现目的IP192.168.2.10和自己不在同一网段,它不会直接广播ARP去问PC-B的MAC,而是把包先交给网关。所以它构造IP包时,源IP是192.168.1.10、目的IP是192.168.2.10;但二层帧头里,源MAC是自己的网卡MAC,目的MAC则是路由器接口192.168.1.1的MAC。如果PC-A还不知道网关MAC,就会先发ARP广播问网关IP。
路由器收到这个帧,先看二层目的MAC是不是自己接口的MAC,确认是自己后收下,把帧头剥掉,取出IP包。接下来查路由表,发现目的网段192.168.2.0/24是自己的直连接口网段,于是决策从对应接口转发。但要从这个接口发出去,必须有下一跳设备的MAC,下一跳就是PC-B,于是路由器会在这个接口上广播ARP,询问谁的IP是192.168.2.10。PC-B回应后,路由器用新的帧头重新封装IP包:源MAC改成路由器出接口的MAC,目的MAC改成PC-B的MAC,源IP和目的IP保持不变,TTL减1,重新计算校验和,再交给交换机转发出去。
这个流程里的核心,是“MAC每跳都换,IP端到端不变”。数据每经过一台三层设备,源MAC和目的MAC就会被整体替换一次,但除非有NAT,源IP和目的IP始终不变。抓包的时候如果只站在PC-A侧看,你会只看得到“A到网关”的帧;如果站在PC-B侧看,你才会看到“路由器到B”的帧。两边IP一样,MAC却完全不同,这就是逐跳封装带来的差别。
3.3 ARP、TTL和分片:三个容易被忽略的关键环节
第一个环节是ARP。路由器默认隔离广播域,也就是说PC-A发出的ARP广播不会穿过路由器跑到PC-B那边,所以跨网段时主机永远只需要解析网关的MAC,而不用直接解析对端主机的MAC。理解这个,就能明白为什么很多跨网段ping会先看到访问不通时,抓包却只有主机在反复发ARP请求“网关为什么不回我”。检查ARP表能不能学到网关MAC,基本是跨网段排查的第一步。
第二个环节是TTL。IP包头里的TTL字段每一跳减1,当TTL减到0时,路由器会丢弃这个包,并回一个ICMP超时报文。TTL的作用是防止路由环路里数据包永远活着。traceroute的原理正是利用TTL:一开始发TTL=1的包,第一跳回超时;再发TTL=2,第二跳回超时,逐跳递增就能画出完整路径。如果你ping跨网段时收到“Time to live exceeded”,不代表目标不可达,而是这个包在中间某台设备上寿命耗尽,很可能是路由成环了。
第三个环节是MTU和分片。当IP包从大MTU接口进入路由器,要从小MTU接口出去时,IPv4允许分片,但分片会导致性能下降,也会有安全风险。实际网络中很多丢包问题不是路由写错,而是ICMP“Fragmentation needed”没有正常回给源端,导致大包直接卡死。排查时用一个能设置数据大小的大包ping工具,从大到小测试,通常可以快速定位MTU瓶颈。
4. 实操:用一台交换机加一台路由器,完整走一遍数据转发流程
4.1 实验环境与基础配置
很多初学者怕敲命令,其实验证交换机和路由器的数据转发流程,对设备要求并不高。有真实二层交换机和多口路由器当然最好,没有的话用常见网络仿真工具也完全够用。这里为了把二层和三层分清楚,我用一台普通二层交换机加一台路由器,接两台PC做演示。所有命令写成通用风格,不同厂商的设备语法会略有差异,但思路完全一致。
拓扑设计如下:
- PC-A:192.168.1.10/24,网关192.168.1.1
- PC-B:192.168.2.10/24,网关192.168.2.1
- 交换机S1只负责PC-A这侧的二层接入,PC-A接在S1的E0/1口,S1接到路由器R的G0/0口
- 交换机S2只负责PC-B这侧的二层接入,PC-B接在S2的E0/1口,S2接到路由器R的G0/1口
路由器R上做最基础的三层配置:
interface gigabitethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shutdown interface gigabitethernet 0/1 ip address 192.168.2.1 255.255.255.0 no shutdown由于两个网段都是路由器的直连接口,路由表会自动生成直连路由,不需要写静态路由。PC侧只要手工填好IP、掩码、网关就行。这样环境就绪了。
4.2 同一网段下,两台主机如何通过交换机互通
为了看二层转发过程,先把PC-B改成和PC-A同一个网段,也就是说PC-B变成192.168.1.20/24,网关可以不填或填同一个网关但不用它。接下来清掉两台PC的ARP缓存,Windows下执行arp -d,类Unix下执行ip neigh flush all。然后从PC-A ping PC-B,同时在交换机S1上做端口镜像,或者直接用抓包工具抓PC-A的网卡流量。
第一次ping的时候,抓包工具里最前面出现的往往不是ICMP,而是ARP广播。这个广播的目的MAC是全F,内容是“谁是192.168.1.20?请告诉192.168.1.10”。PC-B回应ARP Reply之后,PC-A才发出ICMP Echo Request。这里你能清晰看到ICMP请求的帧头,源MAC是PC-A的网卡MAC,目的MAC是PC-B的网卡MAC,源IP和目的IP都落在192.168.1.0/24网段。交换机在整个过程里什么都没改,只是看到目的MAC后查表,然后把帧从一个端口转到另一个端口。
再把目光放到交换机的MAC地址表上,你会发现它已经记住了两条关键表项:PC-A的MAC对应E0/1口,PC-B的MAC对应E0/2口或者上行口。之后你再ping几次,抓包工具里就再也不会出现广播泛洪了,所有ICMP包都被精确转发。这就是二层转发从“学习+泛洪”进入到“精确转发”状态的完整过程。
4.3 跨网段通信时,数据经过路由器的完整转发路径
现在把PC-B改回192.168.2.10/24,网关设成192.168.2.1,PC-A保持192.168.1.10/24不变。清空两边的ARP缓存,从PC-A ping PC-B,然后分别在PC-A和PC-B两侧同时抓包对比。
PC-A侧抓到的第一波流量,仍然先是ARP请求,但这次问的是192.168.1.1。PC-A根本没有去广播问PC-B的MAC,而是问网关的MAC。等网关回应后,PC-A发出ICMP Echo Request,抓包里帧头的目的是网关MAC,而不是PC-B的MAC,但IP包头里的目的IP确实是192.168.2.10。这个画面非常重要,它说明“跨网段时,实际二层地址只走到网关”。
路由器R收到这个帧后,做了一次完整的“拆帧、查表、换帧、转发”。它把PC-A的帧头丢弃,根据IP包里的目的IP查到192.168.2.0/24直连网段,再通过接口G0/1发ARP请求找到PC-B的MAC,然后用新的帧头发出去。所以你在PC-B侧抓包,会看到这个ICMP包的源MAC已经变成路由器G0/1接口的MAC,目的MAC变成PC-B的MAC,但源IP和目的IP和PC-A侧完全一致。
如果把PC-A和PC-B之间的路径拉长,中间再加一台路由器R2,那么每经过一台路由器都会重复一次“拆帧、查表、换MAC”的动作。你在每一跳抓包,看到的MAC都会变,IP却一直不变。这正是前面强调的“MAC逐跳换、IP端到端不变”的最好验证。配合抓包把每一跳的帧头记录下来,你就会明白,交换机其实只是路由器左手和右手之间的信使,真正的路由决策和帧改写都发生在三层设备上。
5. 常见故障与排查思路
5.1 MAC地址表异常导致的“时通时断”
老工程师最怕的故障之一不是“完全不通”,而是“网络一会儿通一会儿断”。这种问题里,交换机的MAC地址表异常占了不少比例。典型场景是两台交换机之间有二层环路,导致同一个MAC地址被交换机从多个接口反复学到,MAC表在几个接口之间来回跳变。表现就是ping会突然丢包,过几秒又恢复,抓包时还能看到大量重复广播帧。
排查思路很简单,先在交换机上查看MAC地址表,如果发现同一个MAC在极短时间内在不同接口出现,基本可以断定环路存在。再看这台设备下是不是有人把两根网线插到同一个交换机或者同一个终端上,物理环路最隐蔽但最好解决。生产环境一定要开STP/RSTP/MSTP,并且确认阻塞端口符合预期,不要只依赖生成树默认配置。交换机的端口安全配置也可能导致接口被errdisable,如果日志里看到接口反复down/up,要查是不是MAC限制触发,而不是单纯怀疑网线。
5.2 路由黑洞和静态路由配置错误
跨网段不通、但直连网段都能通,这是路由故障最常见的信号。我见过最多的错误不是“没写路由”,而是只写了去程路由,没写回程路由。PC-A去ping PC-B,A的网关确实有去B网段的路径,但B的网关不知道回A网段的路由,于是回包被错误的下一跳丢掉。用户看到的现场往往是包发出去几个以后就超时,因为请求到得了,回应回不来。
排查时先分层定位:先在PC-A上ping自己的网关,通了说明二层链路没问题;再在路由器上查看路由表,用类似show ip route的命令确认去程和回程是否双向都有。然后用traceroute从两端各跑一次,看路径断在哪一跳,基本就能锁定方向。写静态路由时还要注意,下一跳IP必须是路由器和出接口直连可达的地址,不能填一个和当前设备不直连的地址,否则路由器无法通过ARP封装帧,就会出现“路由黑洞”。默认路由更要谨慎,如果两台路由器都用默认路由指向对方,很容易形成三层环路,流量会在两台设备之间转圈,直到TTL耗尽。
5.3 交换机/路由器场景下的抓包排查要点
最后说一个我自己的体会:排查数据传输流程问题时,抓包位置比抓包工具重要得多。交换机内部转发对不对,最好在交换机上做镜像,把业务流量复制到抓包口;路由器封装对不对,最好在路由器的进出接口分别抓包。如果你只在电脑端抓包,可能根本看不到路由器重新封装之后的帧,也就很难判断问题是出自路由决策还是二层投递。
我常用的分层打点方法也分享给你:先在PC上ping网关,网关通,基本说明二层链路和交换机转发没问题;再ping跨网段地址,不通就跳到路由器上分别ping两个直连接口地址,再查路由表。检查时要特别关注ARP表项是不是学错了,ACL有没有隐式丢弃,NAT策略是不是把源地址改得面目全非。每改一个配置前,先把现状记录下来,改完立刻验证,不要同时动多个变量。真实网络里七成“奇怪故障”,到最后都是被人为改乱的路由和ARP问题,而不是设备坏了。按照“一层层打点、每跳看封装”的习惯走下去,你会比满脑子只能翻命令的手快得多。