На рис. 22.5 мы показали пример такого объекта вспомогательных данных, считая, что структура адреса сокета — это 24-байтовая структура sockaddr_in6
. В этом случае узел, идентифицируемый данным адресом, должен быть соседним для отправляющего узла. Если этот адрес совпадает с адресом получателя IPv6-дейтаграммы, мы получаем эквивалент параметра сокета SO_DONTROUTE
. Установка этого параметра требует прав привилегированного пользователя. Адрес следующего транзитного узла можно устанавливать для всех пакетов на сокете, если включить параметр сокета IPV6_NEXTHOP
со значением sockaddr_in6
(раздел 27.7). Для этого необходимо обладать правами привилегированного пользователя.
Задание и получение класса трафика
Объект вспомогательных данных IPV6_TCLASS
задает класс трафика для дейтаграммы. Элемент cmsg_level
структуры cmsghdr
, содержащей эти данные, будет равен IPPROTO_IPV6
, элемент cmsg_type
будет равен IPV6_TCLASS
, а первый байт данных будет первым байтом целочисленного (4-байтового) значения класса трафика (см. рис. 22.5). Согласно разделу А.3, класс трафика состоит из полей DSCP
и ECN
. Эти поля должны устанавливаться одновременно. Ядро может маскировать или игнорировать указанное пользователем значение, если ему это нужно (например, если ядро реализует ECN
, оно может установить биты ECN
равными какому-либо значению, игнорируя два бита, указанных с параметром IPV6_TCLASS
). Класс трафика обычно лежит в диапазоне 0–255. Значение -1 говорит ядру о необходимости использовать значение по умолчанию.
Чтобы задать класс трафика для пакета, нужно отправить вспомогательные данные вместе с этим пакетом. Чтобы задать класс трафика для всех пакетов, отправляемых через сокет, необходимо использовать параметр сокета IPV6_TCLASS
(раздел 27.7). Класс трафика для принятого пакета возвращается функцией recvmsg
во вспомогательных данных, только если приложение включило параметр сокета IPV6_RECVTCLASS
.
22.9. Управление транспортной MTU IPv6
IPv6 предоставляет приложениям средства для управления механизмом обнаружения транспортной MTU (раздел 2.11). Значения по умолчанию пригодны для подавляющего большинства приложений, однако специальные программы могут настраивать процедуру обнаружения транспортной MTU так, как им нужно. Для этого имеется четыре параметра сокета.
Отправка с минимальной MTU
При работе в режиме детектирования транспортной MTU пакеты фрагментируются по MTU исходящего интерфейса или по транспортной MTU в зависимости от того, какое значение оказывается меньше. IPv6 требует минимального значения MTU 1280 байт. Это значение должно поддерживаться любой линией передачи. Фрагментация сообщений по этому минимальному значению позволяет не тратить ресурсы на обнаружение транспортной MTU (потерянные пакеты и задержки в процессе обнаружения), но зато не дает возможности отправлять большие пакеты (что более эффективно).
Минимальная MTU может использоваться приложениями двух типов. Во- первых, это приложения многоадресной передачи, которым нужно избегать порождения множества ICMP-сообщений «Message too big». Во-вторых, это приложения, выполняющие небольшие по объему транзакции с большим количеством адресатов (например, DNS). Обнаружение MTU для многоадресного сеанса может быть недостаточно выгодным, чтобы компенсировать затраты на получение и обработку миллионов ICMP-сообщений, а приложения типа DNS обычно связываются с серверами недостаточно часто, чтобы можно было рисковать утратой пакетов.
Использование минимальной MTU обеспечивается параметром сокета IPV6_USE_MIN_MTU
. Для него определено три значения: -1 (по умолчанию) соответствует использованию минимальной MTU для многоадресных передач и обнаруженной транспортной MTU для направленных передач; 0 соответствует обнаружению транспортной MTU для всех передач; 1 означает использование минимальной MTU для всех адресатов.
Параметр IPV6_USE_MIN_MTU
может быть передан и во вспомогательных данных. В этом случае элемент cmsg_level
структуры cmsghdr
должен иметь значение IPPROTO_IPV6
, элемент cmsg_type
должен иметь значение IPV6_USE_MIN_MTU
, а первый байт данных должен быть первым байтом четырехбайтового целочисленного значения параметра.
Получение сообщений об изменении транспортной MTU
Для получения уведомлений об изменении транспортной MTU приложение может включить параметр сокета IPV6_RECVPATHMTU
. Этот флаг разрешает доставку транспортной MTU во вспомогательных данных каждый раз, когда эта величина меняется. Функция recvmsg в этом случае возвратит дейтаграмму нулевой длины, но со вспомогательными данными, в которых будет помещена транспортная MTU. Элемент cmsg_level
структуры cmsghdr
будет иметь значение IPPROTO_IPV6
, элемент cmsg_type
будет IPV6_PATHMTU
, а первый байт данных будет первым байтом структуры iр6_mtuinfo
. Эта структура содержит адрес узла, для которого изменилась транспортная MTU, и новое значение этой величины в байтах.
Читать дальше
Конец ознакомительного отрывка
Купить книгу