IP 协议是 TCP/IP 协议栈中的核心协议,工作在网络层,负责将数据报从源主机跨越多个网络送达目的主机。本文围绕 IP 报头字段、IP 地址、NAT、网段划分、路由选择、数据链路层以及 DNS 等主题,梳理 IP 协议的关键知识点。
一、IP 报头字段
IPv4 报头由固定部分和可选部分组成,固定部分长度为 20 字节,各字段共同描述报文的版本、长度、分片、生存时间与地址等信息。下面按字段逐一说明。
1. 4 位版本(Version)
作用:标识当前使用的 IP 协议版本号,位于 IP 报文第一个字节的高 4 位。
取值:
- 4:表示 IPv4,地址长度为 32 位,通常写成点分十进制形式,例如
192.168.1.1。 - 6:表示 IPv6,地址长度为 128 位,采用冒号分隔的十六进制表示,用于缓解 IPv4 地址枯竭问题。
注意事项:接收方解析报文时首先读取这 4 位版本号,据此决定后续按 IPv4 还是 IPv6 的格式继续解析报头。若版本号既不是 4 也不是 6,通常说明报文已损坏或协议不匹配,设备会直接丢弃该报文。
2. 4 位首部长度(Header Length)
作用:描述 IP 报头的长度,即从报文起始位置到数据部分开始之间的字节数。
单位:以 4 字节(32 位字)为单位,实际首部长度 = 字段值 × 4 字节。
取值:4 位二进制最大可表示 15,因此首部长度最大为 15 × 4 = 60 字节;最小值为 5,即 5 × 4 = 20 字节,这正是 IPv4 不含选项时的标准首部长度。
注意事项:当首部长度大于 20 字节时,多出的部分通常是可选项(Options)字段,用于携带时间戳、路由记录等扩展信息。接收方通过该字段可以准确判断报头在哪里结束、数据从哪里开始,从而正确切分报文。
3. 8 位服务类型(TOS,Type of Service)
作用:描述报文在传输过程中期望获得的服务质量。
结构:包含 3 位优先字段(已弃用)、1 位保留字段(必须置为 0)以及 4 位 TOS 字段。
取值:4 位 TOS 分别表示最小延时、最大吞吐量、最高可靠性和最小成本,这四位互相冲突,实际使用时只能选择其中一个:
- 最小延时:传输一个数据所消耗的时间尽量短。
- 最大吞吐量:单位时间内传输的数据量尽量多。
- 最高可靠性:IP 本身不负责可靠传输,该选项用于评估传输路径丢包可能性的大小。
- 最小成本:传输过程中消耗的资源开销最小。
4. 16 位总长度(Total Length)
作用:描述整个 IP 数据报的长度,单位为字节。
取值:16 位字段最大可表示 65535 字节,即 64 KB。
注意事项:当 IP 数据报需要携带更大的载荷(如传输层数据报)时,会自动触发拆包,由接收方完成组包。
5. 16 位标识、3 位标志与 13 位片偏移
这三个字段共同服务于 IP 分片与重组。
| 字段 | 长度 | 作用 | 注意事项 |
|---|---|---|---|
| 标识(Identification) | 16 位 | 标识哪些分片属于同一个原始数据报,便于接收方重组 | 同一数据报的所有分片具有相同的标识值 |
| 标志(Flags) | 3 位 | 控制是否允许分片以及是否还有后续分片 | 第一位保留;第二位 DF 置 1 表示禁止分片;第三位 MF 置 1 表示后面还有分片 |
| 片偏移(Fragment Offset) | 13 位 | 指示该分片在原始数据报中的位置,作为组包时的排序依据 | 以 8 字节为单位 |
标志位补充说明:第一位为保留位,目前不使用;第二位 DF(Don't Fragment)置 1 表示禁止分片,此时若报文长度超过 MTU(最大传输单元),IP 模块会自动丢弃该报文;第三位 MF(More Fragments)置 1 表示后面还有分片,最后一个分片的 MF 位为 0,其余分片为 1。
6. 8 位生存时间(TTL,Time To Live)
作用:限制数据报在网络中的存活时间,防止报文在网络中无限循环。
单位:不是“秒”或“分钟”,而是“跳数”,即数据报经过路由器的转发次数。
取值:常见初始值为 32、64、128。
注意事项:IP 数据报每经过一个路由器并完成一次转发,TTL 值减 1;当 TTL 减到 0 时,该数据报被丢弃。
7. 8 位协议(Protocol)
作用:指明传输层使用何种协议来解析载荷部分,例如 TCP、UDP 等。
8. 16 位首部校验和(Header Checksum)
作用:仅校验 IP 报头部分,不校验载荷。
注意事项:载荷部分的校验由 UDP 或 TCP 自身内置的校验和负责。
9. 32 位源 IP 地址与 32 位目的 IP 地址
作用:分别标识数据报的发送方与接收方。
格式:32 位整数,分为四个部分,每部分取值 0~255,中间用点分隔,即点分十进制表示,例如192.168.111.55。
二、IP 地址与地址枯竭
IP 地址设计的初衷是区分当前设备,期望每台设备都拥有与其他设备不同的 IP 地址。32 位地址的取值空间约为 42.9 亿个,随着设备数量激增,地址已明显不足,主要应对手段如下。
1. 动态分配 IP 地址
设备需要上网时才分配 IP 地址,不需要上网时不分配,从而节省大量地址资源。
2. NAT 网络地址转换
将 IP 地址分为两大类:
- 外网 IP / 公网 IP:具有全局唯一性。
- 内网 IP / 私网 IP:常见网段包括
10.*、172.16-172.31.*、192.168.*。
约定不同局域网中的内网 IP 允许重复,而大部分设备都位于局域网中,因此 IP 地址的利用率得以大幅提高。跨局域网访问时,按以下情形区分处理:
- 同一局域网内的两台设备互访:与 NAT 无关,直接根据 IP 区分不同设备。
- 两台都带外网 IP 的设备互访:与 NAT 无关,两个外网 IP 仍具有唯一性。
- 不同局域网中的两台设备互访:网络层不允许访问,会发生 IP 冲突。
- 外网 IP 设备访问内网 IP 设备:不允许访问,会被拦截。
- 内网 IP 设备访问外网 IP 设备:触发网络地址转换,NAT 设备(路由器)将 IP 数据报中的源 IP 修改为自己的 IP。
通过 NAT,成百上千台设备可以共用一个外网 IP。
3. IPv6
IPv6 使用 16 个字节作为 IP 地址的表示方式。其最核心的问题是 IPv6 与 IPv4 不兼容,而 IPv4 更为普及,因此两者在相当长的时间内共存。
三、网段划分
1. 网络号与主机号
IP 地址分为网络号和主机号两部分:
- 网络号:保证相互连接的两个网段具有不同的标识。
- 主机号:同一网段内,主机之间具有相同的网络号,但必须具有不同的主机号。
网络号与主机号的分界可以配置,通过子网掩码区分,例如255.255.255.0。子网掩码的二进制形式中,左半部分必须全为 1,右半部分必须全为 0,不能出现 1 和 0 混合的情况。
2. 早期的网络划分
早期设备较少、IP 地址充裕,按固定类别划分网络;如今这种划分方式会浪费大量 IP 地址。
3. IP 地址中的特殊取值
- 主机号全为 0:表示网络号,代表整个局域网,例如
192.168.100.0,不能分配给具体设备使用。 - 主机号全为 1:表示广播地址,例如
192.168.100.255。通常数据报传输是“一对一”的,发往广播地址的数据会被局域网内所有设备接收。 - 127.*:用于本机环回(loopback)测试,通常为
127.0.0.1。localhost是127.0.0.1的域名替代形式,多数情况下可以用localhost替代127.0.0.1。
四、路由选择
路由选择是 IP 协议进行数据转发时的路线规划过程。
由于整个网络环境过于复杂,单个路由器的配置能力有限,无法感知全局网络状态,只能掌握自身及周围设备的情况。因此 IP 协议的路由选择是一个“渐进式”的过程,只能给出“较优解”。
数据转发到达每个路由器时,按以下规则处理:
- 若路由器知道目标位置,则给出具体路线。
- 若不知道目标位置,则给出默认路径,也称为“下一跳”,通常指向上一级路由器。
五、数据链路层
网络层从宏观角度负责路径规划,数据链路层则从微观角度关心两个节点之间具体如何传输。以太网是数据链路层与硬件层的结合。
1. 类型字段
描述中间数据载荷的格式,即载荷属于哪种上层协议。
2. MAC 地址
MAC 地址长度为 6 个字节,用于实现“两个相邻设备之间的转发”。6 个字节的地址空间远大于 4 个字节:4 个字节的地址空间约为 42.9 亿个,6 个字节的地址空间在此基础上再乘以 65 535,数量约为 281 万亿。
目前 MAC 地址不需要“动态分配”和 NAT,通常在网卡生产时直接写入(一般情况下不可更改,少数设备允许更改)。MAC 地址也可以作为一台计算机的身份标识。
3. ARP 协议
ARP 是一种能够获取同一链路上各设备 IP 与 MAC 对应关系的协议,可以理解成一张转发表。
4. MTU
MTU(Maximum Transmission Unit)是数据链路层对载荷长度的最大限制。IP 的拆包与组包通常不是由 64 KB 的总长度上限决定,而是受数据链路层 MTU 的限制。若期望更高的传输效率,可将数据长度控制在 MSS(最大报文段长度)以下,从而减少拆包与组包过程。
六、重要应用层协议 DNS
域名通过一串单词表示一个 IP 地址,将域名解析为 IP 地址的过程由 DNS 完成。
最早期的 DNS 就是一个 hosts 文件,但由于每天都有网站诞生和消亡,维护更新并不方便。现在使用 DNS 服务器替代 hosts 文件,但这也使 DNS 服务器承担了非常高的并发量。实际解决方案主要有两点:
- 本地缓存:本机完成 DNS 解析后会进行缓存,短时间内访问相同域名无需再次访问 DNS 服务器。
- 分布式部署:DNS 服务器是分布式系统,全国部署了大量 DNS 服务器,通常由运营商和大型互联网公司架设。