IPv4

网际协议版本4（Internet Protocol version 4，缩写：IPv4，又称互联网通讯协定第四版）是网际协议开发过程中的第四个修订版本，也是此协议第一个被广泛部署和使用的版本。其后继版本为IPv6，直到2011年，IANA IPv4位址完全用尽时，IPv6仍处在部署的初期。

IPv4在IETF于1981年9月发布的 RFC 791 中被描述，此RFC替换了于1980年1月发布的 RFC 760。

IPv4是一种无连接的协议，操作在使用分组交换的链路层（如以太网）上。此协议会尽最大努力交付数据包，意即它不保证任何数据包均能送达目的地，也不保证所有数据包均按照正确的顺序无重复地到达。这些方面是由上层的传输协议（如传输控制协议）处理的。

## 地址

IPv4使用32位地址长度，地址空间共可提供43亿（4,294,967,296）个地址，其中可在互联网上路由的公共地址约37亿个，近6亿个IP地址保留作其他用途。

在早期的分类网络架构中，多播地址（D类）被分配了4位前缀，因此占用了约2.7亿（228）个地址。多播地址的使用率不高，16个`/8`网络前缀中有12个属于“保留”。

约2.7亿个E类地址保留作研究、实验或未来用途。部分软件和硬件把E类地址视为不合法，并自动丢弃这些封包。由于存在相容性问题，所以在IP地址枯竭时没有投入使用。此外，IANA认为各国对IP地址的需求庞大，即使把E类地址改为公共地址，人们依然会迅速耗尽所有IP地址。

另外，一些地址是为特殊用途所保留。在A类、B类和C类网络中，各有一个地址区块保留作专用网络，合共有约1789万个地址。`127.0.0.0/8`保留作Localhost回送测试，`0.0.0.0/8`保留作“本网络”，各占用1678万个地址。这都减少了可在互联网上路由的公共地址数量。

随着地址不断被分配给最终用户，IPv4地址枯竭问题也在随之产生。基于无类别域间路由和网络地址转换的地址结构重构显著地减少了地址枯竭的速度。2011年2月3日，在最后5个地址块被分配给5个区域互联网注册管理机构之后，IANA的主要地址池已经用尽。

由于IPv6并不向下相容IPv4，导致使用率增长缓慢。即使已经耗尽IPv4位址，也未能刺激互联网服务供应商部署IPv6。ISP更倾向于部署电信级NAT，把一个IPv4公共地址转换为多个IPv4私人地址，供多个客户同时使用。用户的路由器也使用NAT，把ISP的一个私人地址转换为属于用户自己的多个私人地址。整个NAT过程包括三个IPv4地址空间，因此称为NAT444。

### 地址格式

IPv4地址可被写作任何表示一个32位整数值的形式，但为了方便人类阅读和分析，它通常被写作点分十进制的形式，即四个字节被分开用十进制写出，中间用点分隔。

下表展示了几种不同的格式：

格式｜值｜从点分十进制转换

点分十进制｜192.0.2.235｜不适用

点分十六进制｜0xC0.0x00.0x02.0xEB｜每个字节被单独转换为十六进制

点分八进制｜0300.0000.0002.0353｜每个字节被单独转换为八进制

十六进制｜0xC00002EB｜将点分十六进制连在一起

十进制｜3221226219｜用十进制写出的32位整数

八进制｜030000001353｜用八进制写出的32位整数

此外，在点分格式中，每个字节都可用任意的进制表达。如，192.0x00.0002.235是一种合法（但不常用）的表示。点分格式也支持零省略的写法，例如127.1.1等同于127.1.0.1。

### 分类网络

IP地址最初被分成两部分：网络识别码在地址的首8位，主机识别码在剩下的24位。此层级结构限制了互联网只能由254个网络组成，可扩展性不足。为了克服这个限制，在随后出现的分类网络中，地址的高位字节被重定义为网络的类(Class)。这个系统定义了五个类别：A、B、C、D和E。

