IPv4报文是一种可变长报文,由“首部”和“数据”两部分组成:
- 首部:由“固定首部”和“可选首部”两部分组成,长度范围为
[20字节,60字节]
- 固定首部:从
版本
字段到目的地址
字段为止,长度为定长20字节
- 可选首部:在
目的地址
字段和数据
字段之间,长度范围为[0字节,40字节]
,且为4字节倍数
- 固定首部:从
- 数据:IPv4报文数据,长度范围为
[0字节,65535字节-20字节=65515字节]
整个IPv4报文长度范围为[20字节,65535字节]
。
下表是上述3部分的示意。
固定首部 | 可选首部 | 数据 |
下表是固定首部的示意。
版本(4 bits) | 首部长度(4 bits) | 区分服务(8 bits) | 总长度(16 bits) | ||||||||||||||||||||||||||||
标识(16 bits) | 标志(3 bits) | 片偏移(13 bits) | |||||||||||||||||||||||||||||
生存时间(8 bits) | 协议(8 bits) | 首部检验和(16 bits) | |||||||||||||||||||||||||||||
源地址(32 bits) | |||||||||||||||||||||||||||||||
目的地址(32 bits) |
一、固定首部
1.1、版本
英文名:Version
。
长度:4 bits。
含义:指明IP协议版本号,IPv4版本的话其值为0100
。
1.2、首部长度
英文名:Header Length
。
长度:4 bits。
含义:指明本IPv4报文首部长度,以4字节为单位,故首部长度必为4字节倍数,其值范围为[0101,1111]
,对应的首部长度范围为[20字节,60字节]
。最常用的就是20字节,即:只有固定首部,没有可选首部。
1.3、区分服务
英文名:Differentiated Services Field (DS)
。
长度:8 bits。
含义:分为“6 bits的区分服务代码点(Differentiated Services Codepoint,DSCP)”和“2 bits的显式拥塞通知(Explicit Congestion Notification,ECN)”两部分:1)前者可用来标识该IPv4报文数据的服务类型,在支持该字段的网路设备(一般是“路由器”)的配合下,可提供不同服务质量等级(Quality of Service,QoS)的IP服务;2)后者用来扩展拥塞控制机制。
扩展说明:
- 之前该字段被设计作为“服务类型(Type of Service,TOS)”,已废弃,被DS替代
- 网络设备是否支持该字段、对该字段的支持程度、对该字段支持的具体落地方案等由生产厂商自决定
1.3.1、DSCP
用于区分不同服务。
备注:对于恶意攻击流量恶意设置DSCP值,以期达成“攻击流量在网络中的优先级高于正常流量”目标
,是否可行以及可行情形如何应对,笔者不甚清晰。[3]
1.3.1.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.1.2、Service Class
见RFC 4594
。
1.3.1.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.3.2、ECN
ECN:设计用来完善整个拥塞控制机制。
之前的拥塞控制机制:传输层通过丢包感知到拥塞,进行拥塞控制。
ECN——网络层提供的显式拥塞控制标记:
- 之前的拥塞控制是隐式的,被动的,实际可根据路由器内排队情况提前预测是否拥塞,进行拥塞显式标记,以期提前介入,避免丢包,更快缓解拥塞,一般路由器只工作在网路层,故上述拥塞显式标记只能在网络层协议报文实现,此即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.4、总长度
英文名:Total Length
。
长度:16 bits。
含义:整个IPv4报文的长度(单位是“字节”,最大值为2^16-1=65535
,即整个IPv4报文最大为65535个字节),包括“首部”和“数据”。
1.5、标识、标志和片偏移
首先介绍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.5.1、标识
英文名:Identification
。
长度:16 bits。
含义:IPv4协议实现程序维持一个计数器,每产生一个IPv4报文,计数器就加1,并将此值赋值给该报文的标识字段,标识字段作为该IPv4报文的“标识”,不是序号。当报文不分片时,该标识无实际意义;当报文分片时,分片报文会复制原报文的标识字段,接收端据此会将属于同一个IPv4报文的分片报文重新组装成原IPv4报文。
1.5.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
[4]DF=0
:表示允许分片
1.5.3、片偏移
英文名:Fragment offset
。
长度:13 bits。
含义:当报文不分片时,片偏移字段无实际意义;当报文分片时,片偏移字段的含义是:分片内数据相对于原报文内数据的偏移量,偏移量的具体计算公式为偏移字节数/8(偏移字节数必为8的倍数,这跟上面“假如分成N个分片,则前N-1个分片数据长度为8字节的倍数”的论述是相对应的)
,具体例子可参见“例子1”和“例子2”。
1.6、生存时间
英文名:Time to Live
。
长度::8 bits。
含义:生存时间,用于限制数据包在网络上的生存时间,防止数据包在网络中无限循环堵塞网络。在最初设计和实现中,其以秒为单位,报文在经过一个路由器时,该报文的TTL值会被减去在该路由器所耗费的时间,当TTL值减为0时,该报文就会被该路由器丢弃。后来随着技术发展,路由器处理报文的时间远小于1秒,但至少每次减1,因此演变成“跳数限制,每经过一个路由器转发就减去1,减至0后被路由器丢弃”。
1.7、协议
英文名: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.8、首部检验和
英文名:Header checksum
。
长度:16 bits。
含义:用来标识报文首部是否被篡改,须注意——通过首部检验和的检验是首部未被篡改的必要不充分条件。其具体工作机制是:在报文发送端,首先将首部检验和字段置为全0,然后将报文首部以16 bits为一组分成多组(由于首部长度是4字节的倍数,故正好能划分成整数组),执行反码算术运算求和 + 取反码
运算,将结果置入首部检验和字段,后续每个路由器都执行上述运算过程,根据上述运算过程的特点,合法结果值应该是0,如果非0,表示必被篡改,直接丢弃。
1.9、源地址
英文名:Source
。
长度:32 bits。
含义:源IP地址。
1.10、目的地址
英文名:Destination
。
长度:32 bits。
含义:目的IP地址。
二、可选首部
英文名:Options
。
长度:可变。结合“1.2、首部长度”小节和“固定首部定长20字节”可知:可选首部长度范围为[0字节,40字节]
,且须是4字节倍数,否则需要进行0字节填充。
含义:可选首部,用于扩展IPv4头部,实际不常用。
三、数据
结合“1.4、总长度”小节和“1.2、首部长度”小节可知:数据长度范围为[0字节,65535字节-20字节=65515字节]
。
参考文献
[1]https://en.wikipedia.org/wiki/Differentiated_services
[2]https://zh.wikipedia.org/wiki/%E6%98%BE%E5%BC%8F%E6%8B%A5%E5%A1%9E%E9%80%9A%E7%9F%A5
[3]https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=10314996
[4]https://support.huawei.com/enterprise/en/doc/EDOC1100278546/bc7714b7/understanding-mtu
[5]https://zh.wikipedia.org/wiki/IP%E5%8D%8F%E8%AE%AE%E5%8F%B7%E5%88%97%E8%A1%A8