355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Уильям Ричард Стивенс » UNIX: разработка сетевых приложений » Текст книги (страница 23)
UNIX: разработка сетевых приложений
  • Текст добавлен: 17 сентября 2016, 20:42

Текст книги "UNIX: разработка сетевых приложений"


Автор книги: Уильям Ричард Стивенс


Соавторы: Эндрю М. Рудофф,Билл Феннер

Жанр:

   

ОС и Сети


сообщить о нарушении

Текущая страница: 23 (всего у книги 88 страниц) [доступный отрывок для чтения: 32 страниц]

7.10. Параметры сокетов SCTP

Относительно большое количество параметров, определенных для сокетов SCTP (17 на момент написания этой книги), дают возможность разработчику приложения более точно контролировать его поведение. Параметр levelдля сокетов SCTP должен принимать значение IPPROTO_SCTP.

Несколько параметров, используемых для получения сведений об SCTP, требуют передачи данных ядру (например, идентификатора ассоциации или адреса собеседника). Не все реализации getsockoptподдерживают передачу данных в обе стороны. Интерфейс сокетов SCTP определяет функцию sctp_opt_info(раздел 9.11), которая устраняет эту проблему. В некоторых системах, где getsockoptподдерживает передачу данных в ядро, функция sctp_opt_infoявляется не более, чем оболочкой для getsockopt. В других системах она может вызывать функцию ioctlили какую-либо иную, возможно, созданную специально для данного случая. Мы рекомендуем получать параметры сокетов SCTP при помощи sctp_opt_info, так как в этом случае обеспечивается максимальная переносимость. В табл. 7.2 соответствующие параметры отмечены знаком « +»: SCTP_ASSOCINFO, SCTP_GET_PEER_ADDR_INFO, SCTP_PEER_ADDR_PARAMS, SCTP_PRIMARY_ADDR, SCTP_RTOINFOи SCTP_STATUS.

Параметр сокета SCTP_ADAPTION_LAYER

При инициализации ассоциации любой собеседник может указать на наличие уровня-адаптора. Это указание должно представлять из себя 32-разрядное беззнаковое целое, которое может использоваться двумя приложениями для координации локального уровня-адаптора приложений. Параметр сокета позволяет получать или устанавливать указание на наличие уровня-адаптора, которое будет предоставляться данной конечной точкой будущим собеседникам. Чтобы получить соответствующее значение, установленное собеседником, приложение должно подписаться на события уровня-адаптора.

Параметр сокета SCTP_ASSOCINFO

Параметр сокета SCTP_ASSOCINFOвыполняет три функции. Во-первых, он позволяет получать сведения о существующей ассоциации. Во-вторых, с его помощью можно изменять параметры существующей ассоциации. Наконец, в-третьих, через этот параметр можно задавать значения по умолчанию для будущих ассоциаций. При получении сведений о существующей ассоциации вместо getsockoptследует использовать sctp_opt_info. Вместе с параметром при вызове функции указывается структура sctp_assocparams:

struct sctp_assocparams {

 sctp_assoc_t sasoc_assoc_id;

 uint16_t sasoc_asocmaxrxt;

 uint16_t sasoc_number_peer_destinations;

 uint32_t sasoc_peer_rwnd;

 uint32_t sasoc_local_rwnd;

 uint32_t sasoc_cookie_life;

};

Поля структуры имеют следующий смысл:

■  sasoc_assoc_idхранит идентификатор ассоциации. Если при вызове setsockoptпараметр установлен в нуль, поля sasoc_asocmaxrxtи sasoc_cookie_lifeтрактуются как новые значения по умолчанию для сокета. Вызов getsockoptвернет сведения об ассоциации, если при вызове указать ее идентификатор; если же поле оставить нулевым, будут возвращены значения по умолчанию;

■  sasoc_asocmaxrxtхранит количество повторных передач без получения подтверждений. При превышении этого ограничения передача прекращается, ассоциация закрывается и SCTP сообщает приложению о недоступности собеседника;

■  sasoc_number_peer_destinationsхранит количество адресов собеседника. Этот параметр может быть только считан, но не установлен;

■  sasoc_peer_rwndхранит текущее рассчитанное окно приема собеседника, то есть количество байтов, которые могут быть переданы в данный момент. Это поле изменяется динамически. Когда приложение отправляет данные, значение поля уменьшается, когда удаленное приложение считывает полученные данные, значение увеличивается. Вызовом данного параметра сокета это значение изменено быть не может;

