0

IPv4 が問題であり、std::istream から IP および ICMP ヘッダーを抽出したい場合、最初に最初の 20 バイトを取得し、IPv4 ヘッダーで提供されるヘッダーの長さが 20 バイトより大きいかどうかを確認して、任意のオプション。次のバイトは ICMP パケットです。IPv4 ヘッダー内で保持されるヘッダー長の値を使用して、IP ヘッダーの予想サイズを確認できます。

しかし、IPv6 ヘッダーの正確なサイズを取得する方法は? ヘッダー拡張のサイズと ICMP などのより高いレベルのデータを含む IPv6 ヘッダー内のペイロード値があります。std::istream で ICMPv6 ヘッダーが開始する位置を知るために、ヘッダー拡張を含むが上位レベルのデータを含まない IPv6 ヘッダーのサイズを知る必要があります。

ありがとうございました!

4

1 に答える 1

12

IPv6ヘッダーのサイズは40バイトに固定されていますが、ご存知のように、トランスポート層データグラムの一部ではない最初のIPv6ヘッダーに続く拡張機能がある場合があります。IPv6ヘッダーの後にヘッダー拡張が続くかどうかを判断するには、「次のヘッダー」フィールドをチェックします。このフィールドに格納されている値は、次のヘッダーがトランスポートレベルヘッダー(IE TCP / UDPヘッダー)、IPレベルヘッダー拡張(IE ICMP)、またはその間のものであるかどうかを示します。このリストには、次のヘッダーフィールドで可能なすべての値のリストが表示されます。

次のヘッダーのタイプを決定したら、それに応じて処理できます。すべての拡張ヘッダーの最初のバイトは、チェーンできるように「次のヘッダー」フィールドである必要があります。拡張ヘッダーが可変長の場合は、 2番目のバイトは、そのサイズを決定するために使用できる「hdrextフィールド」である必要があります。

于 2013-02-08T00:08:55.397 に答える