☰
网络层核心机制详解:IP编址、子网划分、ARP与ICMP实战笔记
2026/10/9 15:59:29 网站建设 项目流程

计网系列笔记写到第四章,我明显感觉知识点开始“发硬”了。前面几章从物理层到数据链路层,事情相对单纯:比特怎么编码、帧怎么打包、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-192=64。所以每个子网的地址块大小是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.00100000,79.48的二进制是00110000,可以看到32和48在前4位都是0010,但32是0010 0000,48是0011 0000,第5位不同,因此共同前缀是前27位(因为网络地址的高3字节加第4字节的前3位:32二进制为00100000,前3位001,48为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口是运营商分配的公网IP,LAN口下设备是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,实际上现在更多用于DSCP,QoS会用到;总长度字段16位,指的是整个IP报文(头部+数据)的总字节数,最大值65535。紧接着是标识、标志、片偏移,这三个字段和分片有关。然后是TTL、协议、首部校验和,最后是源IP和目的IP各32位。

协议字段很重要,它告诉IP层“这个数据报里面装的是什么”。ICMP的值是1,TCP的值是6,UDP的值是17。这个数字经常出现在抓包和路由配置里,比如ACL规则有时候会写protocol 17对应UDP。我的记忆方法是按顺序背:1是ICMP,2是IGMP,6是TCP,17是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字节,MTU=1500,那么可以分成3个片段:第一个片段承载1480字节数据(因为IP头20字节 + 数据1480 = 1500),第二个也是1480字节,第三个承载剩余4000-1480-1480=1040字节。计算偏移时,第一个片偏移0,第二个片偏移185(1480/8),第三个片偏移370(2960/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欺骗、代理ARP

ARP缓存不是永久的。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里命令是tracert,Linux是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回包被没被拦截。把这几个问题过完,大部分猜测就能变成精准定位。希望这套第四章(一)的整理对你也有同样的提效作用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询