IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20
目的
“
确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20
”
IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20
测试步骤
“
Tester:发送一条ICMPv4 Echo Request报文 DUT:生成一条ICMPv4 Echo Reply报文,包含Total Length字段,大于等于20 ”
step 2的描述在3.0版本中发生了改变,更通俗易懂了
期望结果
“
2, DUT:生成一条ICMPv4 Echo Reply报文,包含Total Length字段,大于等于20
”
CANoe TC8
参考
Derived from RFC791, section 3.1
这应该不用多做解释了
IPv4_HEADER_02: Ensure that the DUT discards an IPv4 Packet with an invalid Header Length
目的
“
确保当DUT接收到的IPv4报文的IPv4首部的Header Length字段不足20时,丢弃该报文
”
IPv4协议首部中的Header Length字段表示IPv4首部长度,这个长度不能小于20,如果小于,就说明此IP报文无效
测试步骤
“
Tester:发送一条首部长度小于20的ICMPv4 Echo Request报文 DUT:不发送ICMPv4 Echo Reply ”
期望结果
“
2, DUT安静地丢弃这条报文
”
在3.0版本上,期望结果的描述有出入,“DUT:不发送ICMPv4 Echo Reply”,其实是一样的
CANoe TC8
参考
Derived from RFC791, section 3.1
“
IHL: 4 bits
“
Internet Header Length is the length of the internet header in 32 bit words, and thus points to the beginning of the data. Note that the minimum value for a correct header is 5.
”
”
“
Internet Header Length是网络层报头的长度,以32个bit表示,因此指向数据的起始位。请注意,正确的首部的IHL最小值为5
”
上面这句话有两个细节点
-
IHL以32个bit表示,说明它的单位为4字节
什么意思
也就是说如果IHL的值为1,就表示IPv4首部长度为1×4字节,如果IHL为5,就表示首部长度为5×4字节
这也就是上面那段话中为什么说正确的首部的IHL最小值为5的原因
-
IHL指向数据的起始位
什么意思,或者说为什么要有IHL
因为IPv4首部长度其实是可变的,因为有option字段,所以必须要有一个字段表示首部长度,这样网络层才能知道除了首部以外哪些数据是payload
所以,如果IHL为5,就表示,第20个字节开始(第一个字节的下标为0计算),就是数据的起始位了
IPv4_HEADER_03: Ensure that the DUT generates an IPv4 Packet with the Source Address being one of its IPv4 Addresses
目的
“
确保DUT生成的IPv4报文中的源IP地址是它定义中的IP地址中的其中一个
”
其实我觉得这条没有必要,因为我组装的一条报文的源地址可以随意填写,并不需要一定是自己主机中的IP地址,当然,正确的TCP/IP通信中的源IP地址应该要填入源主机的IP地址
测试步骤
“
Tester:发送一条ICMPv4 Echo Request报文 DUT:生成一条ICMPv4 Echo Reply,源地址是其定义的IPv4地址之一 ”
期望结果
“
2, DUT:发送一条IPv4报文,其中源地址是其定义的IPv4地址之一
”
期望结果的描述在3.0版本中有所不同,“DUT:生成一条ICMPv4 Echo Reply,源地址是其定义的IPv4地址之一”
CANoe TC8
参考
Derived from RFC791 section 3.1, 3.2, RFC1122 section 3.2.1.3
我在RFC791的3.2章节中找到这样的一段话
“
The local address, assigned by the local network, must allow for a single physical host to act as several distinct internet hosts. That is, there must be a mapping between internet host addresses and network/host interfaces that allows several internet addresses to correspond to one interface. It must also be allowed for a host to have several physical interfaces and to treat the datagrams from several of them as if they were all addressed to a single host.
”
“
由本地网络分配的本地地址必须允许单个物理主机充当多个不同的Internet主机。也就是说,互联网主机地址和网络/主机接口之间必须有一个映射,允许多个互联网地址对应一个接口。还必须允许主机具有多个物理接口,并将来自其中多个接口的数据报视为全部寻址到单个主机
”
也就是说
“
一台主机允许有多个物理接口,这里的物理接口应该指的是多块物理网卡,一个物理接口允许对应多个主机地址,也就是IP地址,也就是说,一块网卡上,可以虚拟多个网卡,每个网卡都可以配置IP地址
”
IPv4_HEADER_04: Ensure that the DUT discards an IPv4 Packet with an incorrect Destination Address
目的
“
确保当DUT接收到的IPv4报文的目的地址不是DUT的地址,也不是广播地址和组播地址时,安静地丢弃它
”
这里提到安静两个字,说明DUT收到目的地址不是自己的报文时,并不会发送ICMPv4目的不可达等类型的报文
测试步骤
“
Tester:发送一条目的IP地址不是DUT的ICMPv4 Echo Request DUT:不发送ICMPv4 Echo Reply ”
期望结果
“
2, DUT:安静地丢弃IPv4报文
”
期望结果的描述在3.0版本上有所区别,“DUT:不发送ICMPv4 Echo Reply”
CANoe TC8
参考
Derived from RFC791 section 3.1, 3.2, RFC1122 section 3.2.1.3
RFC1122 section 3.2.1.3中有相关规定
“
A host MUST silently discard an incoming datagram that is not destined for the host. An incoming datagram is destined for the host if the datagram’s destination address field is:
(1) (one of) the host’s IP address(es);or
(2) an IP broadcast address valid for the connected network; or
(3) the address for a multicast group of which the host is a member on the incoming physical interface.”
“
主机必须安静地丢弃不以主机为目的地地传入数据报,如果数据报的目的地址字段为以下情况,表明传入的数据报以主机为目的地:
主机IP地址中的其中一个 对连接的网络有效的广播地址 主机接入的物理接口是多播组成员的组播地址 ”
IPv4_HEADER_05: IP Maximum datagram length check
目的
“
所有主机都必须准备好接受最多576个字节的数据报
”
我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢
其实是因为当源主机不知道对方主机的接受IP数据报的能力时,源主机默认发送IP数据报的长度不超过576,而目的主机必须有能力接受576个字节的IP报文,但是不代表不能接受更大长度的报文
测试步骤
“
Tester:发送一条ICMPv4 Echo Request报文,其中IP Total Length字段设为576,IP payload包含556个字节 Tester:监听在网卡上 DUT:发送ICMPv4 Echo Reply Tester:验证ICMP Echo Reply报文里的Identifier、Sequence Number和Data,与ICMP Echo Request相同
这里指的应该是ICMP协议首部里的Identifier、Sequence Number和Data”
期望结果
“
3, DUT:发送ICMPv4 Echo Request
4, Tester:验证ICMP Echo Reply报文里的Identifier、Sequence Number和Data,与ICMP Echo Request相同”
CANoe TC8
参考
Derived from RFC 791 s3.1 p13 Internet Header Format (MUST)
“
Total Length is the length of the datagram, measured in octets, including internet header and data. This field allows the length of a datagram to be up to 65,535 octets. Such long datagrams are impractical for most hosts and networks. All hosts must be prepared to accept datagrams of up to 576 octets (whether they arrive whole or in fragments). It is recommended that hosts only send datagrams larger than 576 octets if they have assurance that the destination is prepared to accept the larger datagrams.
”
“
Total Length是数据报的长度,以八位字节为单位,包括网络层报头和数据。该字段允许数据报的长度最多为65535个八位字节。对于大多数主机和网络来说,如此长的数据报是不切实际的。所有主机都必须准备好接受最多576个八位字节的数据报(无论它们是完整的还是分段的)。建议主机只有在能够确保目的主机已准备好接受更大的数据报时,发送大于576个八位字节的数据报
”
从这句话能看出,主机在不确定对方的接收范围时,默认发送不超过576个字节的IP报文(包括首部)
IPv4_HEADER_08: IP Header length validation
目的
“
测试DUT丢弃总长度小于IHL值暗示的数据包
”
什么意思
IHL表示IP数据报IP首部长度,以4字节为单位,比如有一条ICMP Echo Request报文,payload为“ECU NETWORK VALIDATION TEST”,那么这条报文的长度为20(IP Header)+ 8(ICMP Header)+ 27(ICMP payload)= 55,所以Total Length字段为55
但是由于IP IHL字段值为13,表示IP Header长度为13×4 = 52,那么这条报文的长度应该为52 + 8 + 27 = 87,这是IHL暗示的报文长度,这个长度比Total Length大,所以主机接收到这样的报文会丢弃
测试步骤
“
Tester:发送一条ICMP Echo Request报文,payload设置为“ECU NETWORK VALIDATION TEST”,IP首部中的IHL设置为13 Tester:监听在网卡上 DUT:不发送ICMP Echo Reply ”
期望结果
“
3, DUT:不发送ICMP Echo Reply
”
CANoe TC8
这里为什么payload只有最后3个字节呢,很明显,是在解析的时候,根本IHL判断,IP头部有52个字节,那么很明显,最后的payload就只有3个字节了
参考
Derived from RFC 791 s3.1 p11 Internet Header Format (MUST)
在文档中只定义了IHL的含义,挺简单的
IPv4_HEADER_09: IP Total Length validation
目的
“
测试DUT丢弃总长度大于实际传输数据的数据包
”
意思就是实际传输的IP数据报的总长度,大于Total Length字段值
测试步骤
“
Tester:发送一条ICMP Echo Request报文,ICMP payload为“ECU NETWORK VALIDATION TEST”,Total Length字段设置为48 Tester:监听在网卡上 DUT:不发送ICMP Echo Reply ”
期望结果
“
3, DUT:不发送ICMP Echo Reply
”
CANoe TC8
从二层的payload,能发现发送的IP数据报为55个字节,但是由于Total Length设置为48,造成网络层实际接收的数据只有48,48减去20个IP首部,再减去8个ICMP首部,最终只有20个字节的ICMP payload,导致最后的7个字节无法处理
参考
Derived from RFC 791 s3.1 p13 Internet Header Format (MUST)
Total Length那一章节,上面讲过了,这里不再赘述
原文始发于微信公众号(汽车网络诊断通信):TC8:IPv4_HEADER_01-09