专栏:《计算机网络基础》
对应总览:第四篇 网络层:让包跨越「很多个网络」
本篇角色:IPv4 专章——地址怎么写、掩码怎么算、TTL / 分片在路径上管什么
承接:《包怎么跨过很多个网络?网络层一次讲清》
读完你能:读懂 IPv4 头关键字段;手算网段 / 广播 / 主机数;解释错掩码与 MTU 黑洞;用ip/ping/tcpdump验证 TTL 与转发假设
获取更多网络编程代码实例请关注上方公众号!!!
导读:上一篇画了地图,这一篇拆「地址本体」
导论里说过:网络层把包送到「那台主机」。
日常说的「那台主机」,在绝大多数现网里,仍然靠IPv4 地址认。
连上 Wi‑Fi 后,系统设置里常出现三行:
IP 地址 192.168.1.23 子网掩码 255.255.255.0 网关 192.168.1.1很多人只会「照抄给网管」。可排障时,错掩码、错网关、TTL 耗尽、路径 MTU 问题,都会以很具体的方式坑你——不是玄学,是字段语义没对齐。
本篇把 IPv4 头、CIDR、TTL、分片和特殊地址拆开,并配上本机能做的小实验。你不必一次背完整头格式;先把「前缀怎么划、TTL 怎么减、大包卡在哪」变成肌肉记忆,后面看抓包和路由表会轻松得多。下一篇再讲 IPv6 与双栈:地址变长之后,坑反而更「偶发」。
应用 / 传输层数据 │ ▼ ┌───────────────────┐ │ IPv4 头部 │ ← 源、目的、TTL、协议、分片相关字段…… └─────────┬─────────┘ ▼ 链路层帧发出去一、概念:IPv4 在认什么、管什么?
1.1 一句话
IPv4(Internet Protocol version 4):用 32 位逻辑地址标识网络接口,并提供尽最大努力(best-effort)的包转发——不保证不丢、不乱序;可靠交给上层(如 TCP)。它负责「送到哪台机器附近」;端口不在这一层。
1.2 它管什么 / 默认不管什么
它管 | 默认不管 |
|---|---|
源 / 目的 IP | 重传、保序、流量控制 |
分片(以及何时需要) | 「一定到达」 |
TTL 防环路 | 加密(那是 IPsec / TLS 等) |
协议字段(后面是 TCP/UDP/ICMP…) | 端口(端口在传输层) |
经典边界再念一遍:
ping 不通 → 先怀疑网络 / 链路 / 物理 / 策略 ping 通但 443 不通 → 多半端口、防火墙、未监听或应用1.3 点分十进制:人读的只是包装
32 位拆成 4 个字节,每个字节写成 0–255 的十进制,用点隔开:
192.168.1.23 = 11000000 . 10101000 . 00000001 . 00010111记住三件事:
每个点分位最大255(一个字节),出现 256 就是写错了
比较大小、算网段时,心里要能回到「二进制前缀」——CIDR 就是干这个的
「地址长得像」不等于「同网段」——同不同,看掩码,不看观感
1.4 掩码与 CIDR:哪一段是「网」,哪一段是「主机」?
早期爱写255.255.255.0;现在更常用CIDR记法:192.168.1.0/24。/24表示:前 24 位是网络前缀,剩下 8 位给主机。
地址: 192.168.1.23 掩码: /24 → 255.255.255.0 网段: 192.168.1.0 广播: 192.168.1.255 可用主机大致: 192.168.1.1 ~ 192.168.1.254(常见用法)手算口诀:地址与掩码按位与 → 网络号;主机位全 1 → 广播(在常见以太网广播域语境下)。
主机数直觉(减掉网络地址和广播地址后的「可用」近似):
前缀 | 主机位 | 地址总数 | 常见可用主机数直觉 |
|---|---|---|---|
/24 | 8 | 256 | ~254 |
/25 | 7 | 128 | ~126 |
/16 | 16 | 65536 | 很大,公司/园区常见 |
/30 | 2 | 4 | 点到点链路常用(约 2 可用) |
/32 | 0 | 1 | 单主机路由,云上很常见 |
/0 | 32 | 全体 | 默认路由「其它都走这」 |
人话版:
同一前缀里的地址,协议栈倾向当成「直连邻居」;出了前缀,就去找网关。
掩码写错,本质是「同网段判断」错了——后面排障会反复碰到。
1.5 特殊地址(先记会撞到的)
类型 | 例子 | 用途直觉 |
|---|---|---|
本机回环 |
| 只在本机转,不出台 |
私网(RFC1918) |
| 内网用,公网不路由 |
链路本地 |
| 没拿到 DHCP 时常出现;同链路通信 |
默认路由 |
| 「其它目的都走这」 |
文档/测试 |
| 文档示例,别当生产地址 |
家里设备满屏192.168.x.x,是因为私网 + 出口 NAT;细节在 NAT 专章。
笔记本突然变成169.254.x.x,先查 DHCP / 网线 / Wi‑Fi,别先怀疑应用代码。
回环地址再强调一次:127.0.0.1通只证明本机栈还活着,不能拿它当「外网也没问题」的证据。私网能互访,也不等于公网出口一定健康。
二、原理:头字段、TTL、分片分别卡在哪一环?
2.1 IPv4 头:先盯住「排障会用到的」
完整头还有选项、校验和细节,本篇抓常用字段:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options (可选) … |字段 | 你要知道的 |
|---|---|
Version | 4 |
Total Length | 整个 IP 包长度 |
Identification / Flags / Fragment Offset | 分片与重组 |
TTL | 剩余跳数;防环路 |
Protocol | 上一层是 TCP(6)、UDP(17)、ICMP(1) 等 |
Source / Destination | 源、目的 IPv4 |
中间路由器主要看目的地址 + 自己的路由表;一般不帮你重传 TCP。
2.2 转发时的「同网段」判断
排障时把这一步想清楚,能少做很多无用抓包:主机并不是「看见点分四段长得像就直连」,而是严格按本地配置的前缀做判断。
你的主机要发往某个目的 IP:
1. 看目的是否落在本机某网卡的「直连网段」 2. 是 → 链路层直接找对端(ARP 等) 3. 否 → 查路由表,通常丢给默认网关 4. 网关再重复「查表 → 下一跳」所以:IP 头里写的是最终目的;每一跳只决定此刻扔给谁。
两台机器地址看起来「差不多」,掩码一个/16一个/24,就会出现:
A: 192.168.1.10/24 认为同网段是 192.168.1.0–255 B: 192.168.1.200/16 认为同网段大得多A 觉得 B 是邻居(直接 ARP),B 觉得 A 在外网(丢给网关)——典型「半边能通」玄学。对齐前缀往往比换网线有效。
2.3 TTL:不是「秒」,是「还能跳几下」
TTL(Time To Live)早期设计带过时间语义,现在按跳递减:
Linux 发出去常见初值64
Windows 常见128
每过一个路由器(严格说是每转发一跳)通常减 1
到 0:丢弃,并常发 ICMP Time Exceeded
你ping回显里看到的ttl=,是回程包到达你这边时的剩余 TTL,可以反推「大概经过了多少跳」(初值要猜对:64 还是 128):
发出初值 64,回来 ttl=52 → 大约走了 12 跳(粗算) 发出初值 128,回来 ttl=117 → 大约 11 跳环路时 TTL 会被耗光——这是它存在的核心理由之一。traceroute则故意从 TTL=1 往上加,逼每一跳说话(ICMP 专章细讲)。
2.4 分片与现代 PMTUD:直觉比公式重要
链路有MTU(常见以太网 1500)。IP 包太大,路径上某跳装不下:
旧路径:中间设备可能把包切开(分片),目的端再重组
现代常见策略:很多地方希望端到端尽量不分片;发端用PMTUD(Path MTU Discovery)探出路径最大可用尺寸,过大的包直接缩小或报错
IPv4 里还有 DF(Don't Fragment)标志:置上后,中间不能分片,装不下就丢并可能用 ICMP 通知「需要更小」。
排障直觉:
大文件 / VPN / 某些 UDP 怪异失败,而小包正常 → 先怀疑 MTU / 分片 / ICMP「需要分片」被墙掉(PMTUD 黑洞)不必死记所有标志位组合;先建立:路径上存在「最大能过的包」这个上限,TTL 管跳数,MTU 管尺寸。
2.5 和传输层的交接
IPv4 Protocol = 6 → 把载荷交给 TCP IPv4 Protocol = 17 → 交给 UDP IPv4 Protocol = 1 → 交给 ICMPping 通只说明「IP/ICMP 这条探测路径」大致可达(且策略放行);不等于443 一定通。
三、应用:你每天都在填这些字段
3.1 家用 Wi‑Fi
DHCP 下发:地址、掩码(常 /24)、网关、DNS。
浏览器访问外网时,目的不在192.168.x.0/24,包全部走向默认网关,再 NAT 出去。
两台手机「连着同一个 Wi‑Fi 却互 ping 不通」,除了 AP 隔离,也要核对是不是各自拿到了奇怪前缀。
3.2 云主机的/32
很多云厂商给弹性网卡配x.x.x.x/32,再靠 VPC 路由指下一跳。
乍看「没有同网段邻居」,其实是靠路由表而不是靠「长主机位」找路——别用家庭 /24 的直觉硬套。
安全组再叠一层:你开了业务端口,别人仍可能 ping 不通——那是 ICMP 策略,下一篇细说。
3.3 容器与叠加网
Docker / K8s 里一堆10.x、172.16段,靠路由和 iptables/NFT、CNI 拼起来。
错一段路由或掩码,表现常常是:同节点通、跨节点不通,或 Service IP 黑洞。
排障时先ip addr/ip route get <PodIP>,别一上来重启业务进程。
3.4 安全设备看的也是五元组里的 IP
防火墙、安全组先匹配源/目的 IP(再加端口协议)。
你改错网段规划,策略再漂亮也对不上流量——「规则写了却不命中」,有时根因就是地址根本不在你以为的那段。
3.5 办公网与 VPN
公司内网大量10.0.0.0/8;你笔记本在家是192.168.x.x,连上 VPN 后多出一条或几条到10.0.0.0/8的路由。
「网页能开、内网系统打不开」——经常是默认路由在,但内网前缀路由丢了,或分流策略把10/8指错了。
3.6 为什么工程师要「会算前缀」,而不是只会抄设置
DHCP 把地址配好时,你感觉不到 IPv4;一到手工扩容、对接合作方专线、给测试机加别名地址,前缀立刻变成硬技能。
举例:业务要在10.20.0.0/16里划出一小段给联调环境,你是切/24还是/28?这决定了广播域大小、地址浪费、以及防火墙对象怎么写。
再举例:两台路由器做点到点互联,常见用/30或/31——你若随手写成/24,等于把一大段地址浪费在一条链路上,还可能和别处规划冲突。
会算前缀,本质是会回答三个问题:
1. 哪些地址算「自己人」(直连)? 2. 广播/网关落在哪? 3. 路由条目应该写多宽,才既够用又不误伤?这三问清楚了,后面看安全组、看 ACL、看云路由表,都不会再被「长得像同网段」骗到。
3.7 和总览篇的衔接:IPv4 只是网络层第一块砖
导论里的主角名单里,IPv4 旁边还有 ICMP、路由、NAT、隧道。
本篇把「地址本体」钉牢,是为了后面排障时你不会把所有问题都怪到应用:
先确认源目的 IP 与掩码是否自洽,再问 TTL 是否在路径上耗尽,再问是不是 MTU,然后才轮到端口与业务。
顺序反了,工单会越写越玄。
四、问题定位:错掩码、环路、黑洞
4.1 故障速查
现象 | IPv4 侧常见根因 | 先做什么 |
|---|---|---|
同交换机却 ping 不通 | 掩码不一致、IP 冲突、没 ARP、AP 隔离 | 对比双方 |
能上部分网、不能上其他 | 路由缺失、下一跳错 |
|
延迟异常高或路径怪 | 次优路由、环路边缘 |
|
大包失败、小包成功 | MTU / 分片 / PMTUD 黑洞 | 缩小包试验;检查是否丢「需要分片」类 ICMP |
出现 | DHCP 失败拿到链路本地 | 查 DHCP/链路,而不是怪应用 |
只有 | 网卡没地址 / 未联网 |
|
ping 通业务不通 | 非 IPv4 寻址问题 | 转端口 / 安全组 / 应用 |
4.2 错掩码:经典坑
对齐双方前缀比「换一根网线」更常治好问题。
若系统有ipcalc/sipcalc可用来核对;没有就用手算:地址与掩码按位与 → 网络号。
4.3 环路:TTL 在擦屁股
错误的静态路由互相指向,包在两台路由器之间转圈,直到 TTL 耗尽。
表现:CPU/接口流量怪、业务超时、traceroute在某几跳重复。
这时别先调应用超时,先把「互相指」的路由拆开。
4.4 黑洞:路由「有」,路「没有」
路由表指向一个并不转发的下一跳,或安全策略默丢,包进洞没回声。
和「禁 ping」不同:禁 ping 可能业务仍通;黑洞常常是TCP 也一起没了。ip route get告诉你内核「打算怎么走」;走得对不对,还要靠对端/路径实测。
常见黑洞三件套,值得背下来:
1. 下一跳地址写错,但路由条目还在——表「看起来有路」 2. 下一跳机器禁了转发,或接口 down——包交出去就消失 3. 策略/安全组默丢——既无 ICMP 也无业务回包排障时不要只截一张路由表交差:用ping、业务端口、必要时tcpdump在出接口上看包有没有真正离开本机。
「本机发出去了」和「对端收到了」是两件事;IPv4 头只能保证你按表转发,不保证路径诚实。
4.5 决策树
4.6 实操命令(Linux 为主;Windows 可用ipconfig/route print对照)
ip -br addr ip addr show ip route ip route get 1.1.1.1 # 掩码/网段手算辅助(若已安装 ipcalc / sipcalc) ipcalc 192.168.1.23/24 ping -c 4 192.168.1.1 ping -c 4 1.1.1.1 # 看回程 TTL ping -c 2 223.5.5.5 # 输出里关注 ttl= # 抓 IPv4(看 TTL、是否分片等) sudo tcpdump -ni any icmp or ip host 1.1.1.1ip route get仍然是导论里强调的那句:问内核「去这个地址你打算从哪走?」
示例含义(示意):
1.1.1.1 via 192.168.1.1 dev wlan0 src 192.168.1.23表示:去1.1.1.1下一跳是网关192.168.1.1,从wlan0出去,源地址用192.168.1.23。
五、动手:把地址和 TTL 摸实
下面以常见 Linux/
iproute2为例。Windows 可把ip addr换成ipconfig,把ip route换成route print,思路相同。
实验 A:读出「我是谁、哪段、网关谁」
ip -br addr ip route ip route get 223.5.5.5在纸上填:
我的 IPv4:__________ / __________ 网段(网络地址):__________ 广播(若 /24 家庭网):__________ 默认网关:__________ 去公网 DNS 走哪块网卡:__________若有ipcalc:
ipcalc 192.168.1.23/24没有就手算:/24把最后一节主机位清零得网络地址,置全 1 得广播。
实验 B:ping看 TTL,粗算跳数
ping -c 4 127.0.0.1 ping -c 4 223.5.5.5对比回显里的ttl=。本机回环与公网路径通常不同。
假设对端或路径按 Linux 初值 64 回:
跳数粗算 ≈ 64 - 观察到的 ttl(若结果很怪,可能对端初值是 128,或中间设备改写 TTL——粗算即可,别当精密仪器。)
实验 C:错掩码思想实验(慎在生产改)
在实验机或虚拟机上(不要拿公司生产网瞎改):
两台机设成同一「看起来像」的地址段,故意一个
/24、一个/16互相
ping,同时:
ip route get <对端IP> sudo tcpdump -ni <网卡> arp or icmp体会:内核「是否直连」完全由本地前缀决定,不是由「地址长得像不像」决定。
实验 D:tcpdump看 IP 头侧写
# 终端 1 sudo tcpdump -ni any -v icmp # 终端 2 ping -c 3 1.1.1.1关注冗长输出里的ttl、length,以及 ICMP 是 echo request / reply。
有条件再试大包(注意权限与路径):
ping -c 2 -s 1400 1.1.1.1 ping -c 2 -s 2000 1.1.1.1对比是否开始牵扯分片或失败——不同系统/网络表现不一,重点是建立 MTU 意识。
实验 E:对比「主机通」和「端口通」
ping -c 3 1.1.1.1 curl -v --connect-timeout 3 https://1.1.1.1 -o /dev/null体会:ICMP 通,不代表 443 策略一定放行;反过来,有的环境禁 ping,HTTPS 却正常。
实验 F:把「网段直觉」写进笔记
挑你当前环境的真实地址(家里 Wi‑Fi 或虚拟机都行),完成下面这段填空,并保存一周后对照:
接口名:________ 地址/前缀:________ / ________ 网络地址:________ 广播地址(若适用):________ 默认可达网关:________ 同网段随便举两个地址:________ / ________ 一个「必须走网关」的地址:________ ip route get 该地址 的结果摘要:________做完这页纸,你对 IPv4 的掌握会从「听说过 CIDR」变成「能给同事讲清为什么 ping 不到隔壁工位」。
很多线上事故复盘里,真正缺的不是新命令,而是这种把前缀、网关、直连关系写清楚的习惯。
再补一段现场叙事:错掩码如何骗过你
假设桌面机192.168.1.10/24,打印机被误配成192.168.1.50/16。
桌面机觉得打印机就在旁边,直接 ARP;打印机觉得桌面机「也可能在更大网段某处」,转发逻辑和 ARP 预期拧着。
表现可以是:偶发能发现设备、管理页时好时坏、换交换机端口也没用。
你若只盯应用层「驱动要重装」,会浪费一下午。先把双方ip addr(或ipconfig)里的前缀对齐,故事往往立刻结束。
云上版本也类似:安全组规则写了10.0.1.0/24,实例实际落在10.0.1.0/16规划里的另一段——规则「看起来覆盖了」,五元组对不上,流量照样丢。
地址规划是策略的前提;策略写得再细,前缀理解错了也是空枪。
本章小结
若只能带走五句话,就带走这些:地址是 32 位前缀游戏;掩码决定谁算邻居;TTL 防环并喂饱路径探测;MTU/分片解释大小包差异;特殊地址帮你一眼认出「根本不该指望它出公网」。
其余细节可以回查命令与表格,但这五句能让你在排障时先站对层。
IPv4 用 32 位地址寻址;人读点分十进制,机器看前缀 掩码/CIDR 决定「直连还是走网关」——错掩码是高频根因 TTL 按跳递减,防环路,也是 traceroute 的道具 分片仍存在,但现代更常碰到 PMTUD / MTU 黑洞 特殊地址:回环不出网,私网靠 NAT,169.254 多半 DHCP 凉了 工具:ip addr / ip route / ipcalc或手算 / ping看ttl / tcpdump ip