2013-03-15 73 views
2

參考this問題和ASIO libary,我想知道ICMP v6回覆包的最大尺寸是多少。我正在使用ASIO庫來偵聽並接收ICMPv6數據包,但我不知道使用什麼大小的緩衝區來防止緩衝區溢出。我很困惑支持IPv6的擴展頭。ICMP IPv6包的最大尺寸

防爆代碼:

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

回答

5

一個Boost.Asio的的buffers的強大功能在於它是一種針對緩衝區溢出保護。 Boost.Asio的緩衝區將句柄與實際內存和大小配對在一起。因此,只要正確設置或推導大小,則Boost.Asio操作不會產生緩衝區溢出。

儘管如此,ICMPv6大小的詳細信息如下。 IPv6 Header是40個字節,並保留2個字節來表示有效載荷長度。因此,IPv6的最大有效載荷(包括擴展標頭)爲65,535。這不同於IPv4,其中全長包括頭本身。​​是8個字節。

因此:

  • 最大IPv6數據包是65575個字節(65,535的40 +頭最大有效載荷)。
  • 最大IPv6有效負載是65,535字節。
  • 最大ICMPv6 Echo Reply正文爲65,527個字節。 (最大有效負載爲65,535 - ICMPv6 Echo Reply Header爲8)。
+0

謝謝,非常明確的答案! – 2013-03-16 02:41:52

+0

參考我的代碼示例,如果使用:icmpV6Socket-> receive(replyBuffer.prepare(65575)),那麼replyBuffer中沒有溢出的機會吧? – 2013-03-16 02:48:15

+0

@MarcusFrenkel:如果您在_any_中使用['streambuf :: prepare()'](http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_streambuf/prepare.html)值,它不會導致緩衝區溢出。因此,是的。使用65575不會導致緩衝區溢出。 – 2013-03-16 03:12:42