Вопрос или проблема
Ubuntu 22.04
Я экспериментирую с протокольным стеком IPv6
в Linux и пытаюсь выяснить, какие протоколы поддерживаются в качестве протоколов уровня L3 поверх IPv6
. Согласно IANA
, я запустил следующий простой код для проверки отклика каждого определенного номера протокола:
for i in range(1, 148):
send(IPv6(src="::1", dst="::1", nh = i))
sleep(1)
В sudo tcpdump ip6 -n -vvv -i lo
я вижу, что большинство протоколов не поддерживаются, например:
00:31:12.081361 IP6 (hlim 64, next-header unknown (37) payload length: 0)
::1 > ::1: ip-proto-37 0
00:31:12.081371 IP6 (flowlabel 0x11111, hlim 64, next-header ICMPv6 (58) payload length: 48)
::1 > ::1: [icmp6 sum ok] ICMP6, parameter problem, next header - octet 6
Это означает, что реализация протокольного стека IPv6
в Linux не понимает номер протокола (в данном случае это был 37
).
Единственные поддерживаемые номера помимо номеров заголовков расширений были:
TCP, next header = 6
UDP, next header = 17
ICMPv6, next header = 58
PIM, next header = 103
UDPLite, next header = 136
Обратите внимание, что даже IPv6, next header = 41
не был распознан. Означает ли это, что реализация IPv6
в Linux не соответствует RFC 8200
?
Ответ или решение
На Ubuntu 22.04 вы экспериментируете с протоколом IPv6 и анализируете его совместимость с различными L3-протоколами. Проведённое вами тестирование показывает, что в стеке IPv6 Linux поддерживаются несколько ключевых протоколов, в то время как многие из них, вероятно, игнорируются или не распознаются.
Поддерживаемые L3-протоколы в Linux поверх IPv6:
-
TCP (Transmission Control Protocol) — Используется для установления надёжных соединений и передачи данных с управлением потоком. Идентификатор протокола: 6.
-
UDP (User Datagram Protocol) — Протокол для передачи данных без установления соединений, который используется там, где важна скорость передачи, но не её надёжность. Идентификатор протокола: 17.
-
ICMPv6 (Internet Control Message Protocol for IPv6) — Необходим для диагностики и управления сетями IPv6. Он используется, например, для передачи сообщений об ошибках. Идентификатор протокола: 58.
-
PIM (Protocol Independent Multicast) — Протокол, используемый для маршрутизации мультикаст-трафика независимо от используемых протоколов маршрутизации. Идентификатор протокола: 103.
-
UDPLite — Вариант протокола UDP с улучшенной проверкой целостности данных. Идентификатор протокола: 136.
Ваш эксперимент показал, что большинство других протоколов не поддерживаются или не распознаются, как указано в примере с протоколом под номером 37. Даже протокол IPv6 (идентификатор 41), который теоретически поддерживает инкапсуляцию IPv6 в IPv6, не распознаётся.
Соответствие стандартам RFC 8200
Согласно RFC 8200, реализация IPv6 должна поддерживать как минимум базовый набор протоколов, таких как ICMPv6, TCP и UDP. Отсутсвие поддержки протокола с идентификатором 41 в вашем эксперименте не указывает на нарушение RFC 8200, поскольку не все протоколы обязаны быть реализованы в рамках одного стека, особенно если они не используются в широком применении.
Заключение
Ваше исследование продемонстрировало, что ядро Linux поддерживает основные L3-протоколы поверх IPv6, необходимые для функционирования типичного сетевого стека. Однако реализация всех возможных (и менее используемых) протоколов на практике не является обязательной. Это позволяет системе оставаться более безопасной и эффективной, избегая избыточности в реализации редко используемых протоколов.