Виртуальные сети
Б.1. Введение
Поддержка новых возможностей протокола TCP, например каналов с повышенной пропускной способностью (RFC 1323), требуется только на узле, использующем TCP, тогда как маршрутизаторы в модернизации не нуждаются. Эти изменения, описанные в RFC 1323, постепенно проявляются в реализациях TCP на узлах. Когда устанавливается новое TCP-соединение, каждая сторона может определить, поддерживает ли другая сторона новую возможность, и если для обоих узлов это так, ею можно воспользоваться.
Иная ситуация с изменениями IP-уровня, такими как многоадресная передача, появившаяся в конце 80-х, или новая версия протокола IPv6, возникшая в середине 90-х, поскольку они требуют изменений на всех узлах и на всех маршрутизаторах. Но люди хотят начать использовать новые возможности, не дожидаясь, когда все системы будут модернизированы. Для этого существующий протокол IPv4 был дополнен так называемыми виртуальными сетями (virtual network), использующими туннели (tunnels).
Б.2. MBone
Наш первый пример виртуальной сети, построенной с использованием туннелей, — это сеть MBone, которая начала использоваться примерно с 1992 года [29]. Если два или более узла в локальной сети поддерживают многоадресную передачу, то на всех этих узлах могут быть запущены приложения многоадресной передачи, которые могут общаться друг с другом. Для соединения одной локальной сети с другой локальной сетью, также содержащей узлы с возможностью многоадресной передачи, между двумя узлами из этих сетей конфигурируется туннель, как показано на рис. Б.1. На этом рисунке отмечены следующие шаги:
Рис. Б.1. Упаковка IPv4 в IPv4, применяемая в MBone
1. Приложение на узле отправителя MH1 посылает групповую дейтаграмму адресам класса D.
2. На рисунке эта дейтаграмма показана как UDP-дейтаграмма, поскольку большинство приложений многоадресной передачи используют протокол UDP. Более подробно о многоадресной передаче и о том, как посылать и получать многоадресные дейтаграммы, рассказано в главе 21.
3. Дейтаграмма принимается всеми узлами в локальной сети, поддерживающими многоадресную передачу, в том числе и MR2. Отметим, что MR2 также работает как многоадресный маршрутизатор, на котором запущена программа
mrouted
, осуществляющая маршрутизацию многоадресной передачи.4. MR2 добавляет перед дейтаграммой другой IPv4-заголовок, в котором в поле адреса получателя записан индивидуальный адрес конечного узла туннеля (tunnel endpoint) MR. Этот индивидуальный адрес конфигурируется администратором узла MR2 и считывается программой
mrouted
при ее запуске. Аналогичным образом индивидуальный адрес узла MR2 сконфигурирован на узле MR — на другом конце туннеля. В поле протокола нового IPv4-заголовка установлено значение 4, соответствующее упаковке IPv4 в IPv4. Дейтаграмма посылается следующему маршрутизатору, UR3, который явно указан как маршрутизатор направленной передачи, то есть не поддерживает многоадресную передачу, и поэтому приходится использовать туннель. Выделенная на рисунке серым цветом часть IPv4-дейтаграммы не изменяется по сравнению шагом 1, только значение поля TTL в выделенном цветом IPv4-заголовке уменьшается на 1.5. UR3 узнает адрес получателя из самого внешнего IPv4-заголовка и перенаправляет дейтаграмму следующему маршрутизатору направленной передачи — UR4.
6. UR4 доставляет дейтаграмму по назначению — узлу MR, который является конечным узлом туннеля.
7. MR получает дейтаграмму, и поскольку в поле протокола указана упаковка IPv4 в IPv4, удаляет внешний IPv4-заголовок и передает оставшуюся часть дейтаграммы (копию той, которая была групповой дейтаграммой в локальной сети, изображенной на рисунке вверху) в качестве многоадресной дейтаграммы в своей локальной сети.
8. Все узлы сети, изображенной на рисунке внизу, поддерживающие многоадресную передачу, получают многоадресную дейтаграмму.
В результате многоадресная дейтаграмма, отправленная в локальной сети, изображенной вверху, передается как многоадресная дейтаграмма в локальной сети, изображенной внизу. Это происходит несмотря на то, что два маршрутизатора, присоединенные к этим двум локальным сетям, а также все маршрутизаторы между ними не поддерживают многоадресную передачу.
В данном примере показана функция маршрутизации многоадресной передачи, осуществляемая программой
mrouted
, запущенной на одном из узлов в каждой из локальных сетей. Таким образом начинала свою работу сеть MBone. Но, начиная примерно с 1996 г. большинство основных поставщиков маршрутизаторов стали включать функцию групповой маршрутизации в свои маршрутизаторы. Если бы два маршрутизатора направленной передачи UR3 и UR4 на рис. Б.1 имели возможность маршрутизации многоадресной передачи, то нам не пришлось бы запускать mrouted
, а маршрутизаторы UR3 и UR4 работали бы как маршрутизаторы многоадресной передачи. Но если между UR3 и UR4 существуют другие маршрутизаторы, не поддерживающие многоадресную передачу, туннель все же необходим. Однако конечными пунктами туннеля в этом случае могут стать MR3 (новое имя для UR3, поддерживающего многоадресную передачу) и MR4 (новое имя для UR4, поддерживающего многоадресную передачу), а не MR2 и MR.ПРИМЕЧАНИЕВ сценарии, приведенном на рис. Б.1, каждый многоадресный пакет появляется дважды в локальной сети, расположенной вверху рисунка, и дважды в локальной сети, расположенной внизу. Один раз это многоадресный пакет, а второй раз — направленный пакет внутри туннеля, так как пакет идет между узлом, на котором запущена программа mrouted, и следующим маршрутизатором направленной передачи (то есть между MR2 и UR3, а затем между UR4 и MR). Лишняя копия — это цена туннелирования. Преимущество замены маршрутизаторов направленной передачи UR3 и UR4 на рис. Б.1 на маршрутизаторы многоадресной передачи (те, что мы назвали MR3 и MR4) заключается в том, что мы избежали появления этой дополнительной копии многоадресного пакета в каждой из сетей. Даже если MR3 и MR4 должны установить туннель между собой, поскольку некоторые промежуточные маршрутизаторы между ними (которые на рисунке не показаны) не поддерживают многоадресную передачу, такой вариант предпочтительнее, так как в этом случае не происходит дублирования пакетов в каждой из локальных сетей.
На данный момент сеть MBone практически прекратила свое существование и заменена нормальной многоадресной передачей. Возможно, в многоадресной инфраструктуре Интернета все еще существуют туннели, но они устанавливаются между маршрутизаторами, поддерживающими многоадресную передачу, и внутри сетей поставщиков услуг Интернета, а потому невидимы для конечного пользователя.
Б.3. 6bone
Виртуальная сеть 6bone была создана в 1996 году по тем же причинам, что и MBone: пользователи в группах узлов, поддерживающих версию протокола IPv6, хотели соединить их вместе с помощью виртуальной сети, не дожидаясь поддержки IPv6 всеми промежуточными маршрутизаторами. На момент написания этой книги сеть 6bone выходит из употребления по мере внедрения IPv6; полное прекращение функционирования 6bone ожидается в июне 2006 года [30]. Мы рассказываем о туннелях только потому, что до сих пор можно встретить настроенные туннели. О динамических туннелях мы расскажем в разделе Б.4.
Рис. Б.2. Упаковка IPv6 в IPv4, используемая в сети 6bone
На рис. Б.2 приведен пример двух локальных сетей, поддерживающих IPv6, соединенных с помощью туннеля только через маршрутизаторы IPv4. На рисунке отмечены следующие шаги:
1. Узел HI локальной сети, показанной на рисунке вверху, посылает IP-дейтаграмму, содержащую TCP-сегмент, узлу H4 из локальной сети, показанной внизу. Будем называть эти два узла IPv6-узлами, хотя, вероятно, оба они поддерживают и протокол IPv4. В таблице маршрутизации IPv6 на узле H1 записано, что следующим маршрутизатором является узел H2, и IPv6-дейтаграмма отсылается этому маршрутизатору.
2. На узле HR2 имеется сконфигурированный туннель до узла HR3. Этот туннель позволяет посылать IPv6-дейтаграммы между двумя конечными узлами туннеля через сеть IPv4 путем упаковки IPv6-дейтаграмм в IPv4-дейтаграммы (упаковка IPv6 в IPv4). В поле протокола указано значение 4. Отметим, что оба узла IPv4/IPv6 на концах туннеля — HR2 и HR3 — работают как маршрутизаторы IPv6, поскольку они перенаправляют IPv6-дейтаграммы, получаемые на один интерфейс, через другой интерфейс. Сконфигурированный туннель считается интерфейсом, хотя он является виртуальным, а не физическим интерфейсом.
3. Конечный узел туннеля (HR3) получает упакованную дейтаграмму, отбрасывает IPv4-заголовок и посылает IPv6-дейтаграмму в свою локальную сеть.
4. Дейтаграмма приходит по назначению на узел H4.
Б.4. Переход на IPv6: 6to4
Механизм перехода 6to4 (6на4) полностью описан в документе «Соединение доменов IPv6 через облака IPv4» (RFC 3056 [17]). Это метод динамического создания туннелей, подобных изображенному на рис. Б.2. В отличие от предыдущих механизмов динамического создания туннелей, которые требовали наличия у всех узлов адресов IPv4, а также явного задания механизма туннелирования, 6to4 реализует туннелирование исключительно через маршрутизаторы. Это упрощает конфигурацию и позволяет централизованно устанавливать политику безопасности. Кроме того, появляется возможность совмещать функциональность 6to4 с типичной функциональностью трансляции сетевых адресов и межсетевой защиты (например, это может быть сделано на устройстве NAT, расположенном на стороне клиента).
Адреса 6to4 лежат в диапазоне 2002/16. В следующих четырех байтах адреса записывается адрес IPv4 (рис. Б.3). 16-разрядный префикс 2002 и 32-разрядный адрес IPv4 создают общий 48-разрядный идентификатор. Для идентификатора подсети, идущего перед 64-разрядным идентификатором интерфейса, остается 2 байта. Например, нашему узлу
freebsd
с адресом IPv4 12.106.32.254 соответствует префикс 2002:c6a:20fe/48.Рис. Б.3. Адреса 6to4
Преимущество 6to4 перед 6bone состоит в том, что туннели, формирующие инфраструктуру, образуются автоматически. Для их создания не требуется предварительное конфигурирование. Сайт, использующий 6to4, настраивает основной маршрутизатор на известный адрес передачи наиболее подходящему узлу (anycast) IPv4 192.88.99.1 (RFC 3068 [48]). Он соответствует адресу IPv6 2002: :с058:6301::. Маршрутизаторы инфраструктуры IPv6, готовые действовать в качестве шлюзов 6to4, объявляют о маршруте к сети 2002/16 и отправляют упакованный трафик на адрес IPv4, скрытый внутри адреса 6to4. Такие маршрутизаторы могут быть локальными, региональными или глобальными в зависимости от областей действия их маршрутов.
Смысл виртуальных сетей состоит в том, чтобы постепенно исчезнуть с течением времени, когда промежуточные маршрутизаторы обретут требуемую функциональность (в частности, способность работать с IPv6).
Приложение В
Оглавление
-
Вступительное слово
-
Предисловие
-
Часть 1 Введение. TCP/IP
-
Глава 1 Введение в сетевое программирование
-
1.1. Введение
-
1.2. Простой клиент времени и даты
-
1.3. Независимость от протокола
-
1.4. Обработка ошибок: функции-обертки
-
Значение системной переменной Unix errno
-
1.5. Простой сервер времени и даты
-
1.6. Таблица соответствия примеров технологии клиент-сервер
-
1.7. Модель OSI
-
1.8. История сетевого обеспечения BSD
-
1.9. Сети и узлы, используемые в примерах
-
Определение топологии сети
-
1.10. Стандарты Unix
-
История POSIX
-
История Open Group
-
Объединение стандартов
-
Internet Engineering Task Force
-
1.11. 64-разрядные архитектуры
-
1.12. Резюме
-
Упражнения
-
Глава 2 Транспортный уровень: TCP, UDP и SCRIPT
-
2.1. Введение
-
2.2. Обзор протоколов TCP/IP
-
2.3. UDP: протокол пользовательских дейтаграмм
-
2.4. TCP: протокол контроля передачи
-
2.5. SCRIPT: протокол управления передачей потоков
-
2.6. Установление и завершение соединения TCP
-
Трехэтапное рукопожатие
-
Параметры TCP
-
Завершение соединения TCP
-
Диаграмма состояний TCP
-
Обмен пакетами
-
2.7. Состояние TIME_WAIT
-
2.8. Установление и завершение ассоциации SCRIPT
-
Четырехэтапное рукопожатие
-
Завершение ассоциации
-
Диаграмма состояний SCRIPT
-
Обмен пакетами
-
Параметры SCRIPT
-
2.9. Номера портов
-
Пара сокетов
-
2.10. Номера портов TCP и параллельные серверы
-
2.11. Размеры буфера и ограничения
-
Отправка по TCP
-
Отправка по UDP
-
Отправка по SCRIPT
-
2.12. Стандартные службы Интернета
-
2.13. Использование протоколов типичными приложениями Интернета
-
2.14. Резюме
-
Упражнения
-
Часть 2 Элементарные сокеты
-
Глава 3 Введение в сокеты
-
3.1. Введение
-
3.2. Структуры адреса сокетов
-
Структура адреса сокета IPv4
-
Универсальная структура адреса сокета
-
Структура адреса сокета IPv6
-
Новая универсальная структура адреса сокета
-
Сравнение структур адреса сокетов
-
3.3. Аргументы типа «значение-результат»
-
3.4. Функции определения порядка байтов
-
3.5. Функции управления байтами
-
3.6. Функции inet_aton, inet_addr и inet_ntoa
-
3.7. Функции inet_pton и inet_ntop
-
Пример
-
3.8. Функция sock_ntop и связанные с ней функции
-
3.9. Функции readn, writen и readline
-
3.10. Резюме
-
Упражнения
-
Глава 4 Элементарные сокеты TCP
-
4.1. Введение
-
4.2. Функция socket
-
AF_xxx и PF_xxx
-
4.3. Функция connect
-
4.4. Функция bind
-
4.5. Функция listen
-
4.6. Функция accept
-
Пример: аргументы типа «значение-результат»
-
4.7. Функции fork и exec
-
4.8. Параллельные серверы
-
4.9. Функция close
-
Счетчик ссылок дескриптора
-
4.10. Функции getsockname и getpeername
-
Пример: получение семейства адресов сокета
-
4.11. Резюме
-
Упражнения
-
Глава 5 Пример TCP-соединения клиент-сервер
-
5.1. Введение
-
5.2. Эхо-сервер TCP: функция main
-
5.3. Эхо-сервер TCP: функция str_echo
-
5.4. Эхо-клиент TCP: функция main
-
5.5. Эхо-клиент TCP: функция str_cli
-
5.6. Нормальный запуск
-
5.7. Нормальное завершение
-
5.8. Обработка сигналов POSIX
-
Функция signal
-
Семантика сигналов POSIX
-
5.9. Обработка сигнала SIGCHLD
-
Обработка зомбированных процессов
-
Обработка прерванных системных вызовов
-
5.10. Функции wait и waitpid
-
Различия между функциями wait и waitpid
-
5.11. Прерывание соединения перед завершением функции accept
-
5.12. Завершение процесса сервера
-
5.13. Сигнал SIGPIPE
-
5.14. Сбой на узле сервера
-
5.15. Сбой и перезагрузка на узле сервера
-
5.16. Выключение узла сервера
-
5.17. Итоговый пример TCP
-
5.18. Формат данных
-
Пример: передача текстовых строк между клиентом и сервером
-
Пример: передача двоичных структур между клиентом и сервером
-
5.19. Резюме
-
Упражнения
-
Глава 6 Мультиплексирование ввода-вывода: функции select и poll
-
6.1. Введение
-
6.2. Модели ввода-вывода
-
Модель блокируемого ввода-вывода
-
Модель неблокируемого ввода-вывода
-
Модель мультиплексирования ввода-вывода
-
Модель ввода-вывода, управляемого сигналом
-
Модель асинхронного ввода-вывода
-
Сравнение моделей ввода-вывода
-
Сравнение синхронного и асинхронного ввода-вывода
-
6.3. Функция select
-
При каких условиях дескриптор становится готовым?
-
Максимальное число дескрипторов для функции select
-
6.4. Функция str_cli (продолжение)
-
6.5. Пакетный ввод
-
6.6. Функция shutdown
-
6.7. Функция str_cli (еще раз)
-
6.8. Эхо-сервер TCP (продолжение)
-
Атака типа «отказ в обслуживании»
-
6.9. Функция pselect
-
6.10. Функция poll
-
6.11. Эхо-сервер TCP (еще раз)
-
6.12. Резюме
-
Упражнения
-
Глава 7 Параметры сокетов
-
7.1. Введение
-
7.2. Функции getsockopt и setsockopt
-
7.3. Проверка наличия параметра и получение значения по умолчанию
-
7.4. Состояния сокетов
-
7.5. Общие параметры сокетов
-
Параметр сокета SO_BROADCAST
-
Параметр сокета SO_DEBUG
-
Параметр сокета SO_DONTROUTE
-
Параметр сокета SO_ERROR
-
Параметр сокета SO_KEEPALIVE
-
Параметр сокета SO_LINGER
-
Параметр сокета SO_OOBINLINE
-
Параметры сокета SO_RCVBUF и SO_SNDBUF
-
Параметры сокета SO_RCVLOWAT и SO_SNDLOWAT
-
Параметры сокета SO_RCVTIMEO и SO_SNDTIMEO
-
Параметры сокета SO_REUSEADDR и SO_REUSEPORT
-
Параметр сокета SO_TYPE
-
Параметр сокета SO_USELOOPBACK
-
7.6. Параметры сокетов IPv4
-
Параметр сокета IP_HRDINCL
-
Параметр сокета IP_OPTIONS
-
Параметр сокета IP_RECVDSTADDR
-
Параметр сокета IP_RECVIF
-
Параметр сокета IP_TOS
-
Параметр сокета IP_TTL
-
7.7. Параметр сокета ICMPv6
-
Параметр сокета ICMP6_FILTER
-
7.8. Параметры сокетов IPv6
-
Параметр сокета IPV6_CHECKSUM
-
Параметр сокета IPV6_DONTFRAG
-
Параметр сокета IPV6_NEXTHOP
-
Параметр сокета IPV6_PATHMTU
-
Параметр сокета IPV6_RECVDSTOPTS
-
Параметр сокета IPV6_RECVHOPLIMIT
-
Параметр сокета IPV6_RECVHOPOPTS
-
Параметр сокета IPV6_RECVPATHMTU
-
Параметр сокета IPV6_RECVPKTINFO
-
Параметр сокета IPV6_RECVRTHDR
-
Параметр сокета IPV6_RECVTCLASS
-
Параметр сокета IPV6_UNICAST_HOPS
-
Параметр сокета IPV6_USE_MIN_MTU
-
Параметр сокета IPV6_V6ONLY
-
Параметры сокета IPV6_XXX
-
7.9. Параметры сокетов TCP
-
Параметр сокета TCP_MAXSEG
-
Параметр сокета TCP_NODELAY
-
7.10. Параметры сокетов SCTP
-
Параметр сокета SCTP_ADAPTION_LAYER
-
Параметр сокета SCTP_ASSOCINFO
-
Параметр сокета SCTP_AUTOCLOSE
-
Параметр сокета SCTP_DEFAULT_SEND_PARAM
-
Параметр сокета SCTP_DISАВLE_FRAGМENTS
-
Параметр сокета SCTP_EVENTS
-
Параметр сокета SCTP_GET_PEER_ADDR_INFO
-
Параметр сокета SCTP_I_WANT_MAPPED_V4_ADDR
-
Параметр сокета SCTP_INITMSG
-
Параметр сокета SCTP_MAXBURST
-
Параметр сокета SCTP_MAXSEG
-
Параметр сокета SCTP_NODELAY
-
Параметр сокета SCTP_PEER_ADDR_PARAMS
-
Параметр сокета SCTP_PRIMARY_ADDR
-
Параметр сокета SCTP_RTOINFO
-
Параметр сокета SCTP_SET_PEER_PRIMARY_ADDR
-
Параметр сокета SCTP_STATUS
-
7.11. Функция fcntl
-
7.12. Резюме
-
Упражнения
-
Глава 8 Основные сведения о сокетах UDP
-
8.1. Введение
-
8.2. Функции recvfrom и sendto
-
8.3. Эхо-сервер UDP: функция main
-
8.4. Эхо-сервер UDP: функция dg_echo
-
8.5. Эхо-клиент UDP: функция main
-
8.6. Эхо-клиент UDP: функция dg_cli
-
8.7. Потерянные дейтаграммы
-
8.8. Проверка полученного ответа
-
8.9. Запуск клиента без запуска сервера
-
8.10. Итоговый пример клиент-сервера UDP
-
8.11. Функция connect для UDP
-
Многократный вызов функции connect для сокета UDP
-
Производительность
-
8.12. Функция dg_cli (продолжение)
-
8.13. Отсутствие управления потоком в UDP
-
Приемный буфер сокета UDP
-
8.14. Определение исходящего интерфейса для UDP
-
8.15. Эхо-сервер TCP и UDP, использующий функцию select
-
8.16. Резюме
-
Упражнения
-
Глава 9 Основы сокетов SCTP
-
9.1. Введение
-
9.2. Модели интерфейса
-
Сокет типа «один-к-одному»
-
Сокет типа «один-ко-многим»
-
9.3. Функция sctp_bindx
-
9.4. Функция sctp_connectx
-
9.5. Функция sctp_getpaddrs
-
9.6. Функция sctp_freepaddrs
-
9.7. Функция sctp_getladdrs
-
9.8. Функция sctp_freeladdrs
-
9.9. Функция sctp_sendmsg
-
9.10. Функция sctp_recvmsg
-
9.11. Функция sctp_opt_info
-
9.12. Функция sctp_p eeloff
-
9.13. Функция shutdown
-
9.14. Уведомления
-
9.15. Резюме
-
Упражнения
-
Глава 10 Пример SCTP-соединения клиент-сервер
-
10.1. Введение
-
10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main
-
10.3. Потоковый эхо-клиент SCTP типа «один-ко-многим»: функция main
-
10.4. Потоковый эхо-клиент SCTP: функция str_cli
-
Запуск программы
-
10.5. Блокирование очереди
-
Запуск программы
-
Запуск измененной программы
-
10.6. Управление количеством потоков
-
10.7. Управление завершением соединения
-
10.8. Резюме
-
Упражнения
-
Глава 11 Преобразования имен и адресов
-
11.1. Введение
-
11.2. Система доменных имен
-
Записи ресурсов
-
Распознаватели и серверы имен
-
Альтернативы DNS
-
11.3. Функция gethostbyname
-
Пример
-
11.4 Функция gethostbyaddr
-
11.5. Функции getservbyname и getservbyport
-
Пример: использование функций gethostbyname и getservbyname
-
11.6. Функция getaddrinfo
-
11.7. Функция gai_strerror
-
11.8. Функция freeaddrinfo
-
11.9. Функция getaddrinfo: IPv6
-
11.10. Функция getaddrinfo: примеры
-
11.11. Функция host_serv
-
11.12. Функция tcp_connect
-
Пример: клиент времени и даты
-
11.13. Функция tcp_listen
-
Пример: сервер времени и даты
-
Пример: сервер времени и даты с указанием протокола
-
11.14. Функция udp_client
-
Пример: не зависящий от протокола UDP-клиент времени и даты
-
11.15. Функция udp_connect
-
11.16. Функция udp_server
-
Пример: не зависящий от протокола UDP-сервер времени и даты
-
11.17. Функция getnameinfo
-
11.18. Функции, допускающие повторное вхождение
-
11.19. Функции gethostbyname_r и gethostbyaddr_r
-
11.20. Устаревшие функции поиска адресов IPv6
-
Константа RES_USE_INET6
-
Функция gethostbyname2
-
Функция getipnodebyname
-
11.21. Другая информация о сетях
-
11.22. Резюме
-
Упражнения
-
Часть 3 Дополнительные возможности сокетов
-
Глава 12 Совместимость IPv4 и IPv6
-
12.1. Введение
-
12.2. Клиент IPv4, сервер IPv6
-
12.3. Клиент IPv6, сервер IPv4
-
Резюме: совместимость IPv4 и IPv6
-
12.4. Макроопределения проверки адреса IPv6
-
12.5. Переносимость исходного кода
-
12.6. Резюме
-
Упражнения
-
Глава 13 Процессы-демоны и суперсервер inetd
-
13.1. Введение
-
13.2. Демон syslogd
-
13.3. Функция syslog
-
13.4. Функция daemon_init
-
Пример: сервер времени и даты в качестве демона
-
13.5. Демон inetd
-
13.6. Функция daemon_inetd
-
Пример: сервер времени и даты, активизированный демоном inetd
-
13.7. Резюме
-
Упражнения
-
Глава 14 Дополнительные функции ввода-вывода
-
14.1. Введение
-
14.2. Тайм-ауты сокета
-
Тайм-аут для функции connect (сигнал SIGALRM)
-
Тайм-аут для функции recvfrom (сигнал SIGALRM)
-
Тайм-аут для функции recvfrom (функция select)
-
Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO)
-
14.3. Функции recv и send
-
14.4. Функции readv и writev
-
14.5. Функции recvmsg и sendmsg
-
14.6. Вспомогательные данные
-
14.7. Сколько данных находится в очереди?
-
14.8. Сокеты и стандартный ввод-вывод
-
Пример: функция str_echo, использующая стандартный ввод-вывод
-
14.9. Расширенный опрос
-
Интерфейс /dev/poll
-
Интерфейс kqueue
-
Рекомендации
-
14.10. Резюме
-
Упражнения
-
Глава 15 Доменные протоколы Unix
-
15.1. Введение
-
15.2. Структура адреса доменного сокета Unix
-
Пример: функция bind и доменный сокет Unix
-
15.3. Функция socketpair
-
15.4. Функции сокетов
-
15.5. Клиент и сервер потокового доменного протокола Unix
-
15.6. Клиент и сервер дейтаграммного доменного протокола Unix
-
15.7. Передача дескрипторов
-
Пример передачи дескриптора
-
15.8. Получение информации об отправителе
-
Пример
-
15.9. Резюме
-
Упражнения
-
Глава 16 Неблокируемый ввод-вывод
-
16.1. Введение
-
16.2. Неблокируемые чтение и запись: функция str_cli (продолжение)
-
Более простая версия функции str_cli
-
Сравнение времени выполнения различных версий функции str_cli
-
16.3. Неблокируемая функция connect
-
16.4. Неблокируемая функция connect: клиент времени и даты
-
Прерванная функция connect
-
16.5. Неблокируемая функция connect: веб-клиент
-
Эффективность одновременных соединений
-
16.6. Неблокируемая функция accept
-
16.7. Резюме
-
Упражнения
-
Глава 17 Операции функции ioctl
-
17.1. Введение
-
17.2. Функция ioctl
-
17.3. Операции с сокетами
-
17.4. Операции с файлами
-
17.5. Конфигурация интерфейса
-
17.6. Функция get_ifi_info
-
17.7. Операции с интерфейсами
-
17.8. Операции с кэшем ARP
-
Пример: вывод аппаратного адреса узла
-
17.9. Операции с таблицей маршрутизации
-
17.10. Резюме
-
Упражнения
-
Глава 18 Маршрутизирующие сокеты
-
18.1. Введение
-
18.2. Структура адреса сокета канального уровня
-
18.3. Чтение и запись
-
Пример: получение и вывод записи из таблицы маршрутизации
-
18.4. Операции функции sysctl
-
Пример: определяем, включены ли контрольные суммы UDP
-
18.5. Функция get_ifi_info (повтор)
-
18.6. Функции имени и индекса интерфейса
-
Функция if_nametoindex
-
Функция if_indextoname
-
Функция if_nameindex
-
Функция if_freenameindex
-
18.7. Резюме
-
Упражнения
-
Глава 19 Сокеты управления ключами
-
19.1. Введение
-
19.2. Чтение и запись
-
19.3. Дамп базы соглашений о безопасности
-
19.4. Создание статического соглашения о безопасности
-
Пример
-
19.5. Динамическое управление SA
-
Пример
-
19.6. Резюме
-
Упражнения
-
Глава 20 Широковещательная передача
-
20.1. Введение
-
20.2. Широковещательные адреса
-
20.3. Направленная и широковещательная передачи
-
20.4. Функция dg_cli при использовании широковещательной передачи
-
Фрагментация IP-пакетов и широковещательная передача
-
20.5. Ситуация гонок
-
Блокирование и разблокирование сигнала с помощью функции pselect
-
Использование функций sigsetjmp и siglongjmp
-
Применение IPC в обработчике сигнала функции
-
20.6. Резюме
-
Упражнения
-
Глава 21 Многоадресная передача
-
21.1. Введение
-
21.2. Адрес многоадресной передачи
-
Адреса IPv4 класса D
-
Адреса многоадресной передачи IPv6
-
Область действия адресов многоадресной передачи
-
Сеансы многоадресной передачи
-
21.3. Сравнение многоадресной и широковещательной передачи в локальной сети
-
21.4. Многоадресная передача в глобальной сети
-
21.5. Многоадресная передача от отправителя
-
21.6. Параметры сокетов многоадресной передачи
-
21.7. Функция mcast_join и родственные функции
-
Пример: функция mcast_join
-
Пример: функция mcast_set_loop
-
21.8 Функция dg_cli, использующая многоадресную передачу
-
Фрагментация IP и многоадресная передача
-
21.9. Получение анонсов сеансов многоадресной передачи
-
21.10. Отправка и получение
-
Пример
-
21.11. SNTP: простой синхронизирующий сетевой протокол
-
21.12. Резюме
-
Упражнения
-
Глава 22 Дополнительные сведения о сокетах udp
-
22.1. Введение
-
22.2. Получение флагов, IP-адреса получателя и индекса интерфейса
-
Пример: вывод IP-адреса получателя и флага обрезки дейтаграммы
-
22.3. Обрезанные дейтаграммы
-
22.4. Когда UDP оказывается предпочтительнее TCP
-
22.5. Добавление надежности приложению UDP
-
Пример
-
22.6. Связывание с адресами интерфейсов
-
22.7. Параллельные серверы UDP
-
22.8. Информация о пакетах IPv6
-
Исходящий и входящий интерфейсы
-
Адрес отправителя и адрес получателя IPv6
-
Задание и получение предельного количества транзитных узлов
-
Задание адреса следующего транзитного узла
-
Задание и получение класса трафика
-
22.9. Управление транспортной MTU IPv6
-
Отправка с минимальной MTU
-
Получение сообщений об изменении транспортной MTU
-
Определение текущей транспортной MTU
-
Отключение фрагментации
-
22.10. Резюме
-
Упражнения
-
Глава 23 Дополнительные сведения о сокетах SCTP
-
23.1. Введение
-
23.2. Сервер типа «один-ко-многим» с автоматическим закрытием
-
23.3. Частичная доставка
-
23.4. Уведомления
-
Запуск программы
-
23.5. Неупорядоченные данные
-
23.6. Связывание с подмножеством адресов
-
23.7. Получение адресов
-
Выполнение программы
-
23.8. Определение идентификатора ассоциации по IP-адресу
-
23.9. Проверка соединения и ошибки доступа
-
23.10. Выделение ассоциации
-
23.11. Управление таймерами
-
23.12. Когда SCTP оказывается предпочтительнее TCP
-
23.13. Резюме
-
Упражнения
-
Глава 24 Внеполосные данные
-
24.1. Введение
-
24.2. Внеполосные данные протокола TCP
-
Простой пример использования сигнала SIGURG
-
Простой пример использования функции select
-
24.3. Функция sockatmark
-
Пример: особенности отметки внеполосных данных
-
Пример: дополнительные свойства внеполосных данных
-
Пример: единственность отметки внеполосных данных в TCP
-
24.4. Резюме по теме внеполосных данных TCP
-
24.5. Резюме
-
Упражнения
-
Глава 25 Управляемый сигналом ввод-вывод
-
25.1. Введение
-
25.2. Управляемый сигналом ввод-вывод для сокетов
-
Сигнал SIGIO и сокеты UDP
-
Сигнал SIGIO и сокеты TCP
-
25.3. Эхо-сервер UDP с использованием сигнала SIGIO
-
25.4. Резюме
-
Упражнения
-
Глава 26 Программные потоки
-
26.1. Введение
-
26.2. Основные функции для работы с потоками: создание и завершение потоков
-
Функция pthread_create
-
Функция pthread_join
-
Функция pthread_self
-
Функция pthread_detach
-
Функция pthread_exit
-
26.3. Использование потоков в функции str_cli
-
26.4. Использование потоков в эхо-сервере TCP
-
Передача аргументов новым потокам
-
Функции, безопасные в многопоточной среде
-
26.5. Собственные данные потоков
-
Пример: функция readline, использующая собственные данные потока
-
26.6. Веб-клиент и одновременное соединение (продолжение)
-
26.7. Взаимные исключения
-
26.8. Условные переменные
-
26.9. Веб-клиент и одновременный доступ
-
26.10. Резюме
-
Упражнения
-
Глава 27 Параметры IP
-
27.1. Введение
-
27.2. Параметры IPv4
-
27.3. Параметры маршрута от отправителя IPv4
-
Пример
-
Уничтожение полученного маршрута от отправителя
-
27.4. Заголовки расширения IPv6
-
27.5. Параметры транзитных узлов и параметры получателя IPv6
-
27.6. Заголовок маршрутизации IPv6
-
27.7. «Закрепленные» параметры IPv6
-
27.8. История развития интерфейса IPv6
-
27.9. Резюме
-
Упражнения
-
Глава 28 Символьные сокеты
-
28.1. Введение
-
28.2. Создание символьных сокетов
-
28.3. Вывод на символьном сокете
-
Особенности символьного сокета версии IPv6
-
Параметр сокета IPV6_CHECKSUM
-
28.4. Ввод через символьный сокет
-
Фильтрация по типу сообщений ICMPv6
-
28.5. Программа ping
-
28.6. Программа traceroute
-
Пример
-
28.7. Демон сообщений ICMP
-
Эхо-клиент UDP, использующий демон icmpd
-
Примеры эхо-клиента UDP
-
Демон icmpd
-
28.8. Резюме
-
Упражнения
-
Глава 29 Доступ к канальному уровню
-
29.1. Введение
-
29.2. BPF: пакетный фильтр BSD
-
29.3. DLPI: интерфейс поставщика канального уровня
-
29.4. Linux: SOCK_PACKET и PF_PACKET
-
29.5. Libcap: библиотека для захвата пакетов
-
29.6. Libnet: библиотека создания и отправки пакетов
-
29.7. Анализ поля контрольной суммы UDP
-
Пример
-
Функции libnet
-
29.8. Резюме
-
Упражнения
-
Глава 30 Альтернативное устройство клиента и сервера
-
30.1. Введение
-
30.2. Альтернативы для клиента TCP
-
30.3. Тестовый клиент TCP
-
30.4. Последовательный сервер TCP
-
30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента
-
30.6. Сервер TCP с предварительным порождением процессов без блокировки для вызова accept
-
Реализация 4.4BSD
-
Эффект наличия слишком большого количества дочерних процессов
-
Распределение клиентских соединений между дочерними процессами
-
Коллизии при вызове функции select
-
30.7. Сервер TCP с предварительным порождением процессов и защитой вызова accept блокировкой файла
-
Эффект наличия слишком большого количества дочерних процессов
-
Распределение клиентских соединений между дочерними процессами
-
30.8. Сервер TCP с предварительным порождением процессов и защитой вызова accept при помощи взаимного исключения
-
30.9. Сервер TCP с предварительным порождением процессов: передача дескриптора
-
30.10. Параллельный сервер TCP: один поток для каждого клиента
-
30.11. Сервер TCP с предварительным порождением потоков, каждый из которых вызывает accept
-
30.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept
-
30.13. Резюме
-
Упражнения
-
Глава 31 Потоки (STREAMS)
-
31.1. Введение
-
31.2. Обзор
-
Типы сообщений
-
31.3. Функции getmsg и putmsg
-
31.4. Функции getpmsg и putpmsg
-
31.5. Функция ioctl
-
31.6. TPI: интерфейс поставщика транспортных служб
-
31.7. Резюме
-
Упражнения
-
Приложения
-
Приложение А Протоколы IPv4, IPv6, ICMPv4 и ICMFV6
-
А.1. Введение
-
А.2. Заголовок IPv4
-
А.3. Заголовок IPv6
-
А.4. Адресация IPv4
-
Адреса подсетей
-
Адрес закольцовки
-
Неопределенный адрес
-
Частные адреса
-
Многоинтерфейсность и псевдонимы адресов
-
А.5. Адресация IPv6
-
Объединяемые глобальные индивидуальные адреса
-
Тестовые адреса 6bone
-
Адреса IPv4, преобразованные к виду IPv6
-
Адреса IPv6, совместимые с IPv4
-
А дрес закольцовки
-
Неопределенный адрес
-
Адрес локальной связи
-
Адрес, локальный на уровне сайта
-
А.6. ICMPv4 и ICMPv6: протоколы управляющих сообщений в сети Интернет
-
Приложение Б Виртуальные сети
-
Б.1. Введение
-
Б.2. MBone
-
Б.3. 6bone
-
Б.4. Переход на IPv6: 6to4
-
Приложение В Техника отладки
-
В.1. Трассировка системных вызовов
-
Сокеты ядра BSD
-
Сокеты ядра Solaris 9
-
В.2. Стандартные службы Интернета
-
В.3. Программа sock
-
В.4. Небольшие тестовые программы
-
В.5. Программа tcpdump
-
В.6. Программа netstat
-
В.7. Программа lsof
-
Приложение Г Различные исходные коды
-
Г.1. Заголовочный файл unp.h
-
Г.2. Заголовочный файл config.h
-
Г.3. Стандартные функции обработки ошибок
-
Приложение Д Решения некоторых упражнений
-
Глава 1
-
Глава 2
-
Глава 3
-
Глава 4
-
Глава 5
-
Глава 6
-
Глава 7
-
Глава 8
-
Глава 9
-
Глава 10
-
Глава 11
-
Глава 12
-
Глава 13
-
Глава 14
-
Глава 15
-
Глава 16
-
Глава 17
-
Глава 18
-
Глава 20
-
Глава 21
-
Глава 22
-
Глава 24
-
Глава 25
-
Глава 26
-
Глава 27
-
Глава 28
-
Глава 29
-
Глава 30
-
Глава 31
-
Литература
-
***
-
***
-
Примечания