A、B和C类有不同的网络类别长度，剩余的部分被用来识别网络内的主机，这就意味着每个网络类别有着不同的给主机编址的能力。D类被用于多播地址，E类被留作将来使用。

前8位地址范围｜类｜路由形式｜占地址总空间的比例

0-127｜A｜单播｜1/2

128-191｜B｜单播｜1/4

192-223｜C｜单播｜1/8

224-239｜D｜多播｜1/16

240-255｜E｜1/16

1993年，无类别域间路由（CIDR）正式地取代了分类网络，后者也因此被称为“有类别”的。

CIDR采用可变长度的网络前缀，按需要分配不同大小的地址块给用户，不再是三款固定长度。CIDR创建的分层架构由互联网号码分配局（IANA）和区域互联网注册管理机构（RIR）进行管理，每个RIR均维护着一个公共的WHOIS数据库，以此提供IP地址分配的详情。

### 特殊用途的地址

CIDR地址块｜描述｜参考资料

0.0.0.0/8｜本网络（仅作为源地址时合法）｜RFC 6890

10.0.0.0/8｜专用网络｜RFC 1918

100.64.0.0/10｜电信级NAT｜RFC 6598

127.0.0.0/8｜环回｜RFC 5735

169.254.0.0/16｜链路本地｜RFC 3927

172.16.0.0/12｜专用网络｜RFC 1918

192.0.0.0/24｜保留（IANA）｜RFC 5735

192.0.2.0/24｜TEST-NET-1，文档和示例｜RFC 5735

192.88.99.0/24｜6to4中继｜RFC 3068

192.168.0.0/16｜专用网络｜RFC 1918

198.18.0.0/15｜网络基准测试｜RFC 2544

198.51.100.0/24｜TEST-NET-2，文档和示例｜RFC 5737

203.0.113.0/24｜TEST-NET-3，文档和示例｜RFC 5737

224.0.0.0/4｜多播（之前的D类网络）｜RFC 3171

240.0.0.0/4｜保留（之前的E类网络）｜RFC 1700

255.255.255.255/32｜受限广播｜RFC 919

网络号｜主机号｜是否可以作为源地址｜是否可以作为目的地址｜备注/描述

全为0｜全为0｜允许｜禁止｜表示本网主机

全为0｜Host ID｜允许｜禁止｜表示特定主机

全为1｜全为1｜禁止｜允许｜定向广播地址

127｜任意合法的值｜允许｜允许｜迂回地址，用于本地测试

Network ID｜全为1｜禁止｜允许｜直接广播地址

### 专用网络

在IPv4所允许的大约四十亿地址中，三个地址块被保留作专用网络。这些地址块在专用网络之外不可路由，专用网络之内的主机也不能直接与公共网络通信。但通过网络地址转换（NAT），使用这些地址的主机可以像拥有公共地址的主机在互联网上通信。

下表展示了三个被保留作专用网络的地址块（RFC 1918）：

名字｜地址范围｜地址数量｜有类别的描述｜最大的CIDR地址块

24位块｜10.0.0.0–10.255.255.255｜16,777,216｜一个A类｜10.0.0.0/8

20位块｜172.16.0.0–172.31.255.255｜1,048,576｜连续的16个B类｜172.16.0.0/12

16位块｜192.168.0.0–192.168.255.255｜65,536｜连续的256个C类｜192.168.0.0/16

#### 虚拟专用网络

通常情况下，路由器根据数据报文的目的地址决定转发数据报文的下一跳地址。使用专用网络地址作为目的地址的数据包通常无法被公共路由器正确送达，因为公共路由器没有相应的路由信息，即无法得知如何才能转发到该IP地址。因此，这就需要通过一种方法，将指引数据报文转发的下一跳地址和真正要传输的目的地址分离开。于是就使用虚拟专用网，将IP报文封装在其他报文内，以便于通过公网上的公共路由器，达到能处理该封包内层数据的网络设备上解除封包后，该数据包可以被继续转发到目的地址。

将数据报文封装的过程中，可以将数据报文封装于IP报文中，也可以使用多协议标签交换协议等，通过其他协议引导数据报文转发。也可以封装同时加密数据，以保护数据内容。

