UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Чтобы задать класс трафика для пакета, нужно отправить вспомогательные данные вместе с этим пакетом. Чтобы задать класс трафика для всех пакетов, отправляемых через сокет, необходимо использовать параметр сокета
IPV6_TCLASS
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
Параметр
IPV6_USE_MIN_MTU
cmsg_level
cmsghdr
IPPROTO_IPV6
cmsg_type
IPV6_USE_MIN_MTU
Получение сообщений об изменении транспортной MTU
Для получения уведомлений об изменении транспортной MTU приложение может включить параметр сокета
IPV6_RECVPATHMTU
cmsg_level
cmsghdr
IPPROTO_IPV6
cmsg_type
IPV6_PATHMTU
iр6_mtuinfo
struct ip6_mtuinfo {
struct sockaddr_in6 ip6m_addr; /* адрес узла */
uint32_t ip6m_mtu; /* транспортная MTU
в порядке байтов узла */
};
Эта структура определяется включением заголовочного файла
<netinet/in.h>
Определение текущей транспортной MTU
Если приложение не отслеживало изменения MTU при помощи параметра
IPV6_RECVPATHMTU
IPV6_PATHMTU
ip6_mtuinfo
ip6_mtuinfo
Отключение фрагментации
По умолчанию стек IPv6 фрагментирует исходящие пакеты по транспортной MTU. Приложениям типа
traceroute
IPV6_DONTFRAG
Когда автоматическая фрагментация отключена, вызов send со слишком большим пакетом может возвратить ошибку
EMSGSIZE
IPV6_RECVPATHMTU
Параметр
IPV6_DONTFRAG
cmsg_level
cmsghdr
IPPROTO_IPV6
cmsg_type
IPV6_DONTFRAG
22.10. Резюме
Существуют приложения, которым требуется знать IP-адрес получателя дейтаграммы UDP и интерфейс, на котором была получена эта дейтаграмма. Чтобы получать эту информацию в виде вспомогательных данных для каждой дейтаграммы, можно установить параметры сокета
IP_RECVDSTADDR
IP_RFCVIF
IPV6_PKTINFO
Несмотря на множество полезных свойств, предоставляемых протоколом TCP и отсутствующих в UDP, существуют ситуации, когда следует отдать предпочтение UDP. UDP должен использоваться для широковещательной или многоадресной передачи. UDP может использоваться в простых сценариях «запрос-ответ», но тогда приложение должно само обеспечить некоторую функциональность, повышающую надежность протокола UDP. UDP не следует использовать для передачи большого количества данных.