参考 <The TCP/IP Guide> http://tcpipguide.com
文章目录
IPv4 数据报的一般格式
Version
用于标识生成该数据报的 IP 版本。对于 IPv4 这里的值为 4。
IHL (Internet Header Length)
以 32 比特为一个单位指出 IP 头的长度,包括选项和填补部分,当没有选项时这个值为 5。
TOS (Type Of Service)
携带 IP 数据报的服务质量特征信息,如优先传递,其含义后来被重新定义以供称为差异化服务 (Differentiated Services, DS) 的技术使用。
子字段 | 长度 (bits) | 描述 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Precedence | 3 | 指示数据报的优先级,下面有八个定义的值,从最低到最高
| ||||||||||||||||||
D | 1 | 如果需要低延迟传输则设为 1,否则为 0 | ||||||||||||||||||
T | 1 | 如果需要更高吞吐量传输则设为 1,否则为 0 | ||||||||||||||||||
R | 1 | 如果需要更可靠的传输则设为 1,否则为 0 | ||||||||||||||||||
Reserved | 2 | 保留 |
TL (Total Length)
以字节 (byte) 为单位指出 IP 数据报的总长度。因为这个字段只有 16 bits 所以 IP 数据报的最大长度为 65,535 Bytes,实际上大多数都远小于这个上限。
Identification
这个字段的值对于属于同一数据报的碎片是相同的,这样接收方在重组时才能分辨哪些碎片是属于一个数据报的。
Flags
用来管理碎片。
子字段名称 | 长度 (bits) | 描述 |
---|---|---|
Reserved | 1 | 保留 |
DF | 1 | 值为 1 时表示该数据报不能被分片,因为分片操作对更高层的协议不可见,所以很多时候不会设置这个值。但也不是没用,常用与测试最大 MTU |
MF | 1 | 值为 0 时表示该数据报为最后一块碎片;值为 1 时表示后面还有若干数据报碎片。 |
Fragment Offset
当数据报被分片时,这个字段指出当前碎片在原数据报中的偏移量或位置,以 8 Bytes 为一个单位,第一个碎片的偏移量为 0。
TTL (Time To Live)
指出数据报允许在互联网中存活的时间,没经过一个路由器,路由器就会将这个值减 1,当这个值为 0 时路由器将丢弃该数据报不再转发。这其实是指出数据报的最多跳数而非时间。
Protocol
指出数据报中携带的更高层协议。
值(16 进制) | 值(10 进制) | 协议 |
---|---|---|
00 | 0 | 保留 |
01 | 1 | ICMP |
02 | 2 | IGMP |
03 | 3 | GGP |
04 | 4 | IP-in-IP Encapsulation |
06 | 6 | TCP |
08 | 8 | EGP |
11 | 17 | UDP |
32 | 50 | Encapsulating Security Payload (ESP) Extension Header |
33 | 51 | Authentication Header (AH) Extension Header |
Header Checksum
仅计算报头的校验和,以提供对传输中的损坏的基本保护,不对数据进行校验和。
Source Address & Destination Address
源地址和目标地址。
Options
每个 IP 选项都有自己的 子字段格式,下图和表表示通用选项格式:
子字段名称 | 长度 (Bytes) | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Option Type | 1 | 这 8 bits 被分成如下三个子子字段
| ||||||||||||
Option Length | 0 or 1 | 以 Byte 为单位指出变长选项的长度,包括这里所说的三个子字段。 | ||||||||||||
Option Data | 0 or Variable | 为变长选项提供,包含选项要发送的数据。 |
Option Class | Option Number | Length (Bytes) | Option Name | Description |
---|---|---|---|---|
0 | 0 | 1 | End Of Options List | 只含有一个 0 Byte 的选项,用来标记选项列表的结尾。 |
0 | 1 | 1 | No Operation | 虚拟选项,用于内部填充,用于一些需要 32-bit 对齐的选项。 |
0 | 2 | 11 | Security | 为军方提供的选项,用于指示 IP 数据报的安全分类。 |
0 | 3 | Variable | Loose Source Route | 包含一个 IP 地址列表,用来指定数据报必须准确、按顺序使用所给 IP 地址列表的路由器到达终点,途中可以使用列表外的路由器做中间跳转。 |
0 | 7 | Variable | Record Route | 如果数据报含有这个选项,那么处理这个数据报的路由器会将自己的 IP 地址添加到这个选项中,这样接收方就可以提取地址列表查看数据报采用的路由。 因为这个选项的长度是由发送该数据报的设备设置的,它不会在路由途中增大,所以,如果在到达目的之前该选项已经填满,那么将只记录了部分路由。 |
0 | 9 | Variable | Strict Source Route | 和 Loose Source Route 选项类似,但是不允许列表外的路由器做中间跳转。 |
2 | 4 | Variable | Timestamp | 和 Record Route 选项类似,不同的是处理该数据报的路由器往选项里添加的是时间戳,这样接收方就可以知道数据报在各个路由器之间传输所用的时间。途中同样不能修改该选项的长度。 |
2 | 18 | 12 | Traceroute | 用于 traceroute 程序的增强。 |
Padding
如果有选项,使得报头长度不为 32 bits 的倍数,就用 0 去填补,使得报头长度始终为 32 bits 的倍数。
Data
要传送的数据。