### 链路本地地址

RFC 5735中将地址块169.254.0.0/16保留为特殊用于链路本地地址，这些地址仅在链路上有效（如一段本地网络或一个端到端连接）。这些地址与专用网络地址一样不可路由，也不可作为公共网络上报文的源或目的地址。链路本地地址主要被用于地址自动配置：当主机不能从DHCP服务器处获得IP地址时，它会用这种方法生成一个。

当这个地址块最初被保留时，地址自动配置尚没有一个标准。为了填补这个空白，微软创建了一种叫自动专用IP寻址（APIPA）的实现。因微软的市场影响力，APIPA已经被部署到了几百万机器上，也因此成为了事实上的工业标准。许多年后，IETF为此定义了一份正式的标准：RFC 3927，命名为“IPv4链路本地地址的动态配置”。

### 环回地址

地址块127.0.0.0/8被保留作环回通信用（Loopback Address）。此范围中的地址绝不应出现在主机之外，发送至此地址的报文被作为同一虚拟网络设备上的入站报文（环回），主要用于检查TCP/IP协议栈是否正确运行和本机对本机的链接。

### 以0或255结尾的地址

一个常见的误解是以0或255结尾的地址永远不能分配给主机：这仅在子网络遮罩至少24位元长度时（旧的C类地址，或CIDR中的/24到/32）才成立。

在有类别的编址中，只有三种可能的子网络遮罩：A类：255.0.0.0，B类：255.255.0.0，C类：255.255.255.0。如，在子网络192.168.5.0/255.255.255.0（即192.168.5.0/24）中，网络识别码192.168.5.0用来表示整个子网络，所以它不能用来标识子网络上的某个特定主机。

广播地址允许数据包发往子网络上的所有设备。一般情况下，广播位址是借由子网络遮罩的位元反码并和网络识别码执行 OR 的位元运算得到，即广播地址是子网络中的最后一个地址。在上述例子中，广播地址是192.168.5.255，所以为了避免歧义，这个地址也不能被分配给主机。在A、B和C类网络中，广播地址总是以255结尾。

但是，这并不意味着每个以255结尾的地址都不能用做主机地址。比如，在B类子网192.168.0.0/255.255.0.0（即192.168.0.0/16）中，广播地址是192.168.255.255（主机位全1）。在这种情况下，尽管可能带来误解，但192.168.1.255、192.168.2.255等地址可以被分配给主机。同理，192.168.0.0作为网络识别码不能被分配，但192.168.1.0、192.168.2.0等都是可以的。

随着CIDR的到来，广播地址不一定总是以255结尾（广播地址是指主机位都为1的地址，255只是其中一种情况）。比如，子网络203.0.113.16/28的广播地址是203.0.113.31。过程如下：

网络：203.0.113.16

掩码：255.255.255.240

掩码反码：0.0.0.15

OR操作：

一般情况下，子网络的第一个和最后一个地址分别被作为网络识别码和广播地址，任何其它地址都可以被分配给其上的主机。

### 地址解析

互联网上的主机通常被指定，但IP报文的路由是由IP地址而不是这些名字决定的。这就需要将域名翻译（解析）成地址。

域名系统（DNS）提供了域名转换为IP地址的服务。与CIDR相像，DNS是层级结构。

## 地址空间枯竭

从20世纪80年代起，一个很明显的问题是IPv4地址正以比设计时的预计更快的速度耗尽。这是创建分类网络、无类别域间路由，和最终决定重新设计基于更长地址的互联网协议（IPv6）的诱因。

一些市场力量也加快了IPv4地址的耗尽，如：

- 互联网用户的急速增长。
- 总是开着的设备：ADSL调制解调器、缆线调制解调器等。
- 移动设备：笔记型电脑、PDA、移动电话等。

随着互联网的增长，各种各样的技术随之产生以应对IPv4地址的耗尽，如：