■  sasoc_local_rwndхранит размер локального окна приема, о котором SCTP оповещает собеседника. Это значение также изменяется динамически и зависит от параметра сокета SO_SNDBUF. Вызовом параметра SCTP_ASSOCINFOлокальное окно изменено быть не может;

■  sasoc_cookie_lifeхранит срок действия cookie, выданного собеседнику (в миллисекундах). Каждому cookieприсваивается определенный срок действия, благодаря чему обеспечивается защита от атак, основанных на повторах. Значение по умолчанию равно 60 000 и может быть изменено установкой нужного значения в данном поле при условии, что в поле sasoc_assoc_idзаписано значение 0.

Рекомендации по настройке sasoc_asocmaxrxtдля оптимальной производительности приводятся в разделе 23.11. Для защиты от атак, основанных на повторе, значение sasoc_cookie_lifeможно уменьшить, но при этом система окажется менее устойчивой к задержкам в процессе инициации. Прочие поля полезны для отладки программ.

Параметр сокета SCTP_AUTOCLOSE

Этот параметр позволяет получать и устанавливать время автоматического закрытия конечной точки SCTP. Это время задается в секундах и определяет длительность существования ассоциации SCTP, по которой не передаются никакие данные. Передача данных контролируется стеком SCTP. По умолчанию функция автоматического закрытия отключена.

Параметр предназначен для использования на интерфейсах SCTP типа «один-ко-многим» (см. главу 9). Положительное значение соответствует времени поддержания неиспользуемой ассоциации в секундах, а нулевое отключает функцию автоматического закрытия. Установка параметра влияет только на будущие ассоциации, все существующие ассоциации сохраняют старые значения.

Автоматическое закрытие может использоваться сервером для закрытия неиспользуемых ассоциаций без дополнительных затрат на хранение информации о состоянии. Однако разработчик сервера должен тщательно оценить максимальную продолжительность бездействия клиентов. Если значение параметра окажется недостаточно большим, ассоциации будут закрываться слишком рано.

Параметр сокета SCTP_DEFAULT_SEND_PARAM

SCTP поддерживает множество дополнительных параметров отправки, которые обычно передаются в виде вспомогательных данных или используются при вызове функции sctp_sendmsg(который часто реализуется как библиотечный вызов, передающий вспомогательные данные пользователя). Приложение, планирующее отправку большого количества сообщений с одинаковыми параметрами, может воспользоваться параметром SCTP_DEFAULT_SEND_PARAMдля настройки значений параметров по умолчанию и тем самым избавиться от необходимости добавлять вспомогательные данные или вызывать sctp_sendmsg. На вход параметра поступает структура sctp_sndrcvinfo:

struct sctp_sndrcvinfo {

 u_int16_t sinfo_stream;

 u_int16_t sinfo_ssn;

 u_int16_t sinfo_flags;

 u_int32_t sinfo_ppid;

 u_int32_t sinfo_context;

 u_int32_t sinfo_timetolive;

 u_int32_t sinfo_tsn;

 u_int32_t sinfo_cumtsn;

 sctp_assoc_t sinfo_assoc_id;

};

Поля структуры определяются следующим образом:

■  sinfo_streamзадает поток, в который по умолчанию направляются все сообщения;

■  sinfo_ssnигнорируется при установке значений параметров по умолчанию. При получении сообщений функцией recvmsgили sctp_recvmsgэто поле содержит значение потокового последовательного номера (stream sequence number, SSN), помещенное собеседником в порцию данных;

■  sinfo_flagsустанавливает значения всех флагов для будущих сообщений. Допустимые значения флагов приводятся в табл. 7.5;

■  sinfo_ppidзадает значение идентификатора протокола SCTP для всех будущих передач данных;

■  sinfo_contextзадает значение по умолчанию для поля sinfo_context, которое является локальной меткой для сообщений, которые не могли быть доставлены собеседнику;

■  sinfo_timetoliveопределяет время жизни отправляемых сообщений. Поле времени жизни используется стеком SCTP для того, чтобы сбрасывать сообщения, задержавшиеся в буфере отправки на слишком большой срок и не переданные ни разу. Если обе конечные точки поддерживают режим частичной надежности, параметр времени жизни влияет и на количество попыток повторной передачи, ограничивая их срок;

■  sinfo_tsnигнорируется при установке параметров по умолчанию. При получении сообщений функцией recvmsgили sctp_recvmsgэто поле содержит значение транспортного последовательного номера (transport sequence number, TSN), помещенное собеседником в порцию данных SCTP;

