Получить точный размер заголовка IPv6, включая заголовки расширений

Если речь идет об IPv4, и я хочу извлечь заголовок IP и ICMP из std::istream, сначала я получаю начальные 20 байтов, а затем проверяю, превышает ли длина заголовка, предоставленного в заголовке IPv4, больше 20 байтов, чтобы извлечь любые опции. Следующие байты - это пакет ICMP. Используя значение длины заголовка, содержащееся в заголовке IPv4, я могу видеть ожидаемый размер заголовка IP.

Однако, как получить точный размер заголовка IPv6? В заголовке IPv6 есть значение полезной нагрузки, которое включает размер расширений заголовка плюс данные более высокого уровня, такие как ICMP. Мне нужно знать размер заголовка IPv6, включая расширения заголовка, но без данных более высокого уровня, чтобы узнать, с какой позиции начинается заголовок ICMPv6 в std::istream.

Спасибо!

1 ответ

Решение

Размер заголовка IPv6 фиксирован и составляет 40 байтов - хотя, как вы знаете, могут существовать расширения, которые следуют за начальным заголовком IPv6 и которые не являются частью дейтаграммы транспортного уровня. Чтобы определить, следует ли за заголовком IPv6 расширение заголовка, проверьте поле "следующий заголовок". Значение, хранящееся в этом поле, сообщит вам, является ли следующий заголовок заголовком транспортного уровня (заголовок IE TCP/UDP), расширением заголовка уровня IP (IE ICMP) или чем-то другим между ними. Этот список содержит список всех возможных значений для следующего поля заголовка.

После того, как вы определили тип следующего заголовка, вы можете соответствующим образом разобраться с ним - первый байт всех заголовков расширения должен быть полем "следующего заголовка", чтобы их можно было соединить вместе, а если заголовок расширения имеет переменную длину, то его второй байт должен быть "полем hdr ext", которое можно использовать для определения его размера.

Другие вопросы по тегам