- 网络地址转换（NAT）。
- 专用网络的使用。
- 动态主机设置协议（DHCP）。
- 基于名字的虚拟主机。
- 区域互联网注册管理机构对地址分配的控制。
- 对互联网初期分配的大地址块的回收。

随着IANA把最后5个地址块分配给5个RIR，其主地址池在2011年2月3日耗尽。许多地址分配和消耗的模型都预测第一个耗尽地址的RIR会在2011年的下半年出现。ARIN在2015年用完可用的供应，APNIC、LACNIC和AFIC根据其社区政策定量供应。

广泛被接受且已被标准化的解决方案是迁移至IPv6，地址长度从32位增加到128位，其中由ISP分配的网络前缀最长64位元。

在IPv4年代，路由器把ISP分配的IP地址转换为私人网络（如`192.168.0.0/16`），再分配IP地址给其他设备。IPv6的其中一个设计理念是不使用网络地址转换（NAT），网络前缀占64位，后64位元作为主机地址，让每一台设备都可以有自己的公共地址。

## 网络地址转换

对地址的快速分配和其造成的地址短缺促成了许多有效应用地址的方法，其中一种就是网络地址转换（NAT）。

## 报文结构

IP报文包含IP首部和数据部分

### 首部

IPv4报文的首部包含14个字段，其中13个是必须的，第14个是可选的（红色标出），并命名为：“选项”字段。首部中的字段均以大端序包装，在以下的图表和讨论中，最高有效位（Most Significant bit）被标记为0。

位偏移｜0–3｜4–7｜8–13｜14-15｜16–18｜19–31

0｜版本｜首部长度｜区分服务｜显式拥塞通知｜全长

32｜标识符｜标志｜分片偏移

64｜存活时间｜协议｜首部检验和

96｜源IP地址

128｜目的IP地址

160｜选项（如首部长度>5）

160或192+｜ 数据

版本（Version）：版本字段占4bit，通信双方使用的版本必须一致。对于IPv4，字段的值是4。

首部长度（Internet Header Length， IHL）：占4bit，首部长度说明首部有多少32位字（4字节）。由于IPv4首部可能包含数目不定的选项，这个字段也用来确定数据的偏移量。这个字段的最小值是5（二进制0101），相当于5*4=20字节（RFC 791），最大十进制值是15。

区分服务（Differentiated Services，DS）：占6bit，最初被定义为服务类型字段，实际上并未使用，但1998年被IETF重定义为区分服务RFC 2474。只有在使用区分服务时，这个字段才起作用，在一般的情况 下都不使用这个字段。例如需要实时数据流的技术会应用这个字段，一个例子是VoIP。

显式拥塞通告（Explicit Congestion Notification，ECN）：在RFC 3168中定义，允许在不丢弃报文的同时通知对方网络拥塞的发生。ECN是一种可选的功能，仅当两端都支持并希望使用，且底层网络支持时才被使用。

全长（Total Length）：这个16位字段定义了报文总长，包含首部和数据，单位为字节。这个字段的最小值是20（20字节首部+0字节数据），最大值是216-1=65,535。IP规定所有主机都必须支持最小576字节的报文，这是假定上层数据长度512字节，加上最长IP首部60字节，加上4字节富裕量，得出576字节，但大多数现代主机支持更大的报文。当下层的数据链路协议的最大传输单元（MTU）字段的值小于IP报文长度时，报文就必须被分片，详细见下个标题。

标识符（Identification）：占16位，这个字段主要被用来唯一地标识一个报文的所有分片，因为分片不一定按序到达，所以在重组时需要知道分片所属的报文。每产生一个数据报，计数器加1，并赋值给此字段。一些实验性的工作建议将此字段用于其它目的，例如增加报文跟踪信息以协助探测伪造的源地址。

标志 （Flags）：这个3位字段用于控制和识别分片，它们是：

- 位0：保留，必须为0。
- 位1：禁止分片（Don’t Fragment，DF），当DF=0时才允许分片。
- 位2：更多分片（More Fragment，MF），MF=1代表后面还有分片，MF=0 代表已经是最后一个分片。

