网络层核心机制详解:IP编址、子网划分、ARP与ICMP实战笔记
发布时间:2026/10/9 15:59:40 锦皓数字建站

计网系列笔记写到第四章我明显感觉知识点开始“发硬”了。前面几章从物理层到数据链路层事情相对单纯比特怎么编码、帧怎么打包、MAC怎么寻址。到了网络层画风大变因为要解决的是互联网真正的核心问题——数据怎么从一个主机跨越一大堆异构网络最终到达另一个主机。作为一个半路出家的DevOps我啃这一章属于被实际工作逼的排查一次莫名其妙的丢包不懂网络层真的是两眼一抹黑。这篇“第四章笔记一”我整理了网络层的开场内容包含IP编址、子网划分、数据报格式、ARP和ICMP目标是一边记知识点一边把刷题踩过的坑写清楚。如果你也在备考408、期末复习或者纯粹想弄懂线上网络问题这篇应该能省不少力气。1. 开工之前先搞清楚网络层在解决什么1.1 从端到端到逐跳转发网络层的视角变了数据链路层的视野是一跳。两台设备直接连在一条链路或者同一个交换网络里靠MAC地址就能把帧送过去。但真实网络不是这样从北京的服务器到上海的用户中间可能有几十台路由器、跨越不同运营商的自治系统。数据链路层那一套没法处理这种“长途旅行”因为MAC地址只在局部有意义出了局域网就不认了。网络层把视角抬高它关心的是源IP到目的IP这条完整的路径。但网络层又很务实它不负责亲自把数据“扛”过去而是把每个数据报交给下一跳设备让路由器们接力转发。这就像寄快递你不需要自己跑一趟只需要把包裹交给本地网点网点看目的地决定下一站发给谁。核心是两个动作一个是“选路”也就是路由协议算出来从A到B走哪条路一个是“转发”也就是路由器收到一个包之后查表决定从哪个接口丢出去。1.2 不同教材第四章的差别备考别搞混很多同学会问谢希仁老师的书和自顶向下那本第四章内容怎么对不上我两本都翻过谢老教材的第四章是网络层自顶向下教材的第四章也是网络层但侧重点有差别。谢老体系传统先讲虚电路和数据报服务模型再讲IP地址、ARP、ICMP、路由协议自顶向下更强调“数据平面”和“控制平面”把转发和路由拆得很开。考408和期末用的侧重点也不一样。408大纲重点在IP地址、子网划分、路由协议、分组转发算法。期末复习则要看老师划的范围。我自己的做法是以学校讲义为主线用王道或谢老教材佐证细节。这篇笔记按常见教材顺序来写适合大多数人。2. 网络层两大核心服务用“包裹驿站”模型记住2.1 先分清“数据报服务”和“虚电路服务”网络层向上层提供服务主流是数据报服务也就是无连接、不可靠的交付。每个IP数据报独立路由中间路由器只负责转发不管这个包和上一个包有没有联系。这和邮政平邮很像每个包裹单独运输可能走不同的路线也可能丢件后续保不保底是上层的事。虚电路服务则是面向连接的通信前要先建立一条虚电路后续所有数据都沿这条路径走路由器需要维护每一条连接的状态。这类似于打电话先拨号建立线路然后双方持续通话挂断后释放资源。这种模式在某些内部网络里用但互联网的IP网络基本不用因为互联网规模太大给每一对通信方维护连接状态不现实。这个选择题常考记住IP是数据报服务不可靠无连接。2.2 转发和路由不是一回事但经常被混着说转发是路由器收到包后根据目的IP和路由表查下一跳然后从对应接口送出。动作发生在“当下”粒度是单个报文。路由是构建路由表的过程由路由协议周期运行把全网或AS内部的路径信息算清楚。这两个概念在自顶向下面向下体系里被分成了数据平面和控制平面408偶尔也直接考。我调试网络时接触到的实际对应关系是这样路由表类似地图导航数据的“底图”转发引擎类似开车时每个路口的转弯决策。底图更新频率低但每个路口的决策很紧急查表必须足够快所以路由器硬件转发一般靠TCAM这类硬件表而不是软件路由进程一个个比对。这也是为什么企业级路由器能跑几十G流量而普通PC做软路由容易CPU爆掉。3. IPv4地址网络层笔记的重头戏3.1 为什么要有IP地址全局唯一的“收件人标识”MAC地址是出厂烧录的类似人的身份证号IP地址是网络层赋予的类似当前居住地的门牌号。门牌号必须按区域规划前缀代表你所在的街道、城市后缀代表具体哪一户。IP地址也一样高位比特是网络号低位比特是主机号。这样路由器只需要看网络号就能决定把数据往哪个方向送不需要认识每一台主机。如果不做这种分层路由器就要维护全互联网所有主机的地址条目几百万甚至几十亿条根本查不过来。所以IP地址的核心设计思想是两级层次结构后来子网划分变成三级结构CIDR又变回可变的网络前缀。3.2 分类编址的ABC类为什么后来被淘汰早期IP地址分A/B/C/D/E五类。A类网络号8位前导0主机号24位最大可以容纳约1677万台主机但一个A类网络太大了几乎没法用。B类网络号16位前导10主机16位最多6万多台也容易浪费。C类网络号24位前导110主机8位只能放254台主机对于一个大办公室不够用。淘汰分类编址的根本原因是“粒度太差”。拿B类地址来说一家公司申请了一个B类哪怕只有5000台主机剩下的几万个地址也白白占着而C类又太小不够用。分类编址还有一个缺点不能用大小不等的地址块灵活组合。于是后来出现了子网划分和CIDR。3.3 子网划分手算套路三步拿捏掩码和主机范围子网划分本质是从主机号里借出高位比特当子网号。借几位就能得到2的x次方个子网每个子网的主机数则减少。期末和408很喜欢给一个网络让算子网掩码和可用地址范围。手算建议三步走。第一步确定需求。比如一个C类地址192.168.1.0/24要划分成4个子网每个子网至少能放50台主机。4个子网需要借2位因为2的2次方等于4至少50台主机意味着主机位保留6位因为2的6次方减2等于62够用。所以子网掩码在24位基础上加2位变成26位也就是255.255.255.192。第二步算子网步长。256减去掩码最后一个非零字节的值256-19264。所以每个子网的地址块大小是64子网地址依次是192.168.1.0、192.168.1.64、192.168.1.128、192.168.1.192。第三步算可用主机。每个子网去掉网络地址和广播地址可用主机范围分别是1到62、65到126、129到190、193到254。这个结果要熟考试时可以直接口算。常见坑是借位后主机位全是0的地址是子网网络地址主机位全是1的地址是定向广播地址都不能分配给设备。3.4 CIDR把路由聚合这件事想明白CIDR无类域间路由打破了ABC类地址的固定分类用“IP地址前缀长度”来表示一个地址块比如10.0.0.0/8。核心魅力在于路由聚合也就是把连续的一组地址收敛成一条路由缩小路由表。我印象最深的是计算“路由聚合”时最容易漏的是把二进制对齐后取相同前缀。比如202.113.79.32/28和202.113.79.48/28这两个网络能不能聚合成202.113.79.32/27先算一下79.32的二进制是01011111.0010000079.48的二进制是00110000可以看到32和48在前4位都是0010但32是0010 000048是0011 0000第5位不同因此共同前缀是前27位因为网络地址的高3字节加第4字节的前3位32二进制为00100000前3位00148为00110000前3位也是001第四位不同所以可以聚合成202.113.79.32/27。这里要注意只有两个网络的前缀一位不差才可能聚合为/27如果两个网络离得远强行聚合会把不存在的网络也包含进来路由就会出错。3.5 NAT和私网地址IPv4不够用催生的土办法私网地址有三个段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。公网IPv4不够用内网设备用私网地址出口路由NAT网络地址转换把私网源地址翻译成公网地址。家用路由器现在默认开NAT你只需要知道WAN口是运营商分配的公网IPLAN口下设备是192.168.x.x私网地址。我排查过一个真实问题内网某台服务器主动访问外网失败抓包发现源地址是192.168.1.100路由表也有默认路由但出口路由器NAT的ACL没放通这个私网段。这说明网络层协议栈正常归正常实际生产环境还得看NAT、路由策略、安全策略联动。DevOps同学不要只看ping通不通要理解NAT背后的会话表很多连接问题卡在NAT地址池耗尽或者端口限制上。4. IPv4数据报格式关键字段一个都不能错4.1 20字节固定头部记结构不如记字段含义IPv4报文头部一般为20字节按4字节对齐。版本字段4位默认是4首部长度字段4位以4字节为单位所以值为5时表示20字节如果报头有选项值会变大。区分服务字段8位一般写着TOS实际上现在更多用于DSCPQoS会用到总长度字段16位指的是整个IP报文头部数据的总字节数最大值65535。紧接着是标识、标志、片偏移这三个字段和分片有关。然后是TTL、协议、首部校验和最后是源IP和目的IP各32位。协议字段很重要它告诉IP层“这个数据报里面装的是什么”。ICMP的值是1TCP的值是6UDP的值是17。这个数字经常出现在抓包和路由配置里比如ACL规则有时候会写protocol 17对应UDP。我的记忆方法是按顺序背1是ICMP2是IGMP6是TCP17是UDP。实际上还有89是OSPF有很多协议号但考试和日常工作最常用的是这几个。4.2 TTL与首部校验和数据报的“保质期”和“防碎盾”TTL生存时间字段8位初始值由发送方设置常见系统默认64或128。每经过一个路由器TTL减1减到0就丢弃并向源主机发送ICMP超时报告。这个机制防止数据包在网络里无限循环。我做过一个验证ping一个不可达的地址tracert能看到路径就是因为TTL从1递增让每跳路由器丢包回ICMP超时消息从而反推路径。首部校验和16位只校验IP头部不校验数据部分。因为每次转发TTL都会变所以每个路由器必须重新计算校验和。计算原理是把头部按16位一组做反码求和再取反。这个细节在王道题里经常出现但真正手工算的比较少重点是知道它只覆盖头部而且是一种弱校验不适合数据完整性要求高的场景。像UDP的数据校验或TCP的校验则覆盖更多内容反而更可靠一些。4.3 分片与MTU链路层扛不动时怎么办不同的链路层协议对帧大小有限制这个上限叫MTU常见以太网MTU是1500字节。如果一个IP数据报总长超过MTU路由器就必须分片。分片依据是标识字段同一个数据报的所有分片用相同ID标志字段里DF位禁止分片MF位表示“后面还有分片”片偏移字段表示该分片数据部分在原始数据报中的偏移位置单位是8字节。这里有个经典易错点分片的长度必须是8的整数倍除了最后一片。比如原始数据报4000字节MTU1500那么可以分成3个片段第一个片段承载1480字节数据因为IP头20字节 数据1480 1500第二个也是1480字节第三个承载剩余4000-1480-14801040字节。计算偏移时第一个片偏移0第二个片偏移1851480/8第三个片偏移3702960/8。考试总喜欢问第二个片的偏移如果写1480就错了因为偏移单位是8字节必须除以8。5. ARP协议IP地址和MAC地址之间的翻译官5.1 ARP解决的是“知道对方IP但不知道对方MAC”的问题在以太网环境里数据链路层最终靠MAC地址交付。所以发送IP数据报之前源主机必须知道下一跳的MAC地址。如果目的主机在同一子网下一跳就是目的主机如果不在同一子网下一跳就是默认网关的MAC。ARP地址解析协议就是用来获取这个MAC地址的。需要特别注意的是ARP不是网络层的工作原理它本身是介于网络层和数据链路层之间的协议但计网课程通常放在网络层讲。当你访问一个域名时DNS先把域名解析成IP然后IP层要发送数据如果ARP缓存里没有对应关系ARP就开始工作了。所以排查连通性的完整链条是DNS解析、IP连通性、TCP握手、HTTP请求。5.2 ARP请求广播ARP应答单播一次记牢ARP工作流程很简洁源主机在本地网段广播一个ARP请求报文内容大概是“谁的IP是192.168.1.1请把你的MAC地址告诉我”。因为广播同网段所有主机都能收到。只有IP地址匹配的目标主机才会回应ARP应答并且是单播回复“我是192.168.1.1我的MAC是xx:xx:xx:xx:xx”。源主机收到后把这对IP-MAC映射写入ARP缓存并根据缓存内容封装数据帧。这个广播请求和单播响应的组合很多人背了又忘。我的记忆法是广播是“全世界找人”的寻人启事单播是“收到回复后只告诉发问者”的私人回信。如果所有人用广播回复那网段里到处是ARP广播性能会极其难看。5.3 常见坑ARP缓存超时、ARP欺骗、代理ARPARP缓存不是永久的。Windows和Linux的缓存有超时时间Linux默认对新鲜条目可能是30秒左右超时后要重新解析。所以你在终端里频繁看到“ARP: 邻居表溢出”或者解析慢可以通过arp -d或者ip neigh flush清理缓存排查问题。生产网络里还要警惕ARP欺骗。攻击者伪造ARP应答把自己伪装成网关导致流量被中间人截获。所以现在很多交换机支持动态ARP检测DAI或者配置端口安全。我记得在VMware虚拟机里遇到过一个问题虚拟网卡的MAC地址频繁变化导致ARP表冲突表现就是时不时的“网络通一下断一下”。最后把虚拟机网卡的“MAC地址生成策略”改成固定问题才稳定。这正好印证了ARP缓存一致性对网络稳定性的影响。还有一个概念是代理ARP。路由器开启代理ARP后当收到一个广播ARP请求若是请求不在自身接口网段但路由可达的目标IP路由器会代答把自己的MAC地址返回。这在某些分割子网的场景下能让主机不需要配置网关也能通信。但代理ARP会增加复杂度容易被误判我在实际排查中只在特殊老设备上见过不值得主动用。6. ICMP与网络排错让ping和tracert不再玄学6.1 ICMP是计算机网络里的“信使”ICMP互联网控制消息协议用于传递差错报告和控制信息比如目标不可达、超时、参数问题、源抑制等。ICMP报文封装在IP数据报里传输类型字段不同含义不同。常见的有类型0是回送应答类型8是回送请求类型3是目的不可达类型11是超时。这里我不建议死记所有类型但常用的要脱口而出。ping命令发的是ICMP回送请求能通说明达到了目标主机的协议栈并返回回送应答目标不可达最经典的是“Destination Host Unreachable”和超时“Request timed out”是不同的概念。前者说明路由找到了但ARPER发现主机不在线后者往往是中间丢弃或防火墙过滤很多新人一看到超时就以为网络断了其实可能是对端禁ping。6.2 用ping和tracert定位网络问题的具体姿势我在排查线上抖动时会优先做四件事。第一ping网关验证本机到网关链路通不通第二ping公网IP比如8.8.8.8验证NAT和出口路由第三ping域名验证DNS解析和域名可达性第四持续ping并记录时间延迟判断是否丢包。如果网关通、公网IP通、域名不通多半是DNS问题。tracert利用TTL逐跳增加来打印路径。在Windows里命令是tracertLinux是traceroute -I或者traceroute采用UDP包。输出里经常看到某些跳显示“* * *”不一定是网络断了可能是那台路由器出于安全考虑禁用了ICMP超时报文或者路径上有负载均衡设备不一定每个包都返回超时。所以如果tracert中间只有零星星号而最后能到达目标通常不要急着下结论如果连续几跳全部超时且无法到达那才有可能断点。6.3 抓包验证用Wireshark看ICMP和ARP的完整对话纸上谈兵不如抓包。我建议搭一个最小实验环境一台电脑用Wireshark抓无线网卡的数据然后ping网关。过滤条件写icmp或arp。你会看到完整的流程如果缓存中没有网关MAC会先出现ARP请求广播收到ARP应答后才会出现ICMP回送请求包再出现ICMP回送应答包。这个顺序能很直观地把ARP和ICMP串起来比背十遍都有用。抓包还能验证分片。构造一个大的ping包比如Linux下ping -s 2000同时抓包会发现IP层被拆成两个包每个分片的标识一样标志位不同片偏移正确。如果你在云主机上ping不同MTU的网络会发现某些包被丢弃或需要调整MTU这就是为什么有些公司会建议把云主机内网MTU调成1400或更小。7. 高频易错点与备考速查7.1 这些概念经常被拿来出混淆题我把常见易错点整理成了一张自检测表。第一IP协议是“无连接、不可靠”但TCP是“面向连接、可靠”两者不矛盾IP只管发给下一跳TCP保证最终数据完整。第二ARP解析的是IP到MAC但ARP请求的目标地址是FF:FF:FF:FF:FF:FF这个广播地址是MAC层的广播不是IP层的广播255.255.255.255。第三子网掩码和CIDR前缀长度是同一个信息的不同写法/24就等于255.255.255.0转换要熟练。第四TTL每跳减1不是每秒减1初始值由系统决定最大255。7.2 刷题和复习时的实际建议我复习第四章一时踩过一个坑光看教材以为自己懂了一做题就废。原因是网络层的概念太容易割裂子网划分、路由聚合、ARP流程必须配合题目才能形成肌肉记忆。我的建议是每看完一个小节立刻做对应的选择题和计算题。比如看完子网划分至少要手动算5个不同场景定长子网、变长子网、划分后每个子网可用地址数、是否满足主机数要求。看完CIDR至少要练2到3个路由聚合计算。看完数据报格式至少用Wireshark拆一个真实包把头部字段逐一对照。如果你在准备408可以找王道书对应章节的课后题期末复习的话重点看老师课件里标注过的例题。不要一上来就背RFC文档计网的学习路径永远是“概念-抓包-做题”三层缺一层都不扎实。7.3 我从“记不住”到“能干活”的三个转变第一个转变是理解了“掩码到底在掩什么”。以前只知道255.255.255.0不知道为什么这么写。后来把IP和掩码都转成二进制才真正明白它是用来划分网络号和主机号的边界借位和聚合也从此顺理成章。第二个转变是从“会拼命令”到“能读输出”。比如ifconfig/ip addr里出现/24和/16我能直接判断网段大小route -n输出里看到的Destination、Genmask、Iface终于和路由表字段对上了。第三个转变是接受“网络问题不一定在网络层”。ICMP超时可能是防火墙策略TCP连接失败可能是NAT会话老化甚至可能是MTU过大导致黑洞。第四章只是打开了网络层的大门后面还有路由协议、IPv6、SDN路还长。这篇笔记写到这里我自己的收货其实比整理笔记前更清晰网络层不是一堆独立协议的堆砌而是一整套“找地址、算路径、保投递”的协作流程。下次再遇到网络不通不妨先按这个顺序过一遍ARP能不能解析到下一跳、路由表有没有去程条目、NAT策略放没放行、ICMP回包被没被拦截。把这几个问题过完大部分猜测就能变成精准定位。希望这套第四章一的整理对你也有同样的提效作用。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。