Этот формат иногда называется TLV, так как для каждого отдельного параметра указывается его тип, длина и значение (
■ 00 — пропустить параметр и продолжить обработку заголовка.
■ 01 — игнорировать пакет.
■ 10 — игнорировать пакет и отослать отправителю сообщение об ошибке ICMP типа 2 (см. табл. А.6), независимо от того, является ли адрес получателя пакета групповым адресом.
■ 11 — игнорировать пакет и отослать отправителю сообщение об ошибке ICMP типа 2 (см. табл. А.6) но только в том случае, если адрес получателя пакета не является адресом многоадресной передачи.
Следующий разряд указывает, могут ли меняться данные, входящие в этот параметр, в процессе передачи пакета.
■ 0 — данные параметра не могут быть изменены.
■ 1 — данные параметра могут быть изменены.
Оставшиеся пять младших разрядов задают сам параметр. Заметьте, что код параметра определяется всеми восемью битами, младших пяти битов для этого недостаточно. Однако значения параметров выбираются таким образом, чтобы обеспечивать уникальность младших пяти битов как можно дольше.
8-разрядное поле длины задает длину данных этих параметров в байтах. Длина поля типа и длина самого поля длины не входят в это значение.
Два параметра заполнения (pad options) определены в RFC 2460 [27] и могут быть использованы как в заголовке параметров для транзитных узлов, так и в заголовке параметров получателя. Один из параметров транзитных узлов — параметр
Рис. 27.5. Параметры IPv6 для транзитных узлов
Параметр pad1
— это единственный параметр, для которого не указывается длина и значение. Его назначение — вставка одного пустого байта для заполнения. Параметр padN
используется, когда требуется вставить 2 или более байта заполнения. Для 2 байт заполнения длина параметра будет иметь нулевое значение, а сам параметр будет состоять из поля типа и поля длины. В случае 3 байт заполнения длина будет равна 1, а следом за полем длины будет стоять один нулевой байт. Параметр размера увеличенного поля данных допускает увеличение поля размера дейтаграмм до 32 бит и используется, когда 16-разрядное поле размера, показанное на рис. А.2, оказывается недостаточно большим.
Мы показываем эти параметры схематически, потому что для всех параметров получателя и транзитных узлов действует так называемое
Параметры транзитных узлов и параметры получателя обычно задаются как вспомогательные данные в функции sendmsg
и возвращаются функцией recvmsg
также в виде вспомогательных данных. От приложения не требуется никаких специальных действий для отправки этих параметров — нужно только задать их при вызове функции sendmsg
. Но для получения этих параметров должен быть включен соответствующий параметр сокета: IPV6_RECVHOPOPTS
для параметра транзитных узлов и IPV6_RECVDSTOPTS
для параметров получателя. Например, чтобы можно было получить оба параметра, нужен следующий код:
const int on = 1;
setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVHOPOPTS, &on, sizeof(on));
setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVDSTOPTS, &on, sizeof(on));