如果DF标志被设置为1，但路由要求必须分片报文，此报文会被丢弃。这个标志可被用于发往没有能力组装分片的主机。

当一个报文被分片，除了最后一片外的所有分片都设置MF为1。最后一个片段具有非零片段偏移字段，将其与未分片数据包区分开，未分片的偏移字段为0。

分片偏移 （Fragment Offset）：这个13位字段指明了每个分片相对于原始报文开头的偏移量，以8字节作单位。

存活时间（Time To Live，TTL）：这个8位字段避免报文在互联网中永远存在（例如陷入路由环路）。存活时间以秒为单位，但小于一秒的时间均向上取整到一秒。在现实中，这实际上成了一个跳数计数器：报文经过的每个路由器都将此字段减1，当此字段等于0时，报文不再向下一跳传送并被丢弃，最大值是255。常规地，一份ICMP报文被发回报文发送端说明其发送的报文已被丢弃。这也是traceroute的核心原理。

协议 （Protocol）：占8bit，这个字段定义了该报文数据区使用的协议。IANA维护着一份协议列表（最初由RFC 790定义），详细参见IP协议号列表。

首部检验和 （Header Checksum）：这个16位检验和字段只对首部查错，不包括数据部分。在每一跳，路由器都要重新计算出新的首部检验和并与此字段进行比对，如果不一致，此报文将会被丢弃。重新计算的必要性是因为每一跳的一些首部字段（如TTL、Flag、Offset等）都有可能发生变化，不检查数据部分是为了减少工作量。数据区的错误留待上层协议处理——用户数据报协议（UDP）和传输控制协议（TCP）都有检验和字段。此处的检验计算方法不使用CRC。

RFC 1071

源地址（Source address）：一个IPv4地址由四个字节共32位构成，此字段的值是将每个字节转为二进制并拼在一起所得到的32位值。

例如，10.9.8.7是00001010000010010000100000000111。

但请注意，因为NAT的存在，这个地址并不总是报文的真实发送端，因此发往此地址的报文会被送往NAT设备，并由它被翻译为真实的地址。

目的地址（Destination address）：与源地址格式相同，但指出报文的接收端。

选项（Options）：附加的首部字段可能跟在目的地址之后，但这并不被经常使用，从1到40个字节不等。请注意首部长度字段必须包括足够的32位字来放下所有的选项（包括任何必须的填充以使首部长度能够被32位整除）。当选项列表的结尾不是首部的结尾时，EOL（选项列表结束，0x00）选项被插入列表末尾。下表列出了可能

字段｜长度（位）｜描述

备份｜1｜当此选项需要被备份到所有分片中时，设为1。

类｜2｜常规的选项类别，0为“控制”，2为“查错和措施”，1和3保留。

数字｜5｜指明一个选项。

长度｜8｜指明整个选项的长度，对于简单的选项此字段可能不存在。

数据｜可变｜选项相关数据，对于简单的选项此字段可能不存在。

- 注：如果首部长度大于5，那么选项字段必然存在并必须被考虑。
- 注：备份、类和数字经常被一并称呼为“类型”。

宽松的源站选路（LSRR）和严格的源站选路（SSRR）选项不被推荐使用，因其可能带来安全问题。许多路由器会拒绝带有这些选项的报文。

### 数据

数据字段不是首部的一部分，因此并不被包含在首部检验和中。数据的格式在协议首部字段中被指明，并可以是任意的传输层协议。

一些常见协议的协议字段值被列在下面：

协议字段值｜协议名｜缩写

1｜互联网控制消息协议｜ICMP

2｜互联网组管理协议｜IGMP

6｜传输控制协议｜TCP

17｜用户数据报协议｜UDP

41｜IPv6封装｜ENCAP

89｜开放式最短路径优先｜OSPF

132｜流控制传输协议｜SCTP

参见IP协议号列表以获得完整列表。

## 分片和组装