■  sinfo_cumtsnигнорируется при установке параметров по умолчанию. При получении сообщений функцией recvmsgили sctp_recvmsgэто поле содержит значение кумулятивного транспортного последовательного номера, вычисленного локальным стеком SCTP для удаленного собеседника;

■  sinfo_assoc_id содержит идентификатор ассоциации, для которой требуется установка параметров по умолчанию. Для сокетов типа «один-к-одному» это поле игнорируется.

Таблица 7.5. Допустимые значения флагов SCTP (поле sinfo_flags)


MSG_ABORTВызывает аварийное завершение ассоциации
MSG_ADDR_OVERЗаставляет SCTP использовать указанный адрес вместо адреса по умолчанию
MSG_EOFКорректное завершение ассоциации после отправки сообщения
MSG_PR_BUFFERВключение частичной надежности в зависимости от буфера (если она вообще поддерживается)
MSG_PR_SCTPВключение частичной надежности доставки для данного сообщения (если поддерживается)
MSG_UNORDEREDУказывает, что данное сообщение использует сервис неупорядоченной доставки

Обратите внимание, что значения параметров по умолчанию используются только тогда, когда сообщение отправляется без собственной структуры sctp_sndrcvinfo. Если же эта структура добавляется во вспомогательные данные при отправке сообщений, заданные в ней значения имеют приоритет перед значениями по умолчанию. Параметр SCTP_DEFAULT_SEND_PARAMможет использоваться для получения текущих значений по умолчанию при помощи функции sctp_opt_info.

Параметр сокета SCTP_DISАВLE_FRAGМENTS

В обычном режиме работы SCTP фрагментирует все сообщения, не помещающиеся в один пакет SCTP, разбивая их на несколько порций типа DATA. Установка параметра SCTP_DISABLE_FRAGMENTSотключает фрагментацию для данного отправителя. Если сообщение требует фрагментации, а фрагментация отключена, SCTP возвращает ошибку EMSGSIZEи не отсылает сообщение.

Параметр может использоваться приложениями, которые хотят самостоятельно управлять размерами сообщений, при условии, что любое из этих сообщений может поместиться в IP-пакет. Приложение должно быть готово обработать ошибку, обеспечив фрагментацию на уровне приложения или изменение размера сообщений.

Параметр сокета SCTP_EVENTS

Этот параметр сокета позволяет включать, выключать и определять состояние подписки на различные уведомления SCTP. Уведомление SCTP представляет собой сообщение, отправляемое стеком SCTP приложению. Сообщение считывается как и обычные данные, однако в поле msg_flagsпри вызове функции recvmsgдолжно находиться значение MSG_NOTIFICATION. Приложение, не готовое к использованию recvmsgили sctp_recvmsg, не должно включать подписку на события. Параметр позволяет управлять событиями восьми различных типов и передавать структуру sctp_event_subscribe. Нулевое значение соответствует отключению подписки, а единица – включению.

Структура sctp_event_subscribeопределяется следующим образом:

struct sctp_event_subscribe {

 u_int8_t sctp_data_io_event;

 u_int8_t sctp_association_event;

 u_int8_t sctp_address_event;

 u_int8_t sctp_send_failure_event;

 u_int8_t sctp_peer_error_event;

 u_int8_t sctp_shutdown_event;

 u_int8_t sctp_partial_delivery_event;

 u_int8_t sctp_adaption_layer_event;

};

В табл. 7.6 описано назначение различных событий. Подробнее об уведомлениях вы узнаете в разделе 9.14.

Таблица 7.6. События SCTP


sctp_data_io_eventВключение и отключение доставки sctp_sndrcvinfo с каждым вызовом recvmsg
sctp_association_eventВключение и отключение уведомлений о состоянии ассоциации
sctp_address_eventВключение и отключение уведомлений об адресах
sctp_send_failure_eventВключение и отключение уведомлений об ошибках доставки сообщений
sctp_peer_error_eventВключение и отключение уведомлений об ошибках протокола собеседника
sctp_shutdown_eventВключение и отключение уведомлений о завершении ассоциации
sctp_partial_delivery_eventВключение и отключение уведомлений о частичной доставке
sctp_adaption_layer_eventВключение и отключение уведомлений уровня-адаптера

Параметр сокета SCTP_GET_PEER_ADDR_INFO

Этот параметр позволяет получить информацию о собеседнике, которая включает окно приема, сглаженные значения RTT и MTU. Параметр может быть применен только к конкретному адресу собеседника. Вызывающее приложение заполняет поле spinfo_addressструктуры sctp_paddrinfoинтересующим его адресом собеседника. Для максимальной переносимости рекомендуется работать с функцией sctp_opt_info, а не getsockopt. Формат структуры sctp_paddrinfoописан ниже:

