【问题标题】:Maximum size of ICMP IPv6 packetICMP IPv6 数据包的最大大小
【发布时间】:2013-03-15 14:00:35
【问题描述】:

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

Ex 代码:

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

【问题讨论】:

    标签: boost-asio ipv6 ping icmp


    【解决方案1】:

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

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

    因此:

    • 最大 IPv6 数据包为 65,575 字节(最大有效负载为 65,535 + 标头为 40)。
    • 最大 IPv6 负载为 65,535 字节。
    • ICMPv6 Echo 回复正文的最大长度为 65,527 字节。 (最大有效负载为 65,535 - ICMPv6 Echo 回复标头为 8)。

    【讨论】:

    • 参考我的代码示例,如果我使用:icmpV6Socket->receive(replyBuffer.prepare(65575)),replyBuffer 就没有溢出的机会吧?
    • @MarcusFrenkel:如果您使用带有 any 值的streambuf::prepare(),它不会导致缓冲区溢出。因此,是的。使用 65575 不会导致缓冲区溢出。
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2015-05-17
    相关资源
    最近更新 更多