互联网协议（IP）是整个互联网架构的基础，可以支持不同的物理层网络，即IP层独立于链路层传输技术。不同的链路层不仅在传输速度上有差异，还在帧结构和大小上有所不同，不同MTU参数描述了数据帧的大小。为了实现IP数据包能够使用不同的链路层技术，需要将IP数据包变成适合链路层的数据格式，IP报文的分片即是IP数据包为了满足链路层的数据大小而进行的分割。

在IPv6不要求路由器执行分片操作，而是将检测路径最大传输单元大小的任务交给了主机。

### 分片

当设备收到IP报文时，分析其目的地址并决定要在哪个链路上发送它。MTU决定了数据载荷的最大长度，如IP报文长度比MTU大，则IP数据包必须进行分片。每一片的长度都小于等于MTU减去IP首部长度。接下来每一片均被放到独立的IP报文中，并进行如下修改：

- 总长字段被修改为此分片的长度。
- 更多分片（MF）标志被设置，除了最后一片。
- 分片偏移量字段被调整为合适的值。
- 首部检验和被重新计算。

例如，对于一个长20字节的首部和一个MTU为1,500的以太网，分片偏移量将会是：0、(1480/8)=185、(2960/8)=370、(4440/8)=555、(5920/8)=740、等等。

如果报文经过路径的MTU减小了，那么分片可能会被再次分片。

比如，一个4,500字节的数据载荷被封装进了一个没有选项的IP报文（即总长为4,520字节），并在MTU为2,500字节的链路上传输，那么它会被破成如下两个分片：

- ｜总长｜更多分片（MF）？｜DF｜分片偏移量

首部｜数据

1｜2500｜0｜0

20｜2480

2｜2040｜0｜310

20｜2020

现在，假设下一跳的MTU为1,500字节，那么每一个分片都会被再次分成两片（由于数据片段只有在目的主机才重新被组成数据报，因此再次分片是针对每个在网络中传输的数据帧）：

- ｜总长｜更多分片（MF）？｜DF｜分片偏移量

首部｜数据

1｜1500｜0｜0

20｜1480

2｜1020｜0｜185

20｜1000

3｜1500｜0｜310

20｜1480

4｜560｜0｜495

20｜540

第3和4片是从原始第2片再次分片而来，所以除了分片后的最后一个分片外MF为都为1。

### 重组

当一个接收者发现IP报文的下列项目之一为真时：

- DF标志为0。
- 分片偏移量字段不为0。

它便知道这个报文已被分片，并随即将数据、标识符字段、分片偏移量和更多分片标志一起储存起来。

当接受者收到了更多分片标志未被设置的分片时，它便知道原始数据载荷的总长。一旦它收齐了所有的分片，它便可以将所有片按照正确的顺序（通过分片偏移量）组装起来，并交给上层协议栈。

## 辅助协议

互联网协议定义并激活了网络层，它使用一个逻辑地址系统。IP地址并不以任何永久的方式绑定到硬件，而且事实上一个网络接口可以有许多IP地址。为了正确地交付一份报文，主机和路由器需要其它机制来识别设备接口和IP地址之间的关联。地址解析协议（ARP）为IPv4执行这种IP地址到物理地址（MAC地址）的转换。

此外，反向操作有时候也是必须的，比如，一台主机在启动时需要知道自己的IP地址（除非地址已经被管理员预先设置）。目前被用于这一用途的协议有动态主机设置协议（DHCP）、引导协议（BOOTP）和比较不常用的RARP。

## 外部链接

- RFC 791 — Internet Protocol
- RFC 3344 — IPv4 Mobility
- IANA — 互联网地址分配局官方网站
- IP Header Breakdown, including specific options
- IPv6 vs. carrier-grade NAT/squeezing more out of IPv4
- IPv4特殊用途地址

地址耗尽：

- RIPE report on address consumption as of October 2003
- Official current state of IPv4 /8 allocations, as maintained by IANA
- Dynamically generated graphs of IPv4 address consumption with predictions of exhaustion dates — Geoff Huston
- IP addressing in China and the myth of address shortage
- Countdown of remaining IPv4 available addresses (estimated)