6

类型为 11 时,即超过时间,ICMP 数据包负载的大小是多少?由于它包含一个 IP 标头和生成 ICMP 消息的 IP 数据包有效负载的前 8 个字节,我认为它的大小是 20 + 8 = 28。

我正在重放一些 TTL=1 的常见用户流量。在我转储的 ICMP 消息中,我注意到:

  • UDP 数据包生成的所有 ICMP 数据包的有效负载大小为 28 字节
  • 所有由 TCP 数据包生成的数据包的有效负载大小为 40 字节

由于我需要通过比较这些字节来将 ICMP 超时消息与触发它们的数据包相匹配,因此这条信息是必不可少的,但我无法弄清楚为什么会发生这种情况。

4

3 回答 3

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,第 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 层的所有信息。

于 2012-08-13T09:27:17.787 回答
1

正如您所指出的,ICMP 有效负载是 IP 标头加上原始数据包有效负载的 8 个八位字节。然而,IP 标头并不总是 20 个八位字节长。20只是最低限度。IP 报头本身可能包含选项,报头长度由报头的 IHL 字段中的值指示。请参阅 RFC 791 的第 3.1 节。所以看起来 TCP 数据包在其 IP 标头中有 12 个额外的八位字节选项。RFC 791 定义了一些标准选项,例如源路由和时间戳。您必须对标头进行解码以确定正在使用哪些选项。

于 2012-08-13T08:44:33.670 回答
1

我想补充一点,以供将来参考,ICMP 有效负载不仅如 Mike 所说的在大小上有所不同,在MPLS 的 ICMP 扩展的情况下,它们也可能超过128 字节。有关详细信息,请参阅此草稿

于 2013-07-29T22:58:42.990 回答