可以把网络世界想象成一张巨大的交通网路由就是这张网里的导航系统。第一部分基础概念——路由是什么为什么需要它1.1 没有路由寸步难行你的电脑192.168.1.5想给公司服务器10.0.0.20发一个“你好”的数据包。它们不在同一个“小区”网络里。你的电脑只知道自己的小区它会检查目标地址10.0.0.20发现这不是我们小区的不在192.168.1.0/24网段。直接喊话没用在局域网里靠吼ARP广播能找到同小区的伙伴但服务器不在喊破喉咙也没人应。必须有人指路这时需要一个懂路况的家伙站出来告诉你“去那个地方得先经过我。” 这个家伙就是网关通常是路由器在你这里的接口。1.2 路由的核心定义路由就是为数据包选择一条从源地址到目的地址的传输路径并交给下一站的过程。拆开看两个动作1、寻径Routing / Route Selection——解决“走哪条路最好”目的明确数据包从源到目的地址应走的最优路径这是路由决策的第一步。定义要点寻径 判定到达目的地址的最佳路径。实现方式由路由选择算法完成。关键依赖必须启动并维护路由表该表包含网络拓扑与下一跳的匹配信息。数据来源路由选择算法收集网络中各种路由信息动态填充路由表。工作机制路由器收到IP数据报 → 解析目的IP地址 → 查路由表 → 匹配“目的网络 下一跳” → 做出路由决策。协议支持不同路由器间通过路由选择协议交换信息保持路由表同步更新以适应网络变化。典型协议举例RIP、OSPF开放式最短路径优先、BGP边界网关协议等。2、转发Forwarding / Packet Forwarding——解决“怎么把包送出去”目的依据已确定的最佳路径将数据分组实际传送至下一跳路由器或主机。课本定义要点转发 沿已判定好的最佳路径传送信息分组。工作流程① 路由器查路由表 → 判断是否知道如何送达下一跳② 若不知 → 通常丢弃分组③ 若知道 → 按路由表对应条目将分组发送至下一跳④ 若目的网络直连​ → 直接发送给目的主机。协议归属这一过程属于路由转发协议Routed Protocol如IP协议本身。与寻径关系→ 路由转发协议使用路由选择协议维护的路由表→ 路由选择协议依赖转发协议传递自己的控制报文如Hello包、LSA、Update等。二、路由表深度剖析路由表是路由器中至关重要的一部分它就像一张地图决定了数据包在网络中的传输路径。3.1 什么是路由表路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳路径并将该数据包沿着最佳路径有效地传送到目的站点。为了完成这项工作路由器中保存着各种传输路径的相关数据——路由表供路由选择时使用。值得注意的是不仅是路由器Internet中的每一台主机都有路由表。3.2 路由表的分类根据其生成方式路由表可以分为静态路由表和动态路由表两种1静态路由表由系统管理员事先设置好的固定的路由表称为静态路由表。它一般在系统安装时根据网络的配置情况预先设定好不会随未来网络结构的改变而改变。特点手动配置固定不变适合网络结构简单、稳定的环境2动态路由表动态路由表是指路由器根据网络系统的运行情况自动调整的路由表。路由器根据路由选择协议提供的功能自动学习和记忆网络运行情况在需要时自动计算数据传输的最佳路径。特点自动学习和更新能适应网络拓扑变化适合大规模、复杂网络(3)直连路由天然知道接口配好IP并激活路由器就知道自己直连的网络怎么走。特点优先级最高最可信。在表中用 Direct 或 C 表示。3.3 路由表的结构与字段详解路由表的基本字段字段含义说明目的网络目标网络的ID或网络地址标识数据包要去往的网络子网掩码32位二进制数与IP地址进行与运算来区分网络地址和主机地址网关下一跳路由器的入口IP地址数据包下一步要到达的设备接口本地路由器的出口IP地址通过哪个接口发送数据标志路由状态标识U激活UG网关路由UGH网关主机路由Metric跳数/度量值路由首选项值越小优先级越高关于Metric跳数的重要说明Metric是路由首选项的度量值。通常情况下如果有多条到达相同目的地址的路由记录则路由器会采用Metric值最小的那个路由。路由器根据跳数来决定存储在路由表中的路由表项。3.4 路由表能力路由表的能力是指路由表中所有路由表项数量的极限。由于Internet中执行BGP的路由器通常拥有数十万条路由表项所以该项目也是路由器能力的重要体现。3.5 直连网络的路由表实现下面通过表8-3所示的直连网络的路由表实现来介绍如何读懂路由表。表8-3 直连网络的路由表实现目的网络子网掩码网关标志接口201.66.37.0255.255.255.0201.66.37.74Ueth0201.66.39.0255.255.255.0201.66.39.21Ueth1解析如果一个主机有多个网络接口当向一个特定的IP地址发送分组时它根据路由表决定使用哪个接口所有目的网络为201.66.37.0的主机IP地址为201.66.37.1~201.66.37.254的数据通过接口eth0IP地址为201.66.37.74发送所有目的网络为201.66.39.0的主机IP地址为201.66.39.1~201.66.39.254的数据通过接口eth1IP地址为201.66.39.21发送标志U表示该路由状态为up即激活状态3.6 远程网络的路由表实现表8-3中的主机有两个网络接口eth0和eth1IP地址分别为201.66.37.74和201.66.39.21。这两个网络接口分别处在不同的LAN内而它们所在网络的地址恰恰就是表中第一列中显示的地址把201.66.37.74和255.255.255.0进行与运算可得到201.66.37.0同理可得201.66.39.0。那么远程网络的路由条目如何表示呢假如通过IP地址为201.66.37.254的网关连接到网络73.0.0.0那么可以在路由表中增加以下表项表8-4 远程网络的路由表实现目的网络子网掩码网关标志接口73.0.0.0255.0.0.0201.66.37.254UGeth0表8-5 远程主机的路由表表项目的网络子网掩码网关标志接口91.32.74.21255.255.255.0201.66.37.254UGHeth0标志UG表示该路由为激活状态的网关路由UGH表示激活状态下的网关主机路由。3.7 默认路由和环回路由表8-6 默认路由和环回路由的路由表表项目的网络子网掩码网关标志接口127.0.0.0255.0.0.0127.0.0.1UGlo0Default0.0.0.0201.66.39.254eth1环回接口lo0第一项是环回接口用于主机给自己发送数据通常用于测试和运行于IP之上的需要本地通信的应用。这是到环回地址127.*.*.*的主机路由接口lo0是IP栈内部的假网卡。默认路由Default第二项是一个默认路由。如果在路由表中没有找到与目的地址相匹配的项则该分组被送到默认网关。3.8 重叠路由与最长前缀匹配有时路由表中可能会有重叠项如下表所示表8-7 路由表中出现重叠项目的网络子网掩码网关标志接口1.2.3.4255.255.255.255201.66.37.253UGHeth01.2.3.0255.255.255.0201.66.37.254UGeth01.2.0.0255.255.0.0201.66.39.253UGeth1Default0.0.0.0201.66.39.254UGeth1问题这4条路由记录都含有地址1.2.3.4。如果向IP地址为1.2.3.4的主机发送数据路由器会选择哪条路由记录答案路由器会选择第一条路由记录通过网关201.66.37.253发送数据。原则选择具有最长最精确网络前缀的一项。因为255.255.255.255是最精确的掩码主机路由优先级最高。类似的对于发往1.2.3.5的数据路由器会选择第二条路由记录掩码255.255.255.01.2.4.5则会匹配第三条掩码255.255.0.0都不匹配则走默认路由1.理解“含有地址”的含义这句话中的“含有地址”并不是说目的网络等于​1.2.3.4而是说对于一个给定的目标IP1.2.3.4在这4条路由表中它都能被其中任何一条目的网络掩码所匹配。逐条分析目标IP1.2.3.4第一条路由1.2.3.4/32掩码 255.255.255.255这是主机路由精确匹配1.2.3.4这一个主机。匹配吗是的目标IP正好等于1.2.3.4完全匹配。第二条路由1.2.3.0/24掩码 255.255.255.0匹配从1.2.3.0到1.2.3.255的所有地址。目标IP1.2.3.4在这个范围内吗是的1.2.3.4是1.2.3.0/24网段内的一个IP。所以也能匹配。第三条路由1.2.0.0/16掩码 255.255.0.0匹配从1.2.0.0到1.2.255.255的所有地址。目标IP1.2.3.4在这个范围内吗是的因为前16位是1.2。所以也能匹配。第四条路由默认路由0.0.0.0/0匹配所有地址任何IP都能匹配。目标IP1.2.3.4匹配吗当然能。从集合的角度看这4条路由的目的网络范围是嵌套的1.2.3.4/32单个地址⊆1.2.3.0/24⊆1.2.0.0/16⊆0.0.0.0/0全集当IP是1.2.3.4时它在所有这些网络地址集合中。2.路由器如何选择根据最长前缀匹配原则路由器会选择子网掩码最长、即最精确的路由。比较它们的网络前缀长度掩码中1的位数第一条/32最长最精确第二条/24第三条/16第四条/0最短所以发往1.2.3.4的数据会选第一条主机路由。一、目标IP 为什么要去和 “目的网络 掩码” 匹配答因为路由器要判断“这个数据包该发往哪个方向”必须通过“目的IP”与“路由表中每个目的网络掩码”进行逻辑运算计算出“这个IP属于哪个网段”从而决定走哪条路。路由器不直接认识“IP地址”它认识的是“网络段”即目的网络子网掩码计算出的网络地址。所以它必须取目标IP如 1.2.3.4与路由表中每一行的“目的网络 子网掩码”做“按位与运算”​得到“目标IP所属的网络地址”与该行“目的网络”比对 → 若相等 → 就匹配上了例:目标IP 1.2.3.4路由表某行目的网络1.2.3.0掩码255.255.255.0→ 1.2.3.4 255.255.255.0 1.2.3.0→ 与目的网络 1.2.3.0 相等 → 匹配二、匹配的条件是什么答只要目标IP 与某条路由条目的 “目的网络地址” 相等就算匹配成功。而“目的网络地址”是通过 “目标IP 与 子网掩码 按位与” 得到的。 匹配公式目标IP 子网掩码 路由表中的“目的网络” → 匹配成功路由条目目的网络子网掩码目标IP1.2.3.4 与掩码按位与结果是否匹配1.2.3.4/321.2.3.4255.255.255.2551.2.3.4 255.255.255.255 1.2.3.4 → 等于目的网络 ✅是1.2.3.0/241.2.3.0255.255.255.01.2.3.4 255.255.255.0 1.2.3.0 → 等于目的网络 ✅是1.2.0.0/161.2.0.0255.255.0.01.2.3.4 255.255.0.0 1.2.0.0 → 等于目的网络 ✅是0.0.0.0/00.0.0.00.0.0.0任意IP 0.0.0.0 0.0.0.0 → 等于目的网络 ✅是三、目的网络为什么可以包含“从1.2.3.0到1.2.3.255的所有地址”难道不能没有吗答因为这是子网划分的本质 —— 目的网络是“网段”的抽象不是“单个IP”。只要子网掩码允许它天然覆盖该网段内所有主机IP。这是IP地址设计的底层逻辑不能“没有”因为它是路由工作的基础。举例1.2.3.0/24子网掩码 255.255.255.0 → 前24位是网络号后8位是主机号。所以这个网段中网络地址 1.2.3.0不可用作主机广播地址 1.2.3.255不可用作主机可用主机地址 1.2.3.1 ~ 1.2.3.254→ 因此路由表中“目的网络1.2.3.0/24”这一条就是代表“所有属于1.2.3.x的主机”都要走这条路。为什么“不能没有”因为如果路由表只能写单个IP如1.2.3.1、1.2.3.2…那全球几十亿IP每条都要存一条路由 —— 路由表会爆炸根本不可行。所以用“网段”来聚合一个条目管一堆IP —— 这就是路由设计的精髓聚合 层次化 匹配计算→ 所以“目的网络”天然就是“一段地址范围”不是“单个地址”除非是主机路由如 /32。3.9 一个经典的CIDR应用场景假设ISP1被赋予256个C类网络从213.79.0.0到213.79.255.0。该ISP外部的路由表只用一个表项就描述了所有的路由网络号为213.79.0.0子网掩码为255.255.0.0。现在有一个用户从ISP1处申请到一个网络地址213.79.61.0假设现在想从ISP1移到ISP2传统做法的问题必须从新的ISP处取得新的网络地址这意味着必须重新配置每台主机的IP地址改变DNS设置等解决办法原来的ISP1保持路由213.79.0.0子网掩码255.255.0.0新的ISP则把路由213.79.61.0子网掩码255.255.255.0广播给外部路由器用户想从 ISP1 移到 ISP2解决思路让用户不换 IP 地址继续用213.79.61.0/24但把网络接入点从 ISP1 换到 ISP2。这需要通知互联网的其他路由器以后访问213.79.61.0/24的数据包请发给 ISP2而不是 ISP1。ISP1 的路由保持不变在外部其他自治系统路由表中仍有一条213.79.0.0/16指向 ISP1这是“聚合路由”包含了213.79.61.0/24在内。ISP2 额外广播一条更具体的路由ISP2 向其他路由器通告一条213.79.61.0/24的路由并且声明“我是下一跳”去往213.79.61.0/24的数据包。外部路由器遵循“最长匹配”原则目标 IP 属于213.79.61.x时同时匹配213.79.0.0/16下一跳 ISP1213.79.61.0/24下一跳 ISP2因为/24比/16更精确子网掩码更长所以优先选 ISP2 的路由。结果用户网络213.79.61.0/24的流量会走 ISP2 这条新路径。而 ISP1的其他 255 个 C 类网络如213.79.62.0/24等的流量仍走 ISP1。用户不用改 IP 地址只是换了一个服务商接入。表8-8 重叠路由目的网络子网掩码网关标志接口213.79.0.0255.255.0.0201.66.37.254UGeth0213.79.61.0255.255.255.0201.66.39.254UGeth1这里利用了最长前缀匹配原则访问213.79.61.0/24的流量会被精确匹配到第二条路由而其他213.79.x.x的流量则走第一条。3.10 接口配置特例把同一主机的两个接口定义在同一子网中在很多路由协议中是不允许的。表8-9 接口配置特例接口IP地址子网掩码eth0201.66.37.1255.255.255.0eth1201.66.37.2255.255.255.0这里将两个接口配置在同一个网络中用于实现网络的负载均衡但必须有路由协议的支持。一、为什么能断定是“同一台主机”依据接口命名规则 子网归属。1. 看“身份证”接口名在任何一个网络设备路由器、服务器、Linux主机内部eth0、eth1、eth2... 是设备给自己网卡编的内部号。关键eth0和eth1能出现在同一张配置表里说明它们属于同一个系统。如果是两台不同主机它们的配置表是独立的不会把另一台机器的eth0写进来。因为不同主机的配置是独立的它们之间不存在“共享接口命名”的情况。所以当你看到“eth0 eth1 同一IP段”的配置表第一反应是“这是在一台设备上给两个网卡配了IP且这两个IP在同一个网段。”2. 看“住址”IP 网段eth0201.66.37.1/24→ 在201.66.37.0小区eth1201.66.37.2/24→ 也在201.66.37.0小区结论一台设备主机的两个“门”接口开在了同一个“小区”子网里。或者说:两者网络地址完全相同说明它们属于同一个广播域网段二、为什么说这是“特例”这里容易绕晕我们区分一下“物理连接”和“路由逻辑”。正常情况不允许在大多数路由协议如 OSPF、RIP看来同一台设备的两个接口如果在同一网段设备会“精神分裂”它发个数据包不知道该从eth0出去还是eth1出去因为都在一个网段路由表里这两条路优先级一样。这会导致路由环路或逻辑混乱所以通常被禁止。特例情况允许但需支持目的为了实现负载均衡让流量分摊走两条线。虽然物理上两个口在同一个网段但通过特殊的路由协议或配置如 ECMP 等价多路径强行告诉设备“这两条路都可以走你轮着用。”“必须有路由协议的支持”​ 这句话的意思就是普通家用路由器干不了这事得用能跑高级路由协议如 OSPF、BGP的专业设备来“兜底”这个逻辑。3.11 总路由表示例此时主机的总路由表包含以下11个表项表8-10 总路由表目的网络子网掩码网关标志接口127.0.0.0255.0.0.0127.0.0.1Ulo0201.66.37.0255.255.255.0201.66.37.74Ueth0201.66.39.0255.255.255.0201.66.39.21Ueth1Default0.0.0.0201.66.39.254eth173.0.0.0255.0.0.0201.66.37.254UGeth091.32.74.21255.255.255.0201.66.37.254UGHeth01.2.3.4255.255.255.255201.66.37.253UGHeth01.2.3.0255.255.255.0201.66.37.254UGeth01.2.0.0255.255.0.0201.66.39.253UGeth0213.79.0.0255.255.0.0201.66.37.254UGeth0213.79.61.0255.255.255.0201.66.39.254UGeth13.12 另一种路由表示例Windows风格不同的路由器使用的路由表可能有一些差异。例如路由表的接口表项会关联接口的IP地址而不使用eth0、eth1这样的标识。有时各表项的排列顺序也不尽相同。表8-11 Active Routes活动路由表Network DestinationNetmaskGatewayInterfaceMetric0.0.0.00.0.0.0192.168.123.254192.168.123.881127.0.0.0255.0.0.0127.0.0.1127.0.0.11192.168.123.0255.255.255.0192.168.123.68192.168.123.681192.168.123.0255.255.255.0192.168.123.88192.168.123.881192.168.123.88255.255.255.255127.0.0.1127.0.0.11192.168.123.255255.255.255.255192.168.123.68192.168.123.681192.168.123.255255.255.255.255192.168.123.88192.168.123.881224.0.0.0224.0.0.0192.168.123.88192.168.123.881255.255.255.255255.255.255.255192.168.123.88192.168.123.881表8-11解析字段含义Network Destination网络目的地址Netmask子网掩码Gateway下一跳路由器的入口IP地址,也称网关Interface到达该目的地的本地路由器的出口IP地址Metric跳数越小越优先 这里的Interface和Gateway是同一网段的路由器通过Interface和Gateway定义了到达下一个路由器的链路。特殊路由项说明在表8-11中有几个值得注意的特殊项包含网络地址224.0.0.0的两项表示对组播的处理路由组播是将数据包发送给一组特定主机的通信方式适用于视频会议、在线直播等应用。它与单播一对一和广播一对所有不同仅对加入特定组播组的主机进行传输从而节省网络带宽。路由表中的组播项如224.0.0.0相关项用于指导路由器如何转发组播数据包。主机有两个接口IP地址分别为192.168.123.88和192.168.123.68且处在同一个网段192.168.123.0中用于实现网络负载均衡255.255.255.255表示有限广播地址的路由四、route命令route命令主要用于手动配置和显示静态路由表。路由表可以由用户手动执行route命令来配置也可以通过rc脚本在启动时执行也可以由路由器使用其支持的路由协议提供的功能根据网络拓扑结构的变化自动生成。4.1 显示路由表信息route print执行后可以显示本机的路由表信息。输出字段含义字段含义网络目的地址主机路由的网络ID或网络地址子网掩码4字节32位的二进制数用十进制表示掩码位为1对应IP地址的网络部分为0对应主机部分网关主机或路由器直接连接的网络转发地址可能是连接到网络的接口地址接口将数据包转发到网络ID时所使用的网络接口地址跳数路由首选项的度量值跳数最小的路由是首选路由4.2 常用route命令示例操作场景命令显示特定开头的路由route print 192.*添加路由route add 10.41.0.0 mask 255.255.0.0 10.27.0.1删除指定路由route delete 127.0.0.0