十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

网络层核心机制全解析:IP寻址、路由转发与排障实战

网络层核心机制全解析:IP寻址、路由转发与排障实战 1. 网络层到底在解决什么问题1. 网络层到底在解决什么问题1.1 网络层与前后层的边界感很多刚开始学网络的朋友最容易卡住的一个问题就是数据链路层和网络层之间的边界到底划在哪里。我在带新人时常用一个类比——数据链路层解决的是同一间教室里两个人怎么传纸条网络层解决的是这间教室的纸条怎么通过走廊、楼梯、门卫送到整栋楼甚至街对面另一栋楼的某个座位上。也就是说数据链路层用MAC地址在同一个广播域里找设备它不知道教室外面还有多少间教室也不关心你最终要去哪栋楼。而网络层面对的是互联网这个极度复杂的拓扑它必须先回答三个基础问题我在哪我的IP是多少目标在哪目标IP是多少路怎么走下一跳给谁。这三个问题就是网络层的灵魂也是整个互联网通信的底层逻辑。顺着这个理解往下走你会明白为什么网络层报文里要带着源IP和目标IP为什么路由器只看IP地址不看MAC地址为什么数据链路层的帧在每一跳都会被重新封装。理解了边界后续看路由协议、看抓包、看排障都不会再觉得是一团乱麻。1.2 为什么说网络层是整个网络的路由大脑如果让我用一句话总结网络层的地位我会说传输层负责把数据正确交给应用网络层负责把数据从A点送到B点而链路层只负责每一跳的搬运。少了传输层程序之间没法沟通少了链路层数据根本没法上线路但真正决定走哪条路的永远是网络层。大学课本和很多教程里都把网络层描述成核心中的核心以前我觉得这是套话踩过不少坑之后才认可网络层才是网络通信的主干。传输层再好的可靠性机制如果网络层把数据包送到错误的方向一切白搭。实际工作中你遇到的大多数网络故障延迟高、丢包、路由环路、无法上网根因汇集到网络层就会变得异常清晰。这个章节是全系列中份量最重的一部分我会从IP协议讲起把子网规划、路由协议、转发原理、NAT、ARP、ICMP这些网络层的核心组件串起来最后落到真实的排障命令和思路。文章会偏向工程实际同时尽量把原理讲透适合正在系统学习网络基础知识的读者也适合做开发、运维的朋友回头补课。2. IP协议核心机制地址、子网与报文结构2.1 IPv4地址怎么划分又该怎么规划IPv4地址是32位二进制数习惯上写成点分十进制比如192.168.1.10。这32位被分成网络部分和主机部分具体分界线由子网掩码决定。很多人会把子网掩码理解成255.255.255.0这种样子这个没错但建议从二进制去理解掩码里连续的1表示网络位剩余的0表示主机位。举个例子192.168.1.10/24意味着前24位是网络部分后8位是主机部分。这个网段里可用的主机地址从192.168.1.1到192.168.1.254因为是8位主机位去掉全0网络地址和全1广播地址一共254个可用地址。为什么要单独强调这两个地址因为很多网络故障就是有人把设备配成了网络地址或广播地址造成地址冲突或通信异常。实际规划子网时我习惯用几个简单标准来校准先明确一个网段里未来预计有多少设备再往上取一段余量不要贪大。按业务功能隔离网段比如办公网、服务器网、IoT设备网分开哪怕初期设备少也要预规划。对于路由汇总友好的地址段建议按连续的块去分配不要东一块西一块。这里顺便说明一下技术文档里常看到公网地址和私网地址的区分。私网地址段是RFC 1918规定的10.0.0.0/8、172.16.0.0/12、192.168.0.0/16这些地址只能在内部网络中使用公网路由不会转发它们。内网设备要上网就得靠NAT网络地址转换这部分后面会有专门机制说明。如果网络规模不大、不需要对外提供服务器私网IP是完全够用的。2.2 IPv4报文头里哪些字段值得记牢网络层要工作靠的是IP报文头里的各种字段。IPv4报文头虽然看上去字符很多但真正在排查和设计时常打交道的其实就那么几个。版本号Version和头部长度IHL是基础前者表示IPv4/IPv6后者表示头部有多少个32位字。总长度Total Length字段表示整个IP报文长度单位是字节最大65535字节但受链路层MTU限制实际IP报文很少能达到这个上限。标识Identification、标志Flags和片偏移Fragment Offset三个字段配合完成分片重组涉及UDP和TCP大包传输时经常排查到这里。TTLTime To Live是很多人忽略但非常重要的字段每经过一个路由器就减1减到0直接丢弃这是防止路由环路导致报文无限转发的最基础手段。协议号Protocol告诉接收方上层是TCP6、UDP17还是ICMP1等。头部校验和Header Checksum负责检查报文头在传输过程中是否损坏注意它只校验头部不校验数据部分。我记得有次排查一个周期性丢包问题抓包发现IP报文没有异常但转发的设备CPU偶尔飙升导致转发延迟。后来定位到是该设备开启了不必要的策略路由每条报文都去匹配复杂规则。那件事之后我形成了一个习惯每次抓包先看TTL变化、标识字段有没有异常再结合上层协议定位这样能少走很多弯路。这里送大家一个实用经验不要死记校验和的算法但一定要知道网络层不保证可靠传输校验由上层协议完成这件事。IP层发现校验和错误只会丢弃报文不重传真正干重活的是TCP的序列号、确认号和重传机制。2.3 看懂IPv6的关键改进IPv6最显性的变化是地址长度从32位变成128位和IPv4完全不在一个量级。正因为地址空间足够大IPv6的设计哲学和IPv4有明显差异IPv4时代为了节省地址想尽了办法NAT、CIDR、DHCPIPv6则让每个接口都可以有全球唯一地址理论上不再需要NAT来节约地址。但实际部署IPv6时很多人的第一个障碍是地址格式。比如2001:db8:85a3::8a2e:370:7334中间的双冒号表示连续的一段0被压缩但一个地址里只能用一次双冒号。如果从运维角度出发我更建议大家优先掌握IPv6地址的三种类型链路本地地址以fe80::开头用于同一链路内的通信比如路由器自动发现、邻居发现协议。唯一本地地址类似IPv4的私网地址以fc00::/7开头适合内网测试和设备间通信。全局单播地址类似IPv4公网地址可路由到公网。目前国内网络环境还是IPv4为主、IPv6逐步接入的状态。很多设备本身支持IPv6但内网的路由器没有开启IPv6功能或者ISP没有分配前缀导致用户感觉不到IPv6的存在。作为学习重点是理解IPv6取消了广播、加入了邻居发现协议NDP、报文头结构更精简这些思想会影响后续对网络行为和安全的判断。3. 路由与转发让数据包找到正确的路3.1 静态路由和动态路由怎么选网络层的路由就是决定数据包下一跳怎么走。路由表是核心数据表里记录的是去往哪个网段该发给哪个下一跳地址或者从哪个接口出去。路由来源可以很粗地分为两类手工配置的静态路由以及路由协议动态计算出来的动态路由。静态路由的优点是稳定、可控、开销小缺点是网络拓扑一变就得手工去改特别不适合大型或经常变化的网络。小型企业、家庭网络、实验室环境静态路由完全够用而且排障思路非常直接。动态路由协议则负责在路由器之间自动交换网络信息根据某些度量值计算出最优路径当链路故障时聚合收敛快适合中大型网络。动态路由协议里最常见的两个阵营距离矢量协议代表是RIP它只告诉邻居我到某个网段有多远然后逐跳传递。实现简单但收敛慢、容易产生环路现代大型网络很少直接用它更多作为学习经典。链路状态协议代表是OSPF和IS-IS每台路由器都掌握整个区域内的拓扑用SPF算法计算最短路径树。收敛快、扩展性好是目前园区网、数据中心网络的主流。选型建议很简单网络只有两条路、变更不频繁就静态路由网络超过三层、冗余链路较多、需要自动收敛就上OSPF。不要上来就迷恋动态路由好像不用OSPF就不够专业实际很多故障都是动态路由没配好引起的。3.2 OSPF的运作思想与基础配置OSPF为什么能成为应用最广泛的内部网关协议IGP因为它把大网络划分成区域Area骨干区域Area 0负责连接其他区域区域内路由器维护一致的链路状态数据库计算路径时用的是Dijkstra算法也叫SPF算法。避免了RIP逐跳信谣传谣的缺陷每条路由的可靠性都高得多。结合我自己的项目经验第一次配置OSPF时最容易被三个概念绊住Router ID无论设备上配了几个IP整个OSPF进程需要选出一个唯一的Router ID。习惯上建议手动指定不推荐交给设备自动选举避免不稳定。网络类型与DR/BDR在一个多路访问网络比如以太网上接多台路由器中OSPF会选举指定路由器DR和备份指定路由器BDR用来减少邻居之间建立全互联的邻接关系数量。如果把所有路由器都配成优先级相同且没有DR广播风暴和数据库同步开销会非常大。区域设计所有非骨干区域必须直接连接Area 0否则路由会在区域边界外泄漏或被过滤导致路由不通。一个最小可用的OSPF配置思路如下华为设备命令风格大家可以根据厂商调整# 路由器A ospf 1 router-id 1.1.1.1 area 0 network 10.0.0.0 0.0.0.255 # 路由器B ospf 1 router-id 2.2.2.2 area 0 network 10.0.1.0 0.0.0.255 network 192.168.1.0 0.0.0.255这里用的是通配符掩码wildcard mask意思是只匹配前24位和反掩码的写法一个道理。配置完成后在路由器上用display ospf peer能看到邻居状态变成Full再用display ip routing-table看OSPF路由有没有出现。学习OSPF我最推荐的方法是先配两台设备抓包看Hello报文、DD报文、LSR/LSU报文是怎么发的看完一遍就通了。3.3 转发机制中容易被忽略的细节路由表和转发表不是同一个东西。路由表是控制平面的产物是路由器根据静态配置或路由协议计算出来的真正处理数据包时硬件转发芯片用的是转发表FIB是路由表优先生成的。所以不要以为修改了路由表立刻就会生效有些设备需要几秒的刷新时间。转发模式主要有两种进程转发软件转发报文到达后交给CPU处理路由器CPU决定下一跳再发出。这种方式灵活但吞吐量低适合控制面流量或低速率环境。硬件转发如ASIC转发大多数中高端路由器、交换机都采用这种方式报文直接被芯片查表转发不打扰CPU。吞吐量很高但一旦出现路由黑洞或负载不均排查起来也更难因为芯片的行为不像CPU那样容易Debug。还有一个细节是等价多路径ECMP。在动态路由协议中如果存在多个代价相同的下一跳路由器可以把流量负载分担到多条链路上。这个机制在数据中心用得特别多但如果数据流的哈希算法配置不好会有一部分大的TCP流全部挤到同一链路上另一条链路却闲着。遇到这种问题建议先看设备支持的哈希因子比如基于五元组、基于源目IP再做调整。4. 网络层配套的核心协议ARP、ICMP与NAT4.1 ARPIP地址与MAC地址之间的翻译官网络层解决了逻辑寻址的问题但数据在链路上传输时帧头里装的是MAC地址。IP地址和MAC地址怎么对应起来答案是ARP地址解析协议。可以把它理解成在局域网里喊了一嗓子谁是192.168.1.1请告诉我你的MAC地址被问到的设备单播回复然后发起方把映射放到ARP缓存里后续同网段通信就直接用了。它原理简单但应用时坑不少。第一个坑是ARP缓存超时。如果设备频繁离开网络缓存里的老条目可能短暂指向一个不存在的接口造成丢包。解决办法不是手动清缓存而是合理规划网络里的设备尤其是无线终端频繁漫游的场景。第二个坑是ARP欺骗/攻击。攻击者可以伪造IP与MAC的映射关系把流量引到错误设备上。这个问题在安全视角里是重点但从网络层机制的角度我们要理解它为什么能成功因为ARP协议本身没有认证任何人收到请求都可以回应。防御上常见思路是在交换机上配置DAIDynamic ARP Inspection或静态ARP表。第三个坑是跨网段通信时ARP只会请求目标IP的网关MAC不会直接请求目标服务器的MAC。很多人把ping不通目标主机误判断为ARP请求不到目标主机其实是网关没有转发回来。排查ARP问题Windows用arp -aLinux用ip neigh华为设备用display arp看缓存里有没有对应条目、状态是否正常是最快捷的起点。4.2 ICMP网络排障的第一工具ICMPInternet控制报文协议是IP协议的配套协议主要用来传递差错信息和网络探测数据。最常用的两个工具ping和traceroute底层都是用ICMP实现的。ping发送的是ICMP Echo Request报文目标主机收到后回复ICMP Echo Reply。一个ping通说明网络层可达但注意它只说明部分路径没问题不代表应用层就正常。我见过太多人把能ping通等同于服务没问题实际上服务端口可能早已挂掉。正确的做法是ping通说明网络通但服务健康要用端口探测或者应用探测。traceroute的原理更有意思。它发送一系列目标地址相同但TTL递增的数据包第一个包TTL1第一跳路由器收到后TTL减为0便回一个ICMP Time Exceeded报文于是你知道了第一跳是谁第二个包TTL2到第二跳才会超时依此类推。通过这种方式你能看到数据包经过的每个路由器IP以及对每跳的往返延迟。在实际定位延迟问题时traceroute比ping更有价值因为它可以区分到底是中间哪一跳慢。以下几点需要注意中间路由器不响应ICMP超时报文不代表链路不通很多设备为了安全会禁用响应。某些路由器会修改TTL或做负载均衡导致路径出现不连续的结果不要一看到星号就慌。在运营商网络中部分设备对ICMP的优先级很低故意丢弃探测包所以丢包率偏高但业务流量正常需要结合业务质量综合判断。4.3 NAT一个解决地址短缺却带来麻烦的机制NAT网络地址转换把内网私网IP映射成公网IP让多个内部设备共享一个或多个公网地址访问互联网。它本质上是通过端口来区分同一个公网IP后面的不同内部主机这也就是为什么它常被叫PAT端口地址转换。从网络机制来看NAT属于网络层和设备行为但实际它跟传输层的端口耦合了。NAT给常规网络排障带来了一个重要影响很多协议在报文里嵌入了IP地址比如FTP的PORT模式、SIP的SDP信息NAT只改IP头地址不会自动去改载荷里的地址这样业务就可能不通。解决思路是使用ALG应用层网关或者NAT模式改为full-cone等模式让报文正常穿越。运维中有几个关于NAT的经验做NAT时一定要考虑会话表老化时间。UDP比TCP老化时间短很多如果应用层长时间不传数据NAT会话可能提前消失导致回来的包被丢弃。遇到间歇性收不到数据的问题先查会话表。如果业务容器或server需要对外提供服务不能随便做NAT。要通过端口映射DNAT把特定公网端口映射到内网服务器同时注意源地址转换时保留原始源IP否则服务器无法区分客户端来源。对于双出口电信联通的链路NAT策略要和路由策略配合好避免来回路径不一致否则防火墙会拦截返回流量出现能出去回不来的问题。我在项目里最容易踩的坑是配置了NAT后忘了考虑回程路由。内网设备访问出去没问题但服务器回包路由没走到NAT设备上导致连接建立不了。所以排障时先看NAT会话再看路由两者缺一不可。5. 实操起点从一台路由器开始搭建网络层环境5.1 硬件设备与模拟器的选择学网络层最怕的就是纸上谈兵。如果你手头没有实体设备强烈建议从模拟器开始。几种主流选择我简单做个对比eve-ng可以运行完整的思科、华为、H3C镜像功能最接近真实设备适合做复杂拓扑实验但对电脑配置有一定要求。GNS3老牌模拟器支持真实设备镜像也能连VM虚拟主机适合做集成测试不过配置相对复杂。华为eNSP华为官方出品的图形化模拟器启动简单、内含华为设备模拟对刚入门的朋友非常友好缺点是部分高级特性模拟不完全。如果只是摸基础免费的练习平台还有Cisco Packet Tracer它偏向教学不太适合跑复杂协议但上手最容易。以我的经验如果目标是理解网络层协议本身eNSP和GNS3二选一就够了如果还要练综合组网脚本和自动化建议用eve-ng挂真实镜像。不管选哪个动手配置是关键不要光看视频。5.2 最小实验拓扑三台设备打通静态路由我第一次练网络层搭的拓扑非常简单三台路由器和两台PC各路由器之间用网线连接PC接到路由器上。PC配成不同网段的IP路由器之间分别配成另一段IP然后写静态路由。比如拓扑如下PC1192.168.1.10/24网关192.168.1.1R1接口G0/0/0连PC1网段192.168.1.1/24接口G0/0/1连R2的192.168.12.1/30R2接口G0/0/0连R1的192.168.12.2/30接口G0/0/1连R3的192.168.23.1/30R3接口G0/0/0连R2的192.168.23.2/30接口G0/0/1连PC2网段192.168.3.1/24PC2192.168.3.10/24网关192.168.3.1目标是从PC1 ping通PC2。在这里PC1要到达192.168.3.0/24必须把包先发给网关R1R1查路由表发现目标不在直连网段需要转发给下一跳R2R2再转发给R3R3再从自己的接口转发给PC2。这个过程中每一跳路由器都在执行路由查找下一跳转发的核心动作。配置R1时的命令大概是ip route-static 192.168.3.0 255.255.255.0 192.168.12.2R2上需要两条静态路由一条去192.168.1.0/24下一跳是192.168.12.1一条去192.168.3.0/24下一跳是192.168.23.2。R3则去192.168.1.0/24下一跳是192.168.23.1。配置完别急先display ip routing-table看路由表是否正确再在PC1上用ping验证。如果ping不通逐层抓包先ping网关看链路通不通再ping R2看静态路由有没有指对最后ping PC2看末端直连有没有问题。这个逐跳定位的思路至今还是我排查网络首选的武器。5.3 在实验环境中手动触发一次分片很多人在学IP分片时觉得太抽象这里提供个实操方法。先在两台主机之间建立一条MTU较小的逻辑链路比如把路由器接口的MTU改成1400然后从PC1上ping一个ping包大小为1500字节的请求。当IP报文超过链路层允许的MTU值时IP层就得把报文切成多个分片。PC1发出的大包会被路由器R1分片每个分片都携带源IP、目标IP、标识字段、片偏移和MF标志。目标收到后根据标识和片偏移再重组。在抓包工具上你能看到多个相同IP标识的记录分片偏移分别是0、1480、2960等。通过这个实验你会直观理解分片重组机制和MTU不一致带来的问题。一旦网络里出现PMTU黑洞路径中的设备既不支持分片又不发ICMP错误就可以用这个思路去定位。6. 常见问题与排查技巧实录6.1 网络层排障三板斧rp、traceroute、抓包不管问题表象是网页打不开、视频卡顿还是业务超时我排障总是从网络层三件套开始。第一板斧是ping。注意ping的目标要先选网关再选远端用来分段判断是哪个方向断了。ping网关不通就是二层或本机配置问题ping远端不通开始怀疑三层路由、防火墙或有中间设备丢弃。第二板斧是traceroute。它把问题定位到某一跳非常高效。如果某一条链路一直出现星号且后续路径完全不通那大概率是这一跳丢弃了你的包如果中间有延迟飙升但后续恢复往往是链路拥塞或策略问题。第三板斧是抓包。这里我分两种场景设备上抓包比如华为的display ip packet和流量统计或者直接用Wireshark在PC上抓。抓包的目标是判断网络层报文到了没、从哪个接口进的、往哪个接口出的。很多时候奇怪的问题是防火墙策略、策略路由、ACL这类看不见的规则造成的抓包才是让它们现形的关键手段。6.2 几个高频网络层故障的定位思路故障一能ping通网关但ping不通外网。这种多半是出口NAT没建立或者缺默认路由。先看PC网关通不通再在出口路由器上看是否配置了默认路由和源NAT策略再确认外网线路是否正常。故障二不同VLAN之间无法互通。如果设备启用了三层交换检查VLANIF接口是否up、是否配置了正确的IP再检查这个网段对应的路由是否出现在路由表中。有时VLAN间路由依赖SVI接口但接口处于down状态路由表里自然没有直连路由。故障三周期性丢包。这个我遇到过不少次原因经常有两种。一种是接口CRC错误链路质量差或有干扰可以查物理接口的错包计数另一种是设备CPU过高导致软转发丢包比如遭受广播风暴或配置了过多QoS策略。这时要重点看设备的CPU利用率和丢包统计在哪一层发生别一头扎进应用层去找原因。故障四出现路由环路。现象是设备日志或抓包反复看到同一报文来回复制。经典原因是静态路由配了向下游设备的默认路由同时下游回指路由指回这台设备形成A到B再到A的死循环。TTL会防止无限循环但业务会超时。解决办法是检查所有设备的到目标网段路由找到环路的那条链路并修正。故障五分片重组导致UDP丢包。大型UDP报文在跨越不同MTU的路径时经常会遇到。如果应用对UDP大包敏感优先考虑调整应用层包大小或者确保链路MTU一致从根本上避免分片发生。6.3 网络层排障的一些实操心得做网络这么多年我最大的心得是不要一上来就怀疑复杂的路由协议问题先确认物理链路和配置对错。网络层排障表格化非常有效我给自己定了个基本排查范本现象第一步检查第二步检查第三步检查内网PC无法访问外网网关是否可ping通出口是否配置NAT和默认路由运营商线路状态跨网段无法互通网关是否可ping通路由表是否有目标网段条目交换机VLAN接口状态间歇性丢包接口CRC计数设备CPU/转发芯片丢包链路两端协商速率某业务无法访问能否ping通服务器IP端口是否正常监听防火墙/安全组策略这套思路帮我解决了很多让人头大的故障。网络层是排查问题的入口但有时候根因在链路层、传输层甚至应用层所以一定不要局限在某一层要一层层联动去看。最后分享一个小技巧在所有网络设备上养成记录关键路由条目和接口状态的习惯。现在再复杂的故障只要有一份准确的基线就不难找出异常点。在实际环境里我每排查一个问题都会顺手把抓包文件、路由表和接口状态存下来形成自己的排障弹药库。网络层的知识点多而杂但只要把IP寻址、路由转发和几个常用协议熟练掌握大部分故障都能快速定位方向剩下的就是耐心和经验积累。我个人体会是做网络最考验人的不是会背多少协议而是面对一个问题时能不能用清晰的逻辑一层层剥离到真正的根因再把解决方案落到配置上。这个能力没有捷径动手搭拓扑、抓包验证、犯错、复盘是唯一的路。
返回列表