
路由器这东西平时放在角落里不声不响但只要家里网一卡、游戏一掉线所有人第一个想到的就是它。很多人问我路由器到底在里面干了什么凭什么能把几十台设备的流量安排得明明白白搞懂路由器的工作原理不仅是考个证书的事对于排查网络故障、设计办公室网络、甚至自己做软路由都非常有用。这篇文章我就从一个不太常见的角度来拆路由器不是“转发盒”而是一个不断做选择题的决策器。它的全部工作可以浓缩成三个动作——收包、查表、转发。把这套机制吃透你再看任何网络问题视角都会完全不一样。1. 先用“邮局分拣”理解路由器三层设备到底在忙什么1.1 路由和交换差的不是性能是脑子很多人容易把交换机和路由器混为一谈。外观上都是铁盒子插满了网线但两者的核心差别非常大。简单说交换机工作在二层它只看MAC地址不知道“外网”是什么只知道把帧从一个端口扔到另一个端口。而路由器工作在三层它眼睛盯的是IP地址看的是“这个数据包要去哪个网段下一跳交给谁”。我常用一个邮局分拣的类比来解释交换机就像快递站里的传送带只管把包裹从A口运到B口至于这件快递是从哪个城市寄来的、要去哪个城市它不管也不关心。路由器则是站里的分拣员每一件包裹到了手上都要看面单上的目的地邮编再对照手里的分拣表决定是送进某个城市的通道还是转交给下一站分拣中心。这个“分拣表”在路由器里就叫路由表而“决定送到哪一站”的过程就是路由查询。1.2 路由器的完整能力清单虽然核心工作是路由和转发但一台正经路由器通常还兼任不少其他工作尤其是家用路由器基本就是一个三合一的盒子路由功能维护路由表跨网段选择路径决定数据包下一跳去往哪里。转发功能把从某个接口收到的数据包按照路由表的结论从另一个接口送出去期间要重写MAC地址、修改TTL值。NAT功能家庭内网用的多为私有地址比如192.168.x.x这些地址在公网没法直接通信路由器要把私有地址“翻译”成公网地址再往外发。DHCP服务自动给内网设备分配IP地址、网关、DNS省去手工配置的麻烦。DNS中继大多数家用路由器会把内网设备的DNS请求转发到运营商或公共DNS服务器这也算一个轻量代理功能。所以当你说“家里路由器不行”的时候真正出问题的可能是其中某一个模块。这也可以解释为什么有些情况下路由器看起来“坏了”但你把它单独换成一台二层交换机问题依旧——因为交换机根本不会做NAT也就无从谈公网通信了。1.3 为什么要理解路由器的三层视角我经常看到有人这么排查网络问题一直盯着Wi-Fi信号强度甚至怀疑运营商偷工减料结果呢换路由器、换网线、换终端折腾一晚上。真正的问题出在内网存在两个网段或者路由表缺了一条静态路由导致数据包有去无回。这种“一叶障目”的原因就是只从二层视角看网络觉得只要物理连通就能通信。实际上跨网段通信必须有路由器参与而路由器参与的前提是它的路由表里得有对应路由。理解这个逻辑之后你再调试网络时就会形成一个本能反应先确认设备能不能上网再看能不能跨网段最后才怀疑硬件。这个思路比任何昂贵工具都值钱。2. 路由表路由器做决策的那张“地图”2.1 一张真实路由表长什么样路由表是路由器的大脑记忆区。你可以直接在命令行里敲命令查看不同系统的命令不一样但呈现的内容大同小异。拿典型的输出举例一张路由表大致长这样S 10.0.0.0/8 [1/0] via 192.168.1.1 C 192.168.1.0/24 is directly connected, Ethernet0 C 192.168.2.0/24 is directly connected, Ethernet1 S* 0.0.0.0/0 [1/0] via 192.168.1.254 O 172.16.10.0/24 [110/50] via 192.168.1.10逐行解读开头的字母代表路由来源。C表示直连路由S是静态路由O是OSPF动态学到的路由。不同来源优先级不一样。第一段地址是目的网络后面跟着掩码表明这个路由条目管的是哪个网段。方括号里的数值分别是管理距离和度量值。管理距离表示路由来源的可信度数值越小越可信度量值表示到这个目的地的开销数值越小越优先。关键字via后面是下一跳地址意思就是“去这个网段把包交给谁”。最后一行0.0.0.0/0是默认路由也叫缺省路由凡是路由表里查不到的网络统统丢给这一行处理。这也正是家用路由器的出口“总闸”。2.2 路由的三个来源直连、静态、动态路由表里的条目不会凭空产生三个来源各有各的性格。直连路由最老实路由器只要给接口配置了IP地址且接口状态正常系统就会自动把该接口所在网段写进路由表比如上面的192.168.1.0/24。直连路由优先级极高因为这是路由器自己“长在身上的网络”不需要经过任何计算。静态路由是管理员手工写的适合网络拓扑固定、路径明确的小型网络。比如你有两个办公室分别属于192.168.1.0/24和192.168.2.0/24中间通过专线连在一起那你只需要在两台路由器上各写一条静态路由指向对方的接口IP即可。静态路由的好处是稳定、可控、不占带宽缺点是一旦拓扑变化需要人手动改网络规模一旦大到几十上百台设备维护成本就很恐怖。动态路由则是路由器之间通过协议自动交换信息、自行计算出来的。RIP、OSPF、BGP都是这类协议。动态路由的价值在于自适应某条链路断了协议能自己嗅探到并收敛到备用路径这也是中大型网络的必然选择。2.3 路由决策的三条铁律最长匹配、管理距离、度量值一张路由表里可能同时存在多条能到达同一个目的地的条目路由器怎么选择它不是随机的而是按照一套严格顺序最长前缀匹配优先。路由表里如果有192.168.1.0/24这条路由又有192.168.1.128/25这条路由现在要发往192.168.1.200那肯定优先匹配后者因为/25的掩码更长匹配范围更精确。这个道理就像查地址写“北京市朝阳区某街道某号”比只写“北京市”精确得多分拣员当然优先按详细地址送。管理距离小的优先。这是用来仲裁“哪种路由来源更可信”的标准。不同厂商的具体数值略有差异但大致规律是直连路由管理距离为0静态路由通常是1动态路由协议的路由则视协议而定比如OSPF是110、RIP是120。当两条不同来源的路由都指向同一个目的地并且前缀长度一样时数值小者胜出。度量值小的优先。这是解决“同一个协议学习到的多条路径”的办法。OSPF会用开销值来算RIP用跳数目的都是选出最短、最合理的路径。这一层优化主要是为了让流量走“最便宜的链路”避免网络出现次优路径。三条铁律的顺序不能乱。最长匹配先筛掉大部分干扰项管理距离排除可信度低的路由最后交给度量值做同级别内比较。这是整个路由决策机制的精髓。3. 一次完整的数据包转发从PC到服务器3.1 出发源主机先做“网关判断”很多人以为数据包一到路由器才开始查询其实源头还需要先判断目标IP和自己在不在同一个网段。假如你电脑的IP是192.168.1.100你要访问的服务器是10.0.0.8。电脑用子网掩码一算发现目标不在本地网段于是它不会直接尝试解析服务器的MAC地址而是把数据包封装好目的MAC写成默认网关192.168.1.1的MAC地址扔给路由器处理。注意这里有一个很关键的点数据包里的目的IP始终是10.0.0.8但链路层的MAC地址却是网关的。如果把网络比作快递那么IP地址是收件人的门牌号MAC地址是沿途每个站点的交接码。门牌号从头到尾不变交接码每换一个站点就要更新一次。3.2 中转路由器查表、换MAC、减TTL数据包到达路由器接口路由器要做四件事校验帧完整性去掉链路层层封装把IP包提取出来。查路由表找到匹配10.0.0.0/8的路由条目确定下一跳。重写链路层信息源MAC改成出接口的MAC目的MAC改成下一跳设备的MAC如果下一跳就是目标服务器那目的MAC就是它本机的MAC。TTL减1重新计算校验和然后把包从对应的出接口发出去。中途如果TTL减到0路由器就会丢弃这个包同时给源地址回一个ICMP超时的消息。这既是防环机制也是traceroute命令能工作的基础。3.3 一个多跳实例用三步链路看数据包如何跨网段为了把这条链路讲透我们假设一个最简单的三跳网络PC(192.168.1.100/24) - R1(192.168.1.1) - R2(10.0.0.1) - Server(10.0.0.8)PC发送数据包时源IP是192.168.1.100目的IP是10.0.0.8源MAC是PC的MAC目的MAC是R1的MAC。R1收到后查表发现去10.0.0.0/8的下一跳是R2的接口10.0.0.1于是把帧的目的MAC替换成R2接口的MAC源MAC替换成R1出接口的MACTTL从64变成63再发出去。R2的操作一模一样只不过它查表发现10.0.0.8就是直连网段的地址于是会通过ARP解析服务器MAC然后把帧的目的MAC替换成服务器MAC交给服务器。你会发现整个过程中源IP和目的IP始终没变一直在变的只有MAC地址和TTL。这个“IP不变、MAC逐跳变”的机制是整个IP网络能够跨越各种异构链路运行的前提。3.4 对称问题单向通、能ping通A却访问不了B理解了逐跳转发就能明白很多古怪问题。比如常有人报告电脑能ping通网关但上不了网。按上面的链路推理能ping通网关说明二层和三层的出方向通信没问题问题很可能出在路由器的WAN口或者NAT上。反过来有人能访问外网但访问不了内网另一台服务器那要查的是服务器自身网关配置、防火墙规则以及路由器上有没有回程路由。这类故障的排查如果脑子里没有完整的转发链路图往往会盲人摸象。4. 动态路由协议路由器之间怎么交换“地图”4.1 为什么静态路由不够用小型网络用静态路由完全够甚至更清晰。但网络一复杂问题就来了。举个例子公司有三条出口链路分别接到三个不同的运营上还和分公司通过两条专线互联。每条链路随时可能抖动靠人工改路由显然来不及。这时候就需要动态路由协议让路由器互相“汇报路况”自动计算备用路径。动态路由协议的选择看似很多但核心规律只有两条距离矢量和链路状态。理解了这两大家族你就抓住动态路由的七寸了。4.2 距离矢量RIP与链路状态OSPF的核心差异距离矢量协议的思路可以用一句话概括“邻居告诉我怎么走我就怎么走。”每台路由器只把自己的路由表完整地发给相邻路由器邻居根据收到的信息更新自己的路由表再转发给下一家。这种方式简单但坏处是收敛慢而且路由信息经过多次传递后可能失真甚至会因为传递延迟形成路由环路。链路状态协议则完全换了个思路。每台路由器把自己接口的状态、直连网络的信息广播给全网所有路由器于是每台路由器都拿到全网的拓扑图然后各自独立用SPF算法计算最短路径树。OSPF就是这类协议的典型它收敛快、无环路、适合中型到大型网络。这也是在企业网里OSPF的地位远高于RIP的原因。直观对比一下维度RIP距离矢量OSPF链路状态衡量路径的指标跳数开销带宽等综合开销信息交换方式整张路由表发给邻居链路状态通告泛洪给全网收敛速度慢可达分钟级快秒级甚至更快环路风险高需要额外机制防环本质无环依赖SPF算法适用规模小型网络中大型网络4.3 外部路由边界上的BGPOSPF再厉害也只是在一个“自治系统”内部工作。不同自治系统之间的路由用的是BGP。你可以把BGP理解成“国家与国家之间的外交协议”它搬运的不是单个用户的数据包而是海量的网段路由信息。互联网之所以能让全球网络互联互通靠的正是BGP在海量自治系统之间交换可达性信息。它重视的不是路径快慢而是策略、政治和商业关系哪条路可以走哪条路不让你走都通过BGP属性来约束。提到BGP并不是让大家立刻去学而是为了建立一张完整的路由认知地图局域网用静态路由园区网用OSPF跨运营商骨干则看BGP。知道每个层级的工具是什么就算暂时用不上至少遇到问题心里有数。4.4 在家用和企业场景下如何选协议家用路由器一般不需要你配置任何动态路由协议因为一个默认路由加一个NAT就搞定了所有流量。但如果你在公司做组网就应该根据网络规模来选网络只有两三台路由器拓扑稳定优先配置静态路由简单直观。网络有几十台路由器链路有冗余需要快速收敛上OSPF。网络需要对接不同的运营商或外部机构可能要涉及BGP但一般这是运营商和大型企业的事。协议不是越多越好。很多工程师喜欢在一切地方配OSPF反而把故障排查变成噩梦。协议选型要匹配业务规模和运维能力小网络用静态有时候比动态更省心。5. 家用路由器的附加面NAT与DHCP是怎么协同的5.1 NAT内网地址如何“装进”公网流量家用路由器内部通常跑着一个简易版的NAT功能全称是网络地址转换。因为这个功能太常见很多人反而没有认真理解过它。你家内网设备拿到的多半是192.168.x.x之类的私有地址这些地址在公网上是不允许被直接路由的。那么当内网的电脑访问网站时路由器会怎么做它会把这个数据包的源IP从192.168.x.x改写成路由器WAN口上的公网IP同时记录一个映射表源端口、目的IP、目的端口、转换后的端口。当外部服务器的响应数据包回来时路由器根据这个映射表逆转规则把数据包交给内网那台电脑。这个过程相当于一个前台秘书访客要见公司某位员工秘书先把电话转到员工那里员工回话时秘书再转回去。访客永远看不到员工本人的分机号员工也看不到访客的直接号码。NAT不仅节省公网IPv4地址还顺手提供了一层“隐藏内网”的效果需要注意这层隐藏只是附带功能不是真正的安全机制。5.2 DHCP四步握手分配IP家用设备之所以插上网线就能上网不用自己填IP地址靠的是DHCP。它的工作过程只有四步设备发出Discover广播找DHCP服务器服务器回一个Offer告诉设备可以用的IP、掩码、网关和DNS设备再广播Request确认服务器回ACK收尾。很多人以为DHCP只是分配IP忽略了它还下发默认网关和DNS。这就是为什么你在电脑上看到IP是192.168.1.100但网关只要一错所有跨网段访问全部失败。如果家里偶尔出现“手机能收到Wi-Fi但有些网站打不开”先检查路由器DHCP里给终端下发的DNS是不是被改成奇怪的值了。这类问题排查起来不难但思路很重要。5.3 端口映射与常见NAT类型NAT虽然方便却也带来一个副作用外部主动访问到内网变难了。因为路由器那张映射表里没有对应条目外部的流量根本没处可送。解决办法就是端口映射也就是在路由器上设定一条规则凡是WAN口收到特定端口的数据包就转给内网某台设备的指定端口。做自建NAS、远程桌面、玩游戏开服务器都是这个原理。家用路由器上通常叫“端口转发”或“虚拟服务器”企业路由器则叫目的NAT。常见的NAT类型也有讲究。锥形NAT、对称NAT这些名词对打游戏联机的人比较熟悉。简单说锥形NAT对同一内网设备的不同外部通信复用一个映射兼容性好对称NAT为每次通信建立独立映射安全性更高但P2P联机困难。如果你发现和朋友联机失败先看看双方路由器的NAT类型是否太严格再考虑要不要开UPnP自动映射端口。5.4 桥接与拨号光猫和路由器的职责划分现在很多家庭网络是“光猫路由器”双设备结构。光猫承担光电转换有些还会顺手承担拨号和路由。如果你觉得光猫的路由能力太弱又不想买一台新的可以尝试把光猫改成桥接模式让路由器负责拨号和NAT。这样做的本质是把光猫从“三层设备”降级成“二层透传设备”让路由器接管路由决策权。这种改法对体验的提升往往非常明显尤其是光猫自带的Wi-Fi和路由性能不够强时。不过要注意桥接需要正确的拨号账号和密码。动手前先确认自己的上网方式别改完之后反而连不上网。桥接和路由两层叠加有时候才是导致“一卡一卡”的元凶一次彻底分工反而更省心。6. 我踩过的坑路由故障排查与实用实验6.1 排查套路由近及远的四步法路由类故障有一种经典排查顺序我自己用了很久每次都能快速缩小范围先看物理层网线灯亮不亮Wi-Fi信号是否正常尽量用网线连接测试排除无线干扰。确认本机IP配置ipconfig或ifconfig一看网关和掩码有没有异常ping网关通不通。查路由表和路径ping网关通但外网不通直接在路由器上看NAT和默认路由ping外网IP通但域名不通重点查DNS。抓包或看日志实在不行在关键节点抓包看ARP是否正常解析、数据包是否到接口、有没有被防火墙丢弃。这套流程的核心思想是“分段排除法”。不要一上来就怀疑设备是不是坏了先用最朴素的手段确定问题发生在哪一段链路再对症下药。6.2 典型问题速查表下面这些情况我几乎每个月都会碰到整理成一张速查表现象可能原因处理方向能ping网关不能上外网WAN口获取不到公网IP、默认路由缺失、NAT配置错误检查PPPoE拨号状态、路由表默认路由、NAT规则能上微信/QQ浏览网页很慢DNS解析异常、MTU不匹配更换DNS调整MTU跨网段能ping通但软件连不上防火墙规则拦了回程流量检查目标机防火墙和路由器ACL掉线后恢复慢动态路由协议收敛慢、线路抖动调整协议参数或增加备份线路端口映射了但外部访问失败NAT类型限制、映射了错误的接口、运营商封端口切换路由器NAT模式换公网端口测试突然大面积断网逐个设备排除后发现网关都ping不通路由器死机、DHCP池耗尽、环路广播风暴看CPU和内存查DHCP池找环路6.3 用模拟器做验证实验的思路如果手头没有物理路由器很多网络模拟器同样可以搭建实验环境。你可以构建两台路由器、三台PC的拓扑分别配置直连路由、静态路由然后用ping去验证跨网段通信。这个实验看起来简单但很有价值你能直观看到路由表变化体验静态路由缺失时的“不通”再补上路由看“恢复通信”。之后再尝试配置OSPF观察相邻路由器的邻居状态和LSDB同步过程对理解链路状态协议非常有帮助。模拟器的好处是随便折腾不会弄坏实网。我个人建议任何人在改生产网络前先搭一套模拟环境走一遍。等你在模拟器里踩过“忘了写回程路由”“掩码写错导致路由黑洞”这些坑之后再回到真实环境会从容很多。6.4 几个提升网络水平的习惯最后分享几个我的日常习惯不算高深但很管用改配置前先把现有配置备份尤其是出口路由器和防火墙一条错误的路由就可能断网。每次动路由表时用抓包工具在关键节点抓一次包对比一下趋势很多隐蔽问题在“改之前”和“改之后”的流量对比里立刻暴露。长期测试的DHCP、DNS、NAT规则尽量写成文档。很多故障都不是现在产生的而是一年前随手写的那条静态路由留了隐患。有时间就用traceroute逐跳走一遍你常访问的网站你会亲眼看到数据包到了哪些关口路径一长网络“不可能出问题”的想法自然会消失。根据我自己的经验理解路由器的工作原理最忌讳的是只背概念。路由表就在那里抓包工具也在那里多做几次实验把“查表-转发-换MAC-减TTL”这套流程亲手验证一遍比看一百遍文档都深刻。下一次再遇到网络卡顿你就能顺着数据包的足迹一路找到问题的真正出口。