IPv4报文是一种可变长报文,由“首部”和“载荷数据”两部分组成:
- 首部:从
Version
字段到Padding
字段为止,长度范围为[20字节,60字节]
,且要求长度须为4字节倍数 - 载荷数据:IPv4报文载荷数据,长度范围为
[0字节,65535字节-首部至少20字节=65515字节]
整个IPv4报文长度范围为[20字节,65535字节]
。
IPv4报文示意如下。
+--------------+--------------------+ | | | | Header | Payload Data | | | | +--------------+--------------------+
一、首部
首部逻辑上可分为两部分:
- 固定首部:从
Version
字段到Destination Address
字段为止,长度为定长20字节
- 可选首部 + 填充数据:在
Destination Address
字段和Payload Data
之间,长度范围为[0字节,40字节]
,且要求长度须为4字节倍数(只有如此,“首部长度须为4字节倍数”的要求才能得到满足)
IPv4报文首部示意图如下。
Offsets | Octet | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Version (4 bits) | Internet Header Length (IHL, 4 bits) | Differentiated Services Codepoint (DSCP, 6 bits) | Explicit Congestion Notification (ECN, 2 bits) | Total Length (16 bits) | |||||||||||||||||||||||||||
4 | 32 | Identification (16 bits) | Flags (3 bits) | Fragment Offset (13 bits) | |||||||||||||||||||||||||||||
8 | 64 | Time to Live (8 bits) | Protocol (8 bits) | Header Checksum (16 bits) | |||||||||||||||||||||||||||||
12 | 96 | Source Address (32 bits) | |||||||||||||||||||||||||||||||
16 | 128 | Destination Address (32 bits) | |||||||||||||||||||||||||||||||
20 | 160 | Options + Padding (variable bits) (if IHL > 5) | |||||||||||||||||||||||||||||||
⋮ | ⋮ | ||||||||||||||||||||||||||||||||
56 | 448 |
1.1、Version
中文名:版本
。
长度:4 bits。
含义:指明IP协议版本号,IPv4版本的话其值为0100
。
1.2、Internet Header Length (IHL)
中文名:首部长度
。
长度:4 bits。
含义:指明本IPv4报文首部长度,以4字节为单位,故首部长度必为4字节倍数,其值范围为[0101,1111]
,对应的首部长度范围为[20字节,60字节]
。最常用的就是20字节,即:只有固定首部,没有可选首部和填充数据。
1.3、Differentiated Services Codepoint (DSCP)[3]
中文名:区分服务代码点
。
长度:6 bits。
含义:
- 用来标识该IPv4报文的服务类型,在支持该字段的网络设备(一般是“路由器”)的配合下,可提供不同服务质量等级(Quality of Service,QoS)的IP服务
- 网络设备是否支持该字段、对该字段的支持程度、对该字段支持的具体落地方案等由生产厂商自决定
- 对于
恶意攻击流量恶意设置DSCP值,以期达成“攻击流量在网络中的优先级高于正常流量”目标
,是否可行以及可行情形如何应对,笔者不甚清晰[7]
1.3.1、支持DSCP字段的路由器的应对行为分类
支持DSCP字段的路由器的应对行为分为4类:
- Expedited Forwarding PHB (EF PHB):迅速转发PHB
- Assured Forwarding PHB (AF PHB):确保转发PHB
- Default Forwarding PHB (DF PHB):默认转发PHB
- Class Selector PHBs:该分类主要是为了兼容TOS
1.3.2、Service Class
见RFC 4594
。
1.3.3、DSCP说明
DSCP二进制 | DSCP十进制 | PHB | 细分 | Service Class |
---|---|---|---|---|
001,010 | 10 | AF | AF1 + 低丢弃优先级 | High-Throughput Data |
001,100 | 12 | AF | AF1 + 中丢弃优先级 | High-Throughput Data |
001,110 | 14 | AF | AF1 + 高丢弃优先级 | High-Throughput Data |
010,010 | 18 | AF | AF2 + 低丢弃优先级 | Low-Latency Data |
010,100 | 20 | AF | AF2 + 中丢弃优先级 | Low-Latency Data |
010,110 | 22 | AF | AF2 + 高丢弃优先级 | Low-Latency Data |
011,010 | 26 | AF | AF3 + 低丢弃优先级 | Multimedia Streaming |
011,100 | 28 | AF | AF3 + 中丢弃优先级 | Multimedia Streaming |
011,110 | 30 | AF | AF3 + 高丢弃优先级 | Multimedia Streaming |
100,010 | 34 | AF | AF4 + 低丢弃优先级 | Multimedia Conferencing |
100,100 | 36 | AF | AF4 + 中丢弃优先级 | Multimedia Conferencing |
100,110 | 38 | AF | AF4 + 高丢弃优先级 | Multimedia Conferencing |
101,110 | 46 | EF | / | Telephony |
001,000 | 8 | Class Selector | CS1 | Low-Priority Data |
010,000 | 16 | Class Selector | CS2 | OAM |
011,000 | 24 | Class Selector | CS3 | Broadcast Video |
100,000 | 32 | Class Selector | CS4 | Real-Time Interactive |
101,000 | 40 | Class Selector | CS5 | Signaling |
110,000 | 48 | Class Selector | CS6 | Network Control |
111,000 | 56 | Class Selector | CS7 | Reserved for future use |
000,000 | 0 | DF | / | Standard |
扩展说明:其他DSCP值默认对应DB PHB
和Standard Service Class
。
1.4、Explicit Congestion Notification (ECN)[4]
中文名:显式拥塞通知
。
长度:2 bits。
含义:网络层提供的显式拥塞控制标记,设计用来完善整个拥塞控制机制:
- 之前的拥塞控制机制——“传输层通过丢包感知到拥塞,进行拥塞控制”,其是隐式的,被动的,实际可根据路由器内排队情况提前预测是否拥塞,进行拥塞显式标记,以期提前介入,避免丢包,更快缓解拥塞,一般路由器只工作在网络层,故上述拥塞显式标记只能在网络层协议报文实现,此即ECN产生的背景
- 引入ECN后,传输层除了通过丢包感知拥塞之外,也可根据ECN感知拥塞
ECN值含义如表1。
表1
ECN值 | 含义 |
---|---|
00 | 不支持ECN的传输,非ECT (Non ECN-Capable Transport) |
10 | 支持ECN的传输,ECT (0) |
01 | 支持ECN的传输,ECT (1) |
11 | 发生拥塞,CE (Congestion Experienced) |
1.5、Total Length
中文名:总长度
。
长度:16 bits。
含义:整个IPv4报文的长度(单位是“字节”,最大值为2^16-1=65535
,即整个IPv4报文最大为65535个字节),包括“首部”和“载荷数据”。
1.6、Identification、Flags和Fragment Offset
首先介绍IPv4报文分片概念:
- 数据链路层协议都规定了一个该层协议报文能接收的上层协议递交数据的最大长度,该最大长度被称为最大传送单元MTU(Maximum Transfer Unit),比如以太网协议的MTU值为
1500个字节
。当IPv4报文总长度超过所使用数据链路层协议的MTU后,需要将该IPv4报文分割成几个,使得每个分割后IPv4报文总长度不超过MTU,该过程即为分片,在IPv4报文接收端会将属于同一个IPv4报文的分片报文重新组装成原IPv4报文 - 具体分片过程:
- 首部。复制原报文的首部,在复制过程中,部分字段保持不变,部分字段有所变化:1)保持不变字段——版本,首部长度,区分服务代码点,显式拥塞通知,标识,生存时间,协议,源地址,目的地址,可选首部,填充数据;2)有所变化:总长度,标志,片偏移,首部检验和
- 载荷数据。分片载荷数据的长度具体协议实现软件具体决定,只须满足两个限制条件:1)分片后分片总长度不超过MTU;2)假如分成N个分片,则前N-1个分片载荷数据长度为8字节的倍数
1、例子1
一个IPv4报文长度为3820字节(载荷数据长度为3800字节,首部长度为20字节),其使用的数据链路层协议的MTU为1500个字节
,须进行分片(示例中将分片载荷数据最大长度选为1400个字节
),分片后首部中变化字段情况描述如下。
/ | 总长度 | 标志(DF-MF) | 片偏移 | 首部检验和 |
---|---|---|---|---|
原始报文 | 3820 | 0-0 | 0 | 原始报文首部检验和 |
分片1报文 | 1420 | 0-1 | 0 | 分片1首部检验和,独立计算 |
分片2报文 | 1420 | 0-1 | 175(1400/8=175) | 分片2首部检验和,独立计算 |
分片3报文 | 1020 | 0-0 | 350(2800/8=350) | 分片3首部检验和,独立计算 |
以上分片2报文假定经过一个网络,其使用的数据链路层协议的MTU为1000个字节
,须进行再分片(示例中将分片载荷数据最大长度选为800个字节
),分片后首部中变化字段情况描述如下。
/ | 总长度 | 标志(DF-MF) | 片偏移 | 首部检验和 |
---|---|---|---|---|
分片2-1报文 | 820 | 0-1 | 175(1400/8=175) | 分片2-1首部检验和,独立计算 |
分片2-2报文 | 620 | 0-1 | 275(2200/8=275) | 分片2-2首部检验和,独立计算 |
2、例子2
一个IPv4报文长度为1508字节(载荷数据长度为1488字节,首部长度为20字节),其使用的数据链路层协议的MTU为1500个字节
,须进行分片(示例中将分片载荷数据最大长度选为800个字节
),分片后首部中变化字段情况描述如下。
/ | 总长度 | 标志(DF-MF) | 片偏移 | 首部检验和 |
---|---|---|---|---|
原始报文 | 1508 | 0-0 | 0 | 原始报文首部检验和,独立计算 |
分片1报文 | 820 | 0-1 | 0 | 分片1首部检验和,独立计算 |
分片2报文 | 708 | 0-0 | 100(800/8=100) | 分片2首部检验和,独立计算 |
1.6.1、Identification
中文名:标识
。
长度:16 bits。
含义:IPv4协议实现程序维持一个计数器,每产生一个IPv4报文,计数器就加1,并将此值赋值给该报文的标识字段,标识字段作为该IPv4报文的“标识”,不是序号。当报文不分片时,该标识无实际意义;当报文分片时,分片报文会复制原报文的标识字段,接收端据此会将属于同一个IPv4报文的分片报文重新组装成原IPv4报文。
1.6.2、Flags
中文名:标志
。
长度:3 bits。
含义:共3位,现在只有后面两位有意义:
- 最低位记为MF(More Fragment):
MF=1
:表示后面还有分片MF=0
:1)在分片情形中,表示已是若干分片中最后一个;2)在未分片情形中,表示即原报文本身
- 次低位记为DF(Don’t Fragment):
DF=1
:表示不能分片,即便报文总长度超过所使用链路层协议的MTU值(该种情形下,链路层协议实现程序一般那是丢弃该报文,并发送“ICMP Packet Too Big”报文),此时必有MF=0
[8]DF=0
:表示允许分片
1.6.3、Fragment Offset
中文名:片偏移
。
长度:13 bits。
含义:当报文不分片时,片偏移字段无实际意义;当报文分片时,片偏移字段的含义是:分片内载荷数据相对于原报文内载荷数据的偏移量,偏移量的具体计算公式为偏移字节数/8(偏移字节数必为8的倍数,这跟上面“假如分成N个分片,则前N-1个分片载荷数据长度为8字节的倍数”的论述是相对应的)
,具体例子可参见“例子1”和“例子2”。
1.7、Time to Live
中文名:生存时间
。
长度::8 bits。
含义:生存时间,用于限制数据包在网络上的生存时间,防止数据包在网络中无限循环堵塞网络。在最初设计和实现中,其以秒为单位,报文在经过一个路由器时,该报文的TTL值会被减去在该路由器所耗费的时间,当TTL值减为0时,该报文就会被该路由器丢弃。后来随着技术发展,路由器处理报文的时间远小于1秒,但至少每次减1,因此演变成“跳数限制,每经过一个路由器转发就减去1,减至0后被路由器丢弃”。
1.8、Protocol
中文名:协议
。
长度:8 bits。
含义:报文载荷数据对应的协议,这个协议一般是传输层协议(“TCP”和“UDP”),但也可能是其他协议,比如“IP(指的是IPv4报文再封装到IPv4报文中)”,“IPv6(指的是IPv6报文再封装到IPv4报文中)”。常见值及对应的协议见下表。
协议名 | ICMP | IGMP | IP | TCP | EGP | IGP | UDP | IPv6 | ESP | AH | ICMP-IPv6 | OSPF |
---|---|---|---|---|---|---|---|---|---|---|---|---|
字段值 | 1 | 2 | 4 | 6 | 8 | 9 | 17 | 41 | 50 | 51 | 58 | 89 |
1.9、Header Checksum
中文名:首部检验和
。
长度:16 bits。
含义:用来标识报文首部是否被篡改,须注意——通过首部检验和的检验是首部未被篡改的必要不充分条件。其具体工作机制是:在报文发送端,首先将首部检验和字段置为全0,然后将报文首部以16 bits为一组分成多组(由于首部长度是4字节的倍数,故正好能划分成整数组),执行反码算术运算求和 + 取反码
运算,将结果置入首部检验和字段,后续每个路由器都执行上述运算过程,根据上述运算过程的特点,合法结果值应该是0,如果非0,表示必被篡改,直接丢弃。
1.10、Source Address
中文名:源地址
。
长度:32 bits。
含义:源IP地址。
1.11、Destination Address
中文名:目的地址
。
长度:32 bits。
含义:目的IP地址。
1.12、Options和Padding
Internet Header Length(IHL)
字段指出首部长度范围是[20字节,60字节]
,而固定首部为定长20字节
,那么“Options”和“Padding”字段合起来的长度范围为[0字节,40字节]
。
又要求首部长度须为4字节倍数,固定首部为20字节
,所以“Options”和“Padding”字段合起来的长度也须为4字节倍数。
1.12.1、Options
中文名:可选首部
。
长度:可变。“Options”和“Padding”字段合起来的长度范围为[0字节,40字节]
,且须为4字节倍数。
含义:可选首部,用于扩展IPv4头部,实际不常用。
1.12.2、Padding
中文名:填充数据
。
长度:可变。“Options”和“Padding”字段合起来的长度范围为[0字节,40字节]
,且须为4字节倍数。
含义:零字节填充数据,确保“Options”和“Padding”字段合起来的长度为4字节倍数。
二、载荷数据
结合“1.5、Total Length”小节和“1.2、Internet Header Length (IHL)”小节可知:载荷数据长度范围为[0字节,65535字节-首部至少20字节=65515字节]
。
参考文献
[1]https://en.wikipedia.org/wiki/IPv4#Packet_structure
[2]https://datatracker.ietf.org/doc/html/rfc791
[3]https://datatracker.ietf.org/doc/html/rfc2474
[4]https://datatracker.ietf.org/doc/html/rfc3168
[5]https://en.wikipedia.org/wiki/Differentiated_services
[6]https://zh.wikipedia.org/wiki/%E6%98%BE%E5%BC%8F%E6%8B%A5%E5%A1%9E%E9%80%9A%E7%9F%A5
[7]https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10314996
[8]https://support.huawei.com/enterprise/en/doc/EDOC1100278546/bc7714b7/understanding-mtu
[9]https://zh.wikipedia.org/wiki/IP%E5%8D%8F%E8%AE%AE%E5%8F%B7%E5%88%97%E8%A1%A8