问题是您引用了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 层的所有信息。