资讯详情

资讯详情

交换机与路由器数据转发流程详解:从MAC到IP的逐跳之旅

搞网络久了你会发现一个很有意思的现象很多人配交换机、路由器的时候命令敲得很熟练拓扑也能画出来可一旦问起“这台电脑发给另一台电脑的数据到底是怎么一步一步过去的”就支支吾吾了。我自己也带过不少刚入行的同事大家卡住的点往往不在命令而在脑子里没有一个完整、清晰的数据转发画面。这篇笔记就想把交换机、路由器在数据传输流程里各自干的事掰开揉碎讲清楚适合正在学网络基础、准备认证或者被网络故障折腾过几次想系统补课的人。看完你至少能回答为什么交换机不查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。这时以太网帧头是源MACPC-A网卡MAC目的MACPC-B网卡MAC帧里的IP包是源IP192.168.1.10目的IP192.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.1PC-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一开始发TTL1的包第一跳回超时再发TTL2第二跳回超时逐跳递增就能画出完整路径。如果你ping跨网段时收到“Time to live exceeded”不代表目标不可达而是这个包在中间某台设备上寿命耗尽很可能是路由成环了。第三个环节是MTU和分片。当IP包从大MTU接口进入路由器要从小MTU接口出去时IPv4允许分片但分片会导致性能下降也会有安全风险。实际网络中很多丢包问题不是路由写错而是ICMP“Fragmentation needed”没有正常回给源端导致大包直接卡死。排查时用一个能设置数据大小的大包ping工具从大到小测试通常可以快速定位MTU瓶颈。4. 实操用一台交换机加一台路由器完整走一遍数据转发流程4.1 实验环境与基础配置很多初学者怕敲命令其实验证交换机和路由器的数据转发流程对设备要求并不高。有真实二层交换机和多口路由器当然最好没有的话用常见网络仿真工具也完全够用。这里为了把二层和三层分清楚我用一台普通二层交换机加一台路由器接两台PC做演示。所有命令写成通用风格不同厂商的设备语法会略有差异但思路完全一致。拓扑设计如下PC-A192.168.1.10/24网关192.168.1.1PC-B192.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.1PC-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-BA的网关确实有去B网段的路径但B的网关不知道回A网段的路由于是回包被错误的下一跳丢掉。用户看到的现场往往是包发出去几个以后就超时因为请求到得了回应回不来。排查时先分层定位先在PC-A上ping自己的网关通了说明二层链路没问题再在路由器上查看路由表用类似show ip route的命令确认去程和回程是否双向都有。然后用traceroute从两端各跑一次看路径断在哪一跳基本就能锁定方向。写静态路由时还要注意下一跳IP必须是路由器和出接口直连可达的地址不能填一个和当前设备不直连的地址否则路由器无法通过ARP封装帧就会出现“路由黑洞”。默认路由更要谨慎如果两台路由器都用默认路由指向对方很容易形成三层环路流量会在两台设备之间转圈直到TTL耗尽。5.3 交换机/路由器场景下的抓包排查要点最后说一个我自己的体会排查数据传输流程问题时抓包位置比抓包工具重要得多。交换机内部转发对不对最好在交换机上做镜像把业务流量复制到抓包口路由器封装对不对最好在路由器的进出接口分别抓包。如果你只在电脑端抓包可能根本看不到路由器重新封装之后的帧也就很难判断问题是出自路由决策还是二层投递。我常用的分层打点方法也分享给你先在PC上ping网关网关通基本说明二层链路和交换机转发没问题再ping跨网段地址不通就跳到路由器上分别ping两个直连接口地址再查路由表。检查时要特别关注ARP表项是不是学错了ACL有没有隐式丢弃NAT策略是不是把源地址改得面目全非。每改一个配置前先把现状记录下来改完立刻验证不要同时动多个变量。真实网络里七成“奇怪故障”到最后都是被人为改乱的路由和ARP问题而不是设备坏了。按照“一层层打点、每跳看封装”的习惯走下去你会比满脑子只能翻命令的手快得多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →