ICMP 消息中包含 IP 数据报的前八个字节?
好吧,发送方可能想知道 ICMP 消息所指的是它的哪些数据包。为此,整个 IP 标头加上(至少)IP 有效载荷的前 8 个字节被附加到错误消息的 ICMP 标头中。
查看RFC 792:
主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
你的理解是错误的。
这 8 个字节是 IP 有效载荷的字节,并且是对导致错误的数据包的完整 IP 标头的补充。通常,这 8 个字节将是传输协议标头的一部分。它们可用于将 ICMP 错误与连接匹配,甚至可能是导致它的单个数据包。
此外,虽然 RFC 792 说应该包括 8 个字节的有效载荷,但 RFC 1812 指出 ICMP 错误应该包括尽可能多的原始数据包(在 ICMP 数据包大小的 576 字节限制内)。这样做的动机是支持在隧道场景中对 ICMP 错误进行合理的处理。
我不确定你指的是什么定义(来源?),但它可能意味着 8 位。
一个ICMP数据包共8个字节[1],前16位是类型和代码字节(一个字节中的8位);类型字节被赋予一个从 0 到 255[2] 的数字,不同的数字代表不同类型的子代码。
正如 Zac67 所说,发送方通常喜欢知道 ICMP 数据包来自哪里,因此它将其封装在 IP 标头中,当 ICMP 数据包携带在有效载荷中时,该 IP 标头包含一个称为“协议”的字段,协议字段被设置[ 3] 到 1(十六进制的 0x01 或二进制的 00000001),协议字段也是位(1 字节)长。
以下是一些有用的资源和来源。希望这可以帮助。
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol
http://slideplayer.com/slide/3602717/
http://www.pearsonicertification.com/articles/article.aspx?p=1804873
[1] - http://www.keyboardbanger.com/wp-content/uploads/2015/07/ICMP-header.png
[2] - https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Control_messages
[3] - https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers