资讯动态

计算机网络网络层通关指南:IP协议、子网划分与ARP/ICMP核心解析

发布时间:2026/10/14 14:30:04 来源:尧图企业网站定制
如果你也在啃计算机网络大概率会被第四章劝退过。第四章网络层是整门课的分水岭前几章的数据链路层解决局域网内的问题到了网络层要面对的是“全世界不同网络之间如何互联”这个庞然大物。我也是在反复读教材、抓包、敲命令之后才把这层脉络捋顺。这篇笔记一先覆盖网络层的整体框架、IP协议、IP地址、子网划分、ARP和ICMP路由协议那些偏动态的内容留到下一篇再展开。适合正在备考期末、准备面试或者刚从链路层爬上来、对网络层一脸懵的同学。1. 第四章的地图先弄清网络层到底在忙什么1.1 网络层的两件大事选址和找路网络层夹在数据链路层和传输层之间位置很特殊。数据链路层只负责同一条链路上两个相邻节点之间的帧传递比如你的电脑通过网线连到交换机这一跳的交付归它管。但一台主机访问千里之外的服务器中间要跨几十个网络、几十个路由器谁能保证一个帧能从北京的交换机一路送到上海的路由器这就是网络层的事。拆开来看网络层要解决的核心问题就两个一是编址给每台设备一个能跨网络识别的逻辑地址也就是IP地址二是路由选择数据从源到目的到底走哪条路由路由器根据路由表决定。你可以把链路层想象成小区里的保安只管你把快递从家门口送到楼下网络层则是跨省物流调度中心要决定包裹如何从杭州分拣中心一路送到广州收货人手里。学习第四章最容易犯的错就是老想用链路层的思路去理解网络层。链路层关注的是“这一跳”网络层关注的是“端到端”。每一跳的封装、拆封都发生在这两层之间但IP层的源地址和目标地址在整个传输过程中基本不变MAC地址却每经过一个路由器就换一次。这个区别搞不清楚后面看IP数据报格式、看路由器转发过程都会发懵。1.2 笔记一到底划到哪里第四章内容特别多如果一本教材把网络层作为重点章节通常包括IP协议、IP地址与子网划分、ARP和ICMP、路由协议RIP/OSPF/BGP、NAT与IPv6、甚至组播和移动IP。一口气写太长反而不好消化所以我把笔记拆成两部分。这篇笔记一只处理网络层里偏“静态”的内容IP数据报长什么样、IP地址怎么分类和划分子网、ARP怎么把IP翻译成MAC、ICMP又是怎么报告错误的。这些内容不需要依赖动态路由算法就能理解也是后面学路由协议的地基。路由协议和路由算法包括距离向量、链路状态、BGP的基本思路我准备放到笔记二里单独写。为什么要这样切因为我观察到一个规律很多同学卡在第四章不是卡在RIP或OSPF上而是IP地址计算不熟ARP请求广播理解不透看到ping通了就以为万事大吉结果一到综合题就全乱。把地基夯实了路由协议反而是顺水推舟的事。1.3 和数据链路层、传输层的边界读网络层时我建议脑子里始终放一张分层表数据链路层用MAC地址标识设备网络层用IP地址标识主机所在的网络位置传输层用端口号标识具体应用程序。三者各管一段谁也不替代谁。举个例子你用浏览器访问某网站的网页传输层先建立TCP连接为的是把HTTP报文可靠地交给目的进程网络层为每个TCP段封装IP头负责把它从你的主机送到目标服务器而每一跳的传输又必须靠数据链路层的MAC地址在链路上搬运。有意思的是分层带来的好处是每层可以独立设计、独立演进。IP层不关心下面是以太网、Wi-Fi还在是光纤只要能封装和转发IP包就行。所以你在家通过Wi-Fi访问服务器中间可能经过以太网、运营商网络但IP层全程保持一致。这也是学习网络层时最值得体会的一个点协议栈的分工不是凭空分的每层的职责边界恰好就是事物理设计的边界。2. IP协议无连接的网络层靠什么传递数据2.1 数据报服务还是虚电路服务一次决定性的取舍网络层在设计上有两个流派一个是面向连接的虚电路Virtual Circuit一个是无连接的数据报Datagram。虚电路的思路很像打电话先拨号建立一条专用通道后续所有数据都沿着这条通道走数据报的思路更像寄快递每个包裹独立填写收件地址各自选择路线不提前协商。互联网最终选择了数据报方式。为什么我认为有几个关键理由。第一路由器不需要维护每条会话的状态转发逻辑极简一旦某个路由器出故障后续数据报可以自动绕路网络整体健壮性更好。第二适应异构网络底层可能是任何一种链路无连接方式天然不依赖某个网络提供的链路建立能力。第三网络层不承诺可靠交付把可靠性留给上层TCP去处理极大降低了网络设备的复杂度。这个设计的代价也很明显数据报可能丢失、重复、乱序IP层只能提供“尽力而为”的交付。学到这里不要抱怨IP协议为什么这么“弱”因为它故意只做最少的事。可靠性是TCP的战场IP想做的只是尽快把包送到大致正确的地方。理解了这一点看到TCP里的序号、确认、重传机制你会更容易理解为什么需要那些复杂机制。2.2 一个数据报的“身份证”长什么样IPv4数据报格式是第四章必须背下来的内容我建议逐字段刷一遍再结合抓包软件看真实报文比死记硬背效率高得多。IPv4首部固定部分是20字节各字段如下。字段长度位作用版本4IPv4或IPv6首部长度IHL4以4字节为单位最小5即20字节区分服务DS8早期叫服务类型现代用于DSCP和ECN总长度16整个数据报长度最大65535字节标识 / 标志 / 片偏移16 / 3 / 13分片与重组相关生存时间TTL8每经过一个路由器减1变为0则丢弃协议8标识上层协议TCP6UDP17ICMP1首部检验和16只校验IPv4首部源地址 / 目的地址各32源主机和目的主机的IP地址这里有两个容易记混的地方。首部长度字段的单位是4字节所以值5代表20字节值15代表60字节这也是首部最大长度。总长度是整个数据报的字节数包括首部但链路层MTU会限制帧最多携带多少数据以太网MTU通常是1500字节所以IP包如果超过MTU就要分片。片偏移字段比较特殊它以8字节为偏移单位。分片机制解决的是“我能发送的数据报很大但链路允许的帧太小”这个矛盾。每个分片都有自己的IP首部在目的端重组。我实习时排查过一次因分片导致的传输问题两台设备之间某段链路MTU设置不对大包被丢弃小包能通最后通过调整MTU和路径MTU探测才解决。这个诊断思路放到后面ICMP部分再展开。2.3 首部检验和为什么要“每跳重算”IP首部中的检验和只覆盖首部不覆盖数据部分。原因很现实IP数据报每经过一个路由器TTL都要减1首部内容就变了路由器必须马上重算检验和。如果检验和覆盖整个数据报每台路由器都得把全部数据重新算一遍开销太大而且数据是否损坏本来就交给上层验证了。你可能会问那首部检验和为什么还要存在因为首部承载了源地址、目的地址、分片信息等关键元数据如果首部损坏数据报就会投递到一个错误的地方比数据损坏更麻烦。所以IP层宁可每跳重算也要保证首部的完整性。对比一下TCP的校验和TCP校验和覆盖整个TCP报文段还包括一个伪首部源IP、目标IP、协议号、长度但传输层不关心每一跳的路由器怎么转发只在端到端计算一次。这个“计算范围”的差异再次体现了分层各管一段的思路。3. IP地址的三十年变脸史从分类编址到CIDR3.1 分类编址A、B、C、D、E一眼定乾坤早期的IPv4地址设计很直白32位地址按前几位分成A、B、C、D、E五类看开头就能判断网络号和主机号各占多少位。A类地址第一位固定为0网络号占8位主机号占24位B类前两位是10网络号占16位C类前三位是110网络号占24位。D类以1110开头用于组播E类以1111开头保留。类别开头位网络号位数第一个数字范围默认掩码A081~126255.0.0.0 (/8)B1016128~191255.255.0.0 (/16)C11024192~223255.255.255.0 (/24)D1110-224~239组播地址E1111-240~255保留分类编址的好处是路由表维护简单看一眼IP就能知道它的网络边界。但它的问题也很致命地址粒度太粗糙。A类网络最多容纳约1677万台主机普通机构根本用不了B类可容纳65534台对大多数公司还是太多C类只有254个主机地址稍微大点的企业又不够。这样的结果就是大量IP地址被浪费IPv4资源很快见底。我学习时一度很疑惑既然分类编址这么浪费为什么还要先学它因为教材里的散题、路由聚合的演进、老运维文档里的地址习惯都沿用这些分类概念。而且面试官特别喜欢问“A类地址范围是多少、为什么127不用”这些基础能回答上来说明你对地址的理解不是机械背表的。更重要的是从分类编址到无分类编址的过程本身就是理解网络设计思路的绝佳样本。3.2 CIDR把“有类”变成“无类”后面互联网规模爆炸分类编址不够用了于是提出无类别域间路由CIDR。CIDR彻底抛弃了“按第一位猜类别”的做法改用“IP地址/前缀长度”的写法比如192.168.1.0/24表示前24位是网络前缀后8位是主机位。子网掩码和前缀长度一一对应/24对应255.255.255.0/26对应255.255.255.192。网络地址的计算也很简单把IP地址和子网掩码做按位与结果就是该主机所在网络的网络地址。比如主机IP为192.168.1.129掩码255.255.255.192按位与后得到192.168.1.128说明这台主机属于192.168.1.128/26这个子网。明白了这个运算很多“IP到底属于哪个网段”的争执就能立刻平息。CIDR还带来了路由聚合的能力。原来路由表里可能有一堆C类地址条目现在可以把地理相邻的地址块合并成一条路由比如192.168.0.0/23和192.168.2.0/23可以聚合成192.168.0.0/22。路由表小了路由器转发查表更快这对互联网骨干路由器的效率提升至关重要。3.3 私网地址与NAT内网只用一个公网IP的魔法除了全球唯一的公网IPIP地址里还划出了一批私网地址专门给内网设备使用不需要向地址管理机构申请。常见的三块私网段是10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。另外还有几个特殊地址也要记住127.0.0.0/8是环回地址用于本机自检169.254.0.0/16是链路本地地址DHCP失败时系统可能会自动分配一个网络不同通常可以从这里看出点问题。私网地址为什么能缓解IPv4枯竭关键靠NAT。办公室几十台电脑全部用192.168.x.x出口路由器只暴露一个公网IP当内网设备访问互联网时路由器把私网源地址和端口翻译成公网IP和一段新的端口号同时维护一张映射表。回来的数据包再根据这张映射表倒推把数据交还给正确的主机。我在做实验时最深的一个感受是NAT把一个家庭的多个设备“伪装”成一个公网IP确实解决了内网接入问题但也破坏了端到端的直连模型。这就是为什么有些游戏联机、视频监控、P2P应用需要配置端口映射或使用NAT穿透技术。学完IPv6之后你会看到IPv6想重新恢复端到端通信但短期内NAT仍然是网络运维中绕不开的日常操作。4. 子网划分实操三步走考试和面试都够用4.1 子网划分的本质向主机位“借位”子网划分是第四章最容易出题、也最容易被扣分的点。先理解原理分类地址默认把“主机号”全留给内部但一个万级主机规模的网络很难统一管理所以内部再借用主机号的若干位作为子网号进一步切分成更小的广播域。本质上就是“在主机位里切出一块当子网位”剩下的是真正可用的主机位。借n位子网数量是2的n次方每个子网可用主机数是2的(剩余主机位次方)再减2为什么减2因为每个子网里全0的主机号是网络地址全1的主机号是广播地址这两个地址不能分配给具体设备。这是整个子网划分里最基础也最重要的一条规则。举个最容易犯的错很多人一上来就问“要划分几个子网”然后只按子网数量借位忽略了每个子网需要容纳多少主机。比如一个C类网段要分成4个子网借2位确实能得到4个子网但每个子网只剩6个主机位最多62台可用主机。如果每个子网需要100台设备借2位就直接不够了得借1位得到2个子网每个子网126台可用主机。所以正确顺序是先算主机需求再决定借多少位。4.2 一个计算例子192.168.1.0/24划分成4个子网我拿一个经典例题完整走一遍。假设单位拿到192.168.1.0/24要分成4个大小相同的子网每个子网需要容纳50台主机。先看主机需求50台主机至少需要6个主机位因为2的6次方减2等于62满足需求如果只给5个主机位最多30台不够。原网段有8个主机位现在需要6个主机位那么剩下的2位借给子网号正好2的2次方等于4个子网。新掩码就是24加2等于26位对应255.255.255.192。子网块大小怎么算用256减掩码的十进制值256减192等于64也就是说每个子网占据64个地址。4个子网的网络地址依次是192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。每个子网的可用地址范围和广播地址如下我把前两个子网列出来。子网网络地址可用地址范围广播地址1192.168.1.0/26192.168.1.1 ~ 192.168.1.62192.168.1.632192.168.1.64/26192.168.1.65 ~ 192.168.1.126192.168.1.1273192.168.1.128/26192.168.1.129 ~ 192.168.1.190192.168.1.1914192.168.1.192/26192.168.1.193 ~ 192.168.1.254192.168.1.255这个表一画整个子网边界就清清楚楚。做题时我建议所有步骤都自己写一遍不要凭感觉填。先用掩码换算成CIDR前缀再算块大小再列网络地址最后把广播地址和可用地址范围标出来。4.3 四个容易算错的小陷阱子网划分错误大多集中在几个点上。第一可用主机数一定要减2哪怕出题人没明说“子网内主机数”也要记得网络地址和广播地址不可用这是最常见的丢分点。第二子网块大小等于256减去最后一个非零掩码字节的十进制值比如掩码255.255.255.240块大小是16掩码255.255.255.192块大小是64。这个速算方法比每次都转二进制快得多。第三子网网络地址必须是块大小的整数倍。比如块大小64子网地址只可能是0、64、128、192绝对不会出现192.168.1.100这种网络地址因为100不是64的整数倍。第四把CIDR前缀和点分十进制掩码搞混比如/27对应255.255.255.224块大小32很多同学会误以为/27的块大小是256减224等于32其实这个算法是对的但容易在第三步确定子网地址时把起始地址算错。我有时候会建议同学自己背一张常用掩码速查表/24→255.255.255.0/25→255.255.255.128/26→255.255.255.192/27→255.255.255.224/28→255.255.255.240/29→255.255.255.248/30→255.255.255.252。以及对应可用主机数254、126、62、30、14、6、2。工作里配置点对点链路常用/30只有两个可用IP正好够两端路由器接口使用。5. ARP协议IP与MAC之间的“翻译官”怎么工作5.1 为什么不能直接用MAC地址通信网络层明明已经有了IP地址为什么在真实发送数据时链路层还需要MAC地址这和两层的设计密切相关。MAC地址是设备出厂时烧写在网卡上的物理地址没有层次全世界每个网卡理论上都是唯一的。但它没有“网络位置”的概念路由器根本没法根据MAC地址决定把一个帧送到哪个网络因为MAC地址不携带任何网络划分信息。IP地址则是一套有层次结构的逻辑地址路由器查找网络前缀决定下一步把数据报到哪个方向。可问题是IP包最终必须封装进链路层的帧里才能在网上传输帧头里写的是目的MAC地址。一台主机要把IP数据报发往另一个主机必须知道“下一跳设备的MAC地址”。这个从IP到MAC的映射就是ARP协议要解决的问题。打个比方IP地址像人名知道名字不代表知道住址你要送快递最终还是要门牌号。ARP就是帮你从“人名”查出“门牌号”的服务。5.2 ARP请求/应答一广播、一单播ARP的工作流程一句话概括先在缓存里找找不到就广播问。主机A想知道同一网段主机B的MAC地址先查自己ARP缓存表如果有映射直接使用如果没有A会发送一个ARP请求帧目标MAC地址填FF:FF:FF:FF:FF:FF广播到整个局域网内容大致是“谁的IP是192.168.1.2请告诉我你的MAC地址”。广播域内的所有主机都会收到这个请求但只有IP地址匹配的主机B会回应。B把请求中的“我是192.168.1.1MAC是XX”信息写入自己的缓存然后单播回复A“我是192.168.1.2我的MAC是YY”。A收到后也把这个映射缓存起来方便后续通信。整个过程不需要人工干预几毫秒内完成。ARP缓存为什么要存在因为广播开销不小如果每次发数据都广播一次局域网性能会很难看。缓存的有效期通常是几秒到几分钟不同系统策略不一样。在Windows里用arp -a查看Linux里用ip neigh或arp -n查看。如果某台设备换了网卡但缓存里的旧映射还没过期就可能出现“以前能通现在突然不通”的诡异现象这时候清一下缓存往往就好了。5.3 ARP欺骗、免费ARP和代理ARPARP有一个与生俱来的弱点它默认相信所有应答不检查请求是否真的由当事人发出。攻击者可以在局域网里伪造ARP应答告诉受害主机“网关的IP对应的MAC是我”受害主机就会把所有去往网关的流量发给攻击者这就是ARP欺骗的基本原理。在办公网络里这是常见的中间人攻击方式之一也是网工面试喜欢问的安全问题。防范思路包括使用防ARP欺骗的交换机特性、绑定IP和MAC、部署DAI等。免费ARPGratuitous ARP是设备启动时主动广播自己IP地址对应的ARP请求目的不是为了询问而是告诉整个局域网“我的IP是这个我的MAC是这个”。它有一个非常实用的功能检测IP地址冲突。如果你新配置了一个IP结果网络里已经有设备用了这个IP对方可能会收到免费ARP后回应系统就能提示冲突。运维里给服务器配静态IP前先ping一下地址有没有回复也是利用类似的思路。代理ARP则是一些老式路由器会把收到的ARP请求代为回应比如两个子网间的主机互相通信路由器替目标主机回答“我是目标主机你把包发给我”。虽然现在很多场景被更精细的配置取代了但了解它的存在能帮你理解为什么有些看似“不通”的网段却能互通。6. ICMP网络故障的第一道探针6.1 差错报告与查询ICMP的两类消息IP协议只管尽力转发一旦中间出了差错总得有办法通知源主机。ICMPInternet Control Message Protocol就是网络层的“报错系统”它本身封装在IP数据报里协议字段值为1。ICMP报文分为两类差错报告报文和查询报文。差错报告包括目标不可达类型3、超时类型11、参数问题类型12、重定向类型5等查询报文最典型的是回显请求类型8和回显应答类型0这也就是ping命令的基础。ICMP差错报文有个重要规则它只向源主机报告错误并且要携带原IP数据报的首部和前8字节数据这样源主机才能知道究竟是哪个上层协议、哪个端口的数据出了问题。注意ICMP差错报文本身不能被当作普通的“重传触发”机制它只是通知真正的重传由TCP负责。学到这里你可能会发现为什么抓包时ping能通但某些网页就是打不开因为防火墙通常只放行ICMP回显请求/应答却可能丢弃其他ICMP类型或者干脆放行了ICMP但阻断了TCP的某个端口。所以“ping通”只能证明网络层的联通性不能证明TCP端口可达。6.2 ping通了不代表网络好ICMP排障的真实体验我自己排障时习惯按顺序来先ping 127.0.0.1确认本机协议栈正常再ping本机IP确认网卡配置和驱动没问题然后ping网关IP确认本地链路通最后ping远程IP确认路由和跨网段通信正常。这四步里哪一步断了问题范围就立刻缩小。很多同学一上来就ping百度万一ping不通无法判断是本机、局域网、还是出口路由的问题等于浪费了一次诊断机会。ping的时候还要注意观察响应时间和TTL变化。同一台机器每次ping返回的TTL应该基本一致因为中间经过的路由器数量是固定的。TTL如果忽高忽低可能有路由路径变化或者做了负载均衡。如果ping某个IP能通但延迟特别大可以从链路质量下手比如是不是带宽拥堵、有没有丢包、无线信号是否不稳定。还有一种情况很常见ping不通远程地址但浏览器却能打开某些网站。可能是远程主机禁ping也可能是防火墙丢弃了ICMP入站请求但放行了HTTP/HTTPS。所以不要一看到不通就下结论要结合具体协议判断。反过来ping得通但应用连不上就要去思考是端口被防火墙挡了、服务没启动、还是TCP握手被reset了。6.3 抓包看一次MTU和分片问题ICMP在排查MTU问题时有独特价值。假设你发现访问某个服务器小文件没问题大文件传输卡死或极慢很可能是中间链路的MTU比两端配置值小导致大包需要分片但某个路由器又返回了“需要分片但DF标志置1”的ICMP不可达消息。在Windows上用ping -l 1472 -f发送一个不超过1500字节MTU的探测包如果提示“Packet needs to be fragmented but DF set”基本可以锁定MTU异常。这时候路由器的MTU黑洞排查思路就有了把本机网卡MTU从1500逐步调小比如调到1400测试如果大包能通了说明问题出在路径MTU发现失效。很多网络管理员会直接把关键链路的MTU统一设置成一致值或者使用PMTUD来动态发现路径MTU。不过PMTUD依赖ICMP如果中途路由器或防火墙丢弃了ICMP不可达报文PMTUD就会失败这也是我见过不少“看得到网站但下载不了大文件”案例的幕后原因。ICMP虽然简单却是网络工程师最重要的“眼睛”之一。配合抓包工具你可以在数据链路层真实看到ICMP请求、应答、不可达报告能把这些过程和理论对应上比单纯背协议字段要有用得多。我建议你把ping的四种常见输出也理一理Request timed out、Destination Host Unreachable、Destination Port Unreachable、TTL expired in transit每一种都对应不同的故障原因理解了它们排障速度和准确性都会上一个台阶。7. 给同样在啃第四章的人几点实在建议7.1 把字段表变成你自己的“肌肉记忆”网络层协议字段很多我背不住的时候就用笨办法抄下来画在纸上对着一个真实抓包文件逐字段核对。比如打开抓包工具抓一次本地访问网关的数据把IP首部的版本、首部长度、总长度、TTL、协议、检验和、源地址、目的地址一一标出来。这样看几遍字段就长在脑子里了远比反复背表格印象深刻。IP地址和子网划分建议每天随机出两三道小题练手比如“给你一个172.16.5.77/20求网络地址、广播地址和可用主机数”。这种运算熟练到不用看计算器之后再去做综合题就不会卡壳。我自己是把常用掩码、块大小、可用主机数抄在一张卡片上放在书桌上需要时扫一眼慢慢从“需要查表”变成“脱口而出”。7.2 自己动手搭一个小实验环境有条件的话建议用虚拟机搭建一个简单网络环境两三台虚拟机加一个虚拟网卡模拟路由手动配置不同网段的IP地址观察ping通的必要条件。当你亲自把网关地址配错、看着ARP请求发出去却没人应答再通过arp -a和抓包软件定位问题的那一刻你对ARP、ICMP和路由表的理解会质变。最后分享一个小技巧学网络层时不要只盯着“怎么算”要多问一句“为什么”。为什么IP头里有TTL为什么数据报要分片为什么ARP要靠广播这些问题串起来就是整章的逻辑主线。把这些“为什么”都搞明白了第四章这座分水岭翻过去之后风景会豁然开朗。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