struct sctp_paddrinfo {

 sctp_assoc_t spinfo_assoc_id;

 struct sockaddr_storage spinfo_address;

 int32_t spinfo_state;

 uint32_t spinfo_cwnd;

 u_int32_t spinfo_srtt;

 u_int32_t spinfo_rto;

 u_int32_t spinfo_mtu;

};

Приложению возвращаются следующие сведения:

■  spinfo_assoc_idсодержит информацию об идентификаторе ассоциации, которая доставляется также в уведомлении об установке ассоциации ( SCTP_COMM_UP). Уникальный идентификатор ассоциации может использоваться для обращения к ней в большинстве функций SCTP;

■  spinfo_addressпозволяет приложению указать конкретный адрес собеседника, для которого оно хочет получить сведения. По возвращении из getsockoptили sctp_opt_infoзначение структуры должно оставаться неизменным;

■  spinfo_stateможет содержать одно или несколько значений (табл. 7.7).

Таблица 7.7. Состояния адреса собеседника SCTP


SCTP_ACTIVEАдрес активен и доступен
SCTP_INACTIVEВ настоящий момент адрес недоступен
SCTP_ADDR_UNCONFIRMEDДоставка данных или проверочных сообщений на данный адрес не была подтверждена

Неподтвержденным считается адрес, перечисленный собеседником в списке действующих, но не проверенный локальным SCTP. Для проверки адреса требуется, чтобы отправленные на него данные или проверочные сообщения были подтверждены. Для непроверенного адреса не может быть указано корректное значение тайм-аута повторной передачи (RTO). Активными считаются адреса, доступные для передачи данных.

■  spinfo_cwndхранит текущий размер окна приема для данного адреса. Описание процедуры расчета параметра cwnd приводится в [117, с. 177];

■  spinfo_srttхранит текущую оценку сглаженного RTT для данного адреса;

■  spinfo_rtoхранит текущее значение тайм-аута повторной передачи для данного адреса;

■  spinfo_mtuхранит текущую транспортную MTU, определенную по соответствующему алгоритму.

Параметр полезно использовать для получения идентификатора ассоциации по структуре с IP-адресом собеседника. Это будет продемонстрировано в главе 23. Кроме того, приложение может отслеживать функционирование всех адресов собеседника с несколькими интерфейсами и выбирать лучший из них в качестве адреса по умолчанию. Наконец, все эти сведения полезны для ведения журналов и отладки.

Параметр сокета SCTP_I_WANT_MAPPED_V4_ADDR

Этот флаг позволяет включать и отключать отображение адресов IPv4 для сокетов типа AF_INET6. Если параметр включен (а по умолчанию это именно так), все адреса IPv4 преобразуются в адреса IPv6 перед отправкой приложению. Если же параметр отключен, сокет SCTP не будет отображать адреса IPv4, а вместо этого будет просто передавать их в структуре sockaddr_in.

Параметр сокета SCTP_INITMSG

Параметр позволяет устанавливать и считывать параметры инициализации, по умолчанию применяемые к сокетам при отправке сообщения INIT. Вместе с параметром передается структура sctp_initmsg, определяемая следующим образом:

struct sctp_initmsg {

 uint16_t sinit_num_ostreams;

 uint16_t sinit_max_instreams;

 uint16_t sinit_max_attempts;

 uint16_t sinit_max_init_timeo;

};

Поля структуры определяются следующим образом:

■  sinit_num_ostreamsсодержит количество исходящих потоков SCTP, запрашиваемое приложением. Это значение не подтверждается, пока не будет завершено рукопожатие, и может быть уменьшено в соответствии с возможностями собеседника;

■  sinit_max_instreamsотражает максимальное количество входящих потоков, которое готово обеспечить приложение. Это значение может быть перекрыто стеком SCTP, если оно превышает максимальное количество потоков, поддерживаемое самим стеком;

■  sinit_max_attemptsвыражает количество попыток передачи начального сообщения INIT перед тем, как собеседник будет признан недоступным;

■  sinit_max_init_timeoзадает максимальный тайм-аут повторной передачи для сообщений INIT. Это значение используется вместо RTO_MAXв качестве ограничения сверху на тайм-аут повторной передачи. Выражается в миллисекундах.

Обратите внимание, что установленные в 0 поля структуры игнорируются сокетом SCTP. При использовании сокета типа «один-ко-многим» (см. раздел 9.2) приложение может передать структуру sctp_initmsgво вспомогательных данных при неявной установке ассоциации.

