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