22.8. Информация о пакетах IPv6

22.8. Информация о пакетах IPv6

IPv6 позволяет приложению определять до пяти характеристик исходящей дейтаграммы:

? IPv6-адрес отправителя;

? индекс интерфейса для исходящих дейтаграмм;

? предельное количество транзитных узлов для исходящих дейтаграмм;

? адрес следующего транзитного узла;

? класс исходящего трафика.

Эта информация отправляется в виде вспомогательных данных с функцией sendmsg. Для сокета можно задать постоянные параметры, которые будут действовать на все отправляемые пакеты (раздел 27.7).

Для полученного пакета могут быть возвращены четыре аналогичных характеристики. Они возвращаются в виде вспомогательных данных с функцией recvmsg:

? IPv6-адрес получателя;

? индекс интерфейса для входящих дейтаграмм;

? предельное количество транзитных узлов для входящих дейтаграмм.

? класс входящего трафика.

На рис. 22.5 показано содержимое вспомогательных данных, о которых рассказывается далее.

Рис. 22.5. Вспомогательные данные для информации о пакете IPv6

Структура in6_pktinfo содержит либо IPv6-адрес отправителя и индекс интерфейса для исходящей дейтаграммы, либо IPv6-адрес получателя и индекс интерфейса для получаемой дейтаграммы:

struct in6_pktinfo {

 struct in6_addr ipi6_addr; /* IPv6-адрес отправителя/получателя */

 int ipi6_ifindex; /* индекс интерфейса для исходящей/получаемой дейтаграммы */

};

Эта структура определяется в заголовочном файле <netinet/in.h>, подключение которого позволяет ее использовать. В структуре cmsghdr, содержащей вспомогательные данные, элемент cmsg_level будет иметь значение IPPROTO_IPV6, элемент cmsg_type будет равен IPV6_PKTINFO и первый байт данных будет первым байтом структуры in6_pktinfo. В примере, приведенном на рис. 22.5, мы считаем, что между структурой cmsghdr и данными нет заполнения и целое число занимает 4 байта.

Чтобы отправить эту информацию, никаких специальных действий не требуется — нужно только задать управляющую информацию во вспомогательных данных функции sendmsg. Чтобы информация добавлялась ко всем отправляемым через сокет пакетам, необходимо установить параметр сокета IPV6_PKTINFO со значением in6_pktinfo. Возвращать эту информацию функция recvmsg будет, только если приложение включит параметр сокета IPV6_RECVPKTINFO.

Данный текст является ознакомительным фрагментом.