Параметр сокета SCTP_MAXBURST

Этот параметр позволяет приложению устанавливать и считывать максимальный размер набора пакетов (maximum burst size). SCTP никогда не отправляет более, чем SCTP_MAXBURSTпакетов одновременно, что предотвращает переполнение сети. Ограничение может применяться либо путем уменьшения окна до текущего количества пакетов «в пути» (in flight) плюс максимальный размер набора, помноженный на транспортную MTU, либо в качестве отдельного параметра, если при каждой возможности отправки будет пересылаться не более SCTP_MAXBURSTпакетов.

Параметр сокета SCTP_MAXSEG

Параметр позволяет приложению считывать и устанавливать максимальный размер фрагмента, аналогично TCP_MAXSEG(см. раздел 7.8).

Когда стек SCTP получает от приложения-отправителя сообщение, размер которого превышает значение этого параметра, это сообщение разбивается на несколько фрагментов, которые доставляются на вторую конечную точку по отдельности. Обычно SCTP создает фрагменты такого размера, чтобы они не превышали минимальную MTU для всех адресов собеседника. Параметр позволяет еще сильнее уменьшить это значение. Учтите, что стек SCTP может фрагментировать даже такое сообщение, размер которого не превышает SCTP_MAXSEG. Это произойдет в том случае, если MTU для одного из адресов собеседника окажется меньше значения SCTP_MAXSEG.

Параметр действует для всех адресов конечной точки и может влиять на несколько ассоциаций при работе с интерфейсами типа «один-ко-многим».

Параметр сокета SCTP_NODELAY

Установка параметра отключает алгоритм Нагла протокола SCTP. По умолчанию параметр выключен, то есть алгоритм Нагла включен. С протоколом SCTP этот алгоритм работает так же, как и с TCP, за тем исключением, что он пытается объединять порции данных, а не отдельные байты. Подробнее см. описание параметра TCP_NODELAY.

Параметр сокета SCTP_PEER_ADDR_PARAMS

Параметр позволяет приложению считывать и устанавливать различные параметры ассоциации. Приложение должно заполнить поле идентификатора ассоциации в структуре sctp_paddrparamsи передать ее вместе с параметром сокета. Формат структуры приведен ниже:

struct sctp_paddrparams {

 sctp_assoc_t spp_assoc_id;

 struct sockaddr_storage spp_address;

 u_int32_t spp_hbinterval;

 u_int16_t spp_pathmaxrxt;

};

Поля структуры имеют следующий смысл:

■  spp_assoc_idсодержит идентификатор ассоциации, параметры которой считываются или устанавливаются. Если это значение равно нулю, приложение будет работать с параметрами по умолчанию, а не с конкретной ассоциацией;

■  spp_addressуказывает IP-адрес, для которого запрашиваются или устанавливаются параметры. Если значение поля равно нулю, оно игнорируется;

■  spp_hbintervalзадает интервал между проверочными сообщениями (heartbeats). Значение SCTP_NO_HBотключает проверочные сообщения. Значение SCTP_ISSUE_HBприводит к внеочередной отправке проверочного сообщения. Все остальные значения задают интервал проверки в миллисекундах. При установке параметров по умолчанию задание константы SCTP_ISSUE_HBне допускается;

■  spp_hbpathmaxrxtопределяет максимальное количество повторных передач, после которых адресат считается недоступным ( INACTIVE). Если основной адрес собеседника признается недоступным, в качестве нового основного адреса выбирается один из доступных адресов.

Параметр сокета SCTP_PRIMARY_ADDR

Параметр позволяет узнать или установить адрес, используемый локальной конечной точкой SCTP в качестве основного. Основной адрес используется в качестве адреса назначения во всех сообщениях, передаваемых собеседнику. Приложение должно заполнить структуру sctp_setprimидентификатором ассоциации и адресом собеседника.

struct sctp_setprim {

 sctp_assoc_t ssp_assoc_id;

 struct sockaddr_storage ssp_addr;

};

Поля структуры имеют следующий смысл:

■  ssp_assoc_idуказывает идентификатор ассоциации, для которой следует установить или считать основной адрес. В случае сокета типа «один-к-одному» это поле игнорируется;

■  ssp_addrопределяет основной адрес, который обязательно должен принадлежать собеседнику. Если используется функция setsockopt, значение поля трактуется как новый основной адрес собеседника.

Получение значения этого параметра для сокета типа «один-к-одному» с единственным локальным адресом эквивалентно вызову функции getsockname.


    Ваша оценка произведения:

Популярные книги за неделю