类型为11时,ICMP数据包有效负载的大小是多少,即超过时间? 由于它包含IP报头和生成ICMP消息的IP数据包有效负载的前8个字节,我认为其大小为20 + 8 = 28。
我正在使用TTL = 1重播一些常见的用户流量。在我倾倒的ICMP消息中,我注意到:
由于我需要通过比较这些字节来匹配ICMP超时消息和触发它们的数据包,因此这条信息是必不可少的,但我无法弄清楚为什么会发生这种情况。
答案 0 :(得分:5)
问题是你从RFC 792, Page 4引用了8字节的报头有效负载,但RFC 1812改变了要求......
Time Exceeded Message (in RFC 792)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RFC 1812, Section 4.3.2.3显着增加了ICMP错误消息(强调我的)中允许的有效负载:
4.3.2.3原始邮件标题
过去,每个ICMP错误消息都包含Internet 标头和至少数据报的前8个数据字节 触发了错误。由于使用,这已不再适用 IP-in-IP隧道和其他技术。 因此,ICMP 数据报应该尽可能多地包含原始数据报 没有ICMP数据报的长度超过576字节。该 返回的IP头(和用户数据)必须与其相同 收到,但路由器不需要撤消任何 对通常在其中执行的IP头的修改 在检测到错误之前执行的转发(例如, 递减TTL或更新选项。)
您从Scapy数据包生成的ICMP错误应包含原始数据包的IP和TCP层的所有信息。
答案 1 :(得分:1)
如您所述,ICMP有效负载是IP报头加上原始数据包有效负载的8个八位字节。但是,IP头并不总是20个八位字节; 20只是最小的。 IP报头本身可以包含选项,报头长度由报头的IHL字段中的值指示。请参阅RFC 791的第3.1节。因此,看起来TCP数据包的IP标头中有12个额外的八位字节选项。 RFC 791定义了一些标准选项,例如源路由和时间戳。您必须解码标头以确定正在使用的选项。
答案 2 :(得分:1)
我想补充以备将来参考,不仅ICMP有效载荷的大小不同,如迈克所说,在 MPLS的ICMP扩展的情况下,它们也可能长于 128字节 即可。有关详细信息,请参阅this draft