2

参考这个问题和ASIO libary,我想知道 ICMP v6 回复数据包的最大大小是多少。我正在使用 ASIO 库来侦听和接收 ICMPv6 数据包,但我不知道要使用什么大小的缓冲区来防止缓冲区溢出。我对支持 IPv6 的扩展标头感到困惑。

防爆代码:

asio::streambuf replyBuffer;
replyBuffer.consume(replyBuffer.size());
size_t length = icmpV6Socket->receive(replyBuffer.prepare(65536) );
4

1 回答 1

6

Boost.Asio 的缓冲区的一大特点是它们提供了防止缓冲区溢出的保护。Boost.Asio 的缓冲区将实际内存和大小的句柄配对在一起。因此,只要正确设置或推导出大小,Boost.Asio 操作就不会产生缓冲区溢出。

尽管如此,ICMPv6 大小的详细信息如下。 IPv6 Header为 40 字节,预留 2 字节表示 Payload Length。因此,IPv6 的最大有效负载(包括扩展标头)为 65,535。这与 IPv4 不同,其中总长度包括标头本身。ICMPv6 Echo Reply 标头为8 个字节。

所以:

  • IPv6 数据包的最大长度为 65,575 字节(最大有效负载为 65,535 + 标头为 40)。
  • 最大 IPv6 有效负载为 65,535 字节。
  • ICMPv6 Echo Reply 正文的最大长度为 65,527 字节。(最大有效载荷为 65,535 - ICMPv6 Echo Reply Header of 8)。
于 2013-03-15T20:10:16.577 回答