Я пытаюсь проанализировать пакет IPv6, полученный через необработанный сокет, и решить, является ли он ICMPv6 или нет. Я могу обрабатывать заголовки Ethernet и IPv6, но есть необязательные заголовки расширения. Если поле Next Header
заголовка IPv6 не равно ICMPv6, мне нужно перебрать все расширения, которые могут предшествовать.
Сама итерация не является проблемой, поскольку каждый заголовок расширения имеет свою длину. Однако я не могу найти хороший способ отличить заголовок расширения, который может следовать, от других протоколов верхнего уровня, таких как TCP и UDP. Я могу либо проверить, является ли Next Header
одним из известных заголовков расширения (в этом случае я могу выполнить итерацию), либо является ли Next Header
протоколом верхнего уровня (в этом случае мне придется остановиться, поскольку ICMP< /эм>..).
В обоих подходах я полагаюсь на какой-то самостоятельный список констант, по которым я проверяю Next Header
, и этот список может измениться в будущем. Разве нет лучшего способа узнать, когда я нахожусь в конце заголовков расширения, а за ним следует заголовок верхнего уровня (или ничего)?