Предисловие
Введение
Изменения по сравнению с первым изданием
Кому адресована эта книга
Исходный код и замеченные опечатки
Благодарности
Об авторе
От издательства
Часть 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
Версии Unix и переносимость
1.11. 64-разрядные архитектуры
1.12. Резюме
Упражнения
Глава 2. Транспортный уровень: TCP и UDP
2.1. Введение
2.2. Обзор протоколов TCP/IP
2.3. UDP: протокол пользовательских дейтаграмм
2.4. TCP: протокол управления передачей
2.5. Установление и завершение соединения TCP
Трехэтапное рукопожатие
Параметры TCP
Разрыв соединения TCP
Диаграмма состояний TCP
Просмотр пакетов
2.6. Состояние TIME_WAIT
2.7. Номера портов
Пара сокетов
2.8. Номера портов TCP и параллельные серверы
2.9. Размеры буфера и ограничения
Отправка по TCP
Отправка по UDP
2.10. Стандартные службы Интернета
2.11. Использование протоколов приложениями Интернета
2.12. Резюме
Упражнения
Часть 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. Функция isfdtype
3.11. Резюме
Упражнения
Глава 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_RECVBUF и 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_ADDRFORM
Параметр сокета IPv6_CHECKSUM
Параметр сокета IPv6_DSTOPTS
Параметр сокета IPv6_HOPLIMIT
Параметр сокета IPv6_HOPOPTS
IPv6_NEXTHOP
Параметр сокета IPv6_PKTINFO
Параметр сокета IPv6_PKTOPTIONS
Параметр сокета IPv6_RTHDR
Параметр сокета IPv6_UNICAST_HOPS
7.9. Параметры сокетов TCP
Параметр сокета TCP_KEEPALIVE
Параметр сокета TCP_MAXRT
Параметр сокета TCP_MAXSEG
Параметр сокета TCP_NODELAY
Параметр сокета TCP_STDURG
7.10. Функция fcntl
7.11. Резюме
Упражнения
Глава 8. Основные сведения о сокетах UDP
8.1. Введение
8.2. Функции recvfrom и sendto
8.3. Эхо-сервер UDP: функция main
8.4. Эхо-сервер: функция 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. Элементарные преобразования имен и адресов
9.1. Введение
9.2. Система доменных имен
Записи ресурсов
Распознаватели и серверы имен
Альтернативы DNS
9.3. Функция gethostbyname
Пример
9.4. Параметр распознавателя RES_USE_INET6
9.5. Функция gethostbyname2 и поддержка IPv6
9.6. Функция gethostbyaddr
Функция gethostbyaddr и поддержка IPv6
9.7. Функция uname
Пример: определение IP-адресов локального узла
9.8. Функция gethostname
9.9. Функции getservbyname и getservbyport
Пример: использование функций gethostbyname и getservbyname
9.10. Другая информация о сетях
9.11. Резюме
Упражнения
Часть 3. Дополнительные возможности сокетов
Глава 10. Совместимость IPv4 и IPv6
10.1. Введение
10.2. Клиент IPv4, сервер IPv6
10.3. Клиент IPv6, сервер IPv4
Резюме: совместимость IPv4 и IPv6
10.4. Макроопределения проверки адреса IPv6
10.5. Параметр сокета IPv6_ADDRFORM
10.6. Переносимость исходного кода
10.7. Резюме
Упражнения
Глава 11. Дополнительные преобразования имен и адресов
11.1. Введение
11.2. Функция getaddrinfo
11.3. Функция gai_strerror
11.4. Функция freeaddrinfo
11.5. Функция getaddrinfo: IPv6 и доменный сокет Unix
11.6. Функция getaddrinfo: примеры
11.7. Функция host_serv
11.8. Функция tcp_connect
Пример: клиент времени и даты
11.9. Функция tcp_listen
Пример: сервер времени и даты с указанием протокола
11.10. Функция udp_client
Пример: не зависящий от протокола клиент времени и даты
11.11. Функция udp_connect
11.12. Функция udp_server
Пример: не зависящий от протокола сервер времени и даты
11.13. Функция getnameinfo
11.14. Функции, допускающие повторное вхождение
11.15. Функции gethostbyname_r и gethostbyaddr_r
11.16. Реализация функций getaddrinfo и getnameinfo
Создание структуры addrinfo для каждого адреса
11.17. Резюме
Упражнения
Глава 12. Процессы-демоны и суперсервер inetd
12.1. Введение
12.2. Демон syslogd
12.3. Функция syslog
12.4. Функция daemon_init
Пример: сервер времени и даты в качестве демона
12.5. Демон inetd
12.6. Функция daemon_inetd
Пример: сервер времени и даты, активизированный демоном inetd
12.7. Резюме
Упражнения
Глава 13. Дополнительные функции ввода-вывода
13.1. Введение
13.2. Тайм-ауты сокета
Тайм-аут для функции connect (сигнал SIGALRM)
Тайм-аут для функции recvfrom (сигнал SIGALRM)
Тайм-аут для функции recvfrom (функция select)
Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO)
13.3. Функции recv и send
13.4. Функции readv и writev
13.5. Функции recvmsg и sendmsg
13.6. Вспомогательные данные
13.7. Сколько данных находится в очереди?
13.8. Сокеты и стандартный ввод-вывод
Пример: функция str_echo, использующая стандартный ввод-вывод
13.9. Т/ТСР: ТСР для транзакций
13.10. Резюме
Упражнения
Глава 14. Доменные протоколы Unix
14.1. Введение
14.2. Структура адреса доменного сокета Unix
Пример: функция bind и доменный сокет Unix
14.3. Функция socketpair
14.4. Функции сокетов
14.5. Клиент и сервер потокового доменного протокола Unix
14.6. Клиент и сервер дейтаграммного доменного протокола Unix
14.7. Передача дескрипторов
Пример передачи дескриптора
14.8. Получение информации об отправителе
Пример
14.9. Резюме
Упражнения
Глава 15. Неблокируемый ввод-вывод
15.1. Введение
15.2. Неблокируемые чтение и запись: функция str_cli (продолжение)
Более простая версия функции str_cli
Сравнение времени выполнения различных версий функции str_cli
15.3. Неблокируемая функция connect
15.4. Неблокируемая функция connect: клиент времени и даты
Прерванная функция connect
15.5. Неблокируемая функция connect: клиент Web
Эффективность одновременных соединений
15.6. Неблокируемая функция accept
15.7. Резюме
Упражнения
Глава 16. Операции функции ioctl
16.1. Введение
16.2. Функция ioctl
16.3. Операции с сокетами
16.4. Операции с файлами
16.5. Конфигурация интерфейса
16.6. Функция get_ifi_info
16.7. Операции с интерфейсами
16.8. Операции с кэшем ARP
Пример: вывод аппаратного адреса узла
16.9. Операции с таблицей маршрутизации
16.10. Резюме
Упражнения
Глава 17. Маршрутизирующие сокеты
17.1. Введение
17.2. Структура адреса сокета канального уровня
17.3. Чтение и запись
Пример: получение и вывод записи из таблицы маршрутизации
17.4. Операции функции sysctl
Пример: определяем, включены ли контрольные суммы UDP
17.5. Функция get_ifi_info
17.6. Функции имени и индекса интерфейса
Функция if_nametoindex
Функция if_indextoname
Функция if_nameindex
Функция if_freenameindex
17.7. Резюме
Упражнения
Глава 18. Широковещательная передача
18.1. Введение
18.2. Широковещательные адреса
18.3. Сравнение направленной и широковещательной передач
18.4. Функция dg_cli при использовании широковещательной передачи
IP-фрагментация и широковещательная передача
18.5. Ситуация гонок
Применение IPC в обработчике сигнала функции
18.6. Резюме
Упражнения
Глава 19. Многоадресная передача
19.1. Введение
19.2. Адрес многоадресной передачи
Адреса IPv4 класса D
Адреса многоадресной передачи IPv6
Область действия адресов многоадресной передачи
19.3. Сравнение многоадресной и широковещательной передач в локальной сети
19.4. Многоадресная передача в глобальной сети
19.5. Параметры сокетов многоадресной передачи
19.6. Функция mcast_join и родственные функции
Пример: функция mcast_join
Пример: функция mcast_set_loop
19.7. Функция dg_cli, использующая многоадресную передачу
Фрагментация IP и многоадресная передача
19.8. Получение анонсов сеанса MBone
19.9. Отправка и получение
19.10. SNTP: простой синхронизирующий сетевой протокол
19.11. SNTP (продолжение)
19.12. Резюме
Упражнения
Глава 20. Дополнительные сведения о сокетах UDP
20.1. Введение
20.2. Получение флагов, IP-адреса получателя и индекса интерфейса
Пример: вывод IP-адреса получателя и уведомления о том, что дейтаграмма обрезана
20.3. Обрезанные дейтаграммы
20.4. Когда UDP оказывается предпочтительнее TCP
20.5. Добавление надежности приложению UDP
Пример
20.6. Связывание с адресами интерфейсов
20.7. Параллельные серверы UDP
20.8. Информация о пакете IPv6
Исходящий и входящий интерфейс
Адрес отправителя и адрес получателя IPv6
Задание и получение предельного количества транзитных узлов
Задание адреса следующего транзитного узла
20.9. Резюме
Упражнения
Глава 21. Внеполосные данные
21.1. Введение
21.2. Внеполосные данные протокола TCP
Простой пример использования сигнала SIGURG
Простой пример использования функции select
21.3. Функция sockatmark
Пример
Пример
Пример
21.4. Резюме по теме внеполосных данных TCP
21.5. Клиент-серверные функции проверки пульса
21.6. Резюме
Упражнения
Глава 22. Управляемый сигналом ввод-вывод
22.1. Введение
22.2. Управляемый сигналом ввод-вывод для сокетов
Сигнал SIGIO и сокеты UDP
Сигнал SIGIO и сокеты TCP
22.3. Эхо-сервер UDP с использованием сигнала SIGIO
22.4. Резюме
Упражнение
Глава 23. Программные потоки
23.1. Введение
23.2. Основные функции для работы с потоками: создание и завершение потоков
Функция pthread_create
Функция pthread_join
Функция pthread_self
Функция pthread_detach
Функция pthread_exit
23.3. Использование потоков в функции str_cli
23.4. Использование потоков в эхо-сервере TCP
Передача аргументов новым потокам
Функции, безопасные в многопоточной среде
23.5. Собственные данные потоков
Пример: функция readline, использующая собственные данные потока
23.6. Web-клиент и одновременное соединение (продолжение)
23.7. Взаимные исключения
23.8. Условные переменные
23.9. Web-клиент и одновременный доступ
23.10. Резюме
Упражнения
Глава 24. Параметры IP
24.1. Введение
24.2. Параметры IPv4
24.3. Параметры маршрута от отправителя IPv4
Пример
Уничтожение маршрута, полученного от отправителя
24.4. Заголовки расширения IPv6
24.5. Параметры транзитных узлов и параметры получателя IPv6
24.6. Заголовок маршрутизации IPv6
24.7. «Закрепленные» параметры IPv6
24.8. Резюме
Упражнения
Глава 25. Символьные сокеты
25.1. Введение
25.2. Создание символьных сокетов
25.3. Вывод на символьном сокете
Особенности символьного сокета версии IPv6
Параметр сокета IPv6_CHECKSUM
25.4. Ввод через символьный сокет
Фильтрация ICMPv6
25.5. Программа Ping
25.6. Программа Traceroute
Пример
25.7. Демон сообщений ICMP
Эхо-клиент UDP, использующий демон icmpd
Примеры эхо-клиента UDP
Демон icmpd
25.8. Резюме
Упражнения
Глава 26. Доступ к канальному уровню
26.1. Введение
26.2. BPF: пакетный фильтр BSD
26.3. DLPI: интерфейс поставщика канального уровня
26.4. Linux: SOCK_PACKET
26.5. Libcap: библиотека для захвата пакетов
26.6. Анализ поля контрольной суммы UDP
Пример
26.7. Резюме
Упражнения
Глава 27. Альтернативное устройство клиента и сервера
27.1. Введение
27.2. Альтернативы для клиента TCP
27.3. Тестовый клиент TCP
27.4. Последовательный сервер TCP
27.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента
27.6. Сервер TCP с предварительным порождением процессов без блокировки для вызова accept
Реализация 4.4BSD
Эффект наличия слишком большого количества дочерних процессов
Распределение клиентских соединений между дочерними процессами
Коллизии при вызове функции select
27.7. Сервер TCP с предварительным порождением процессов и защитой вызова accept блокировкой файла
Эффект наличия слишком большого количества дочерних процессов
Распределение клиентских соединений между дочерними процессами
27.8. Сервер TCP с предварительным порождением процессов и защитой вызова accept при помощи взаимного исключения
27.9. Сервер TCP с предварительным порождением процессов: передача дескриптора
27.10. Параллельный сервер TCP: один поток для каждого клиента
27.11. Сервер TCP с предварительным порождением потоков, каждый из которых вызывает accept
27.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept
27.13. Резюме
Упражнения
Часть 4. XTI: транспортный интерфейс X/Open
Глава 28. XTI: TCP-клиенты
28.1. Введение
28.2. Функция t_open
28.3. Функции t_error и t_strerror
28.4. Структуры netbuf и структуры протокола XTI
28.5. Функция t_bind
28.6. Функция t_connect
28.7. Функции t_rcv и t_snd
28.8. Функция t_look
28.9. Функции t_sndrel и t_rcvrel
28.10. Функции t_snddis и t_rcvdis
28.11. Клиент времени и даты для протоколов XTI и TCP
Возможность взаимодействия сокетов и XTI
28.12. Функция xti_rdwr
28.13. Резюме
Упражнения
Глава 29. XTI: функции имен и адресов
29.1. Введение
29.2. Файл /etc/netconfig и функции netconfig
29.3. Переменная NETPATH и функция netpath
29.4. Функции netdir
29.5. Функции t_alloc и t_free
29.6. Функции t_getprotaddr
29.7. Функция xti_ntop
29.8. Функция tcp_connect
Пример
29.9. Резюме
Упражнения
Глава 30. XTI: TCP-серверы
30.1. Введение
30.2. Функция t_listen
30.3. Функция tcp_listen
30.4. Функция t_accept
30.5. Функция xti_accept
30.6. Простой сервер времени и даты
30.7. Несколько соединений, ожидающих обработки
30.8. Функция xti_accept (еще раз)
Длина очереди XTI и аргумент backlog функции listen
Установка сервером единичной длины очереди
30.9. Резюме
Упражнения
Глава 31. XTI: клиенты и серверы UDP
31.1. Введение
31.2. Функции t_rcvudata и t_sndudata
31.3. Функция udp_client
Пример: клиент времени и даты
31.4. Функция t_rcvuderr: асинхронные ошибки
Пример: сообщение ICMP о недоступности порта
31.5. Функция udp_server
Пример: сервер времени и даты
31.6. Чтение дейтаграммы по частям
31.7. Резюме
Глава 32. Параметры XTI
32.1. Введение
32.2. Структура t_opthdr
32.3. Параметры XTI
Параметр XTI_DEBUG
Параметр XTI_LINGER
Параметры XTI_RCVBUF и XTI_RCVLOWAT
Параметры XTI_SNDBUF и XTI_SNDLOWAT
Параметр T_IP_BROADCAST
Параметр T_IP_DONTROUTE
Параметр T_IP_OPTIONS
Параметр T_IP_REUSEADDR
Параметр T_IP_TOS
Параметр T_IP_TTL
Параметр T_TCP_KEEPALIVE
Параметр T_TCP_MAXSEG
Параметр T_TCP_NODELAY
Параметр T_UDP_CHECKSUM
32.4. Функция t_optmgmt
32.5. Проверка наличия параметра и получение значения по умолчанию
32.6. Получение и установка значений параметров XTI
Функция xti_getopt
Функция xti_setopt
Пример
32.7. Резюме
Глава 33. Потоки
33.1. Введение
33.2. Обзор
Типы сообщений
33.3. Функции getmsg и putmsg
33.4. Функции getpmsg и putpmsg
33.5. Функция ioctl
33.6. TPI: интерфейс поставщика транспортных служб
33.7. Резюме
Упражнение
Глава 34. XTI: дополнительные функции
34.1. Введение
34.2. Неблокируемый ввод-вывод
34.3. Функция t_rcvconnect
34.4. Функция t_getinfo
34.5. Функция t_getstate
34.6. Функция t_sync
34.7. Функция t_unbind
34.8. Функции t_rcvv и t_rcvvudata
34.9. Функции t_sndv и t_sndvudata
34.10. Функции t_rcvreldata и t_sndreldata
34.11. Управляемый сигналом ввод-вывод
34.12. Внеполосные данные
Пример использования сигнала SIGPOLL
Пример использования функции poll
34.13. Поставщики транспортных служб закольцовки
34.14. Резюме
Приложение А. Протоколы IPv4, IPv6, ICMPv4 и ICMPv6
А.1. Введение
А.2. Заголовок IPv4
А.3. Заголовок IPv6
А.4. Адресация IPv4
Бесклассовые адреса и CIDR
Адреса подсетей
Адрес закольцовки
Неопределенный адрес
Многоинтерфейсность и псевдонимы адресов
А.5. Адресация IPv6
Объединяемые глобальные индивидуальные адреса
Тестовые адреса 6bone
Адреса IPv4, преобразованные к виду IPv6
Адреса IPv4, совместимые с IPv6
Адрес закольцовки
Неопределенный адрес
Адрес локальной связи Адрес, локальный на уровне сайта
А.6. ICMPv4 и ICMPv6: протокол управляющих сообщений в сети Интернет
Приложение Б. Виртуальные сети
Б.1. Введение
Б.2. MBone
Б.3. 6bone
Приложение В. Техника отладки
В.1. Трассировка системного вызова
Библиотека потоковых сокетов SVR4
Потоковая XTI-библиотека SVR4
Сокеты ядра BSD
Сокеты ядра Solaris 2.6
В.2. Стандартные службы Интернета
В.3. Программа sock
В.4. Небольшие тестовые программы
Пример: определение полосы приоритета внеполосных данных XTI
Пример: определение события для получения внеполосных (срочных) данных XTI
В.5. Программа tcpdump
В.6. Программа netstat
В.7. Программа lsof
Приложение Г. Различные исходные коды
Г.1. Заголовочный файл unp.h
Г.2. Заголовочный файл config.h
Г.3. Заголовочный файл unpxti.h
Г.4. Стандартные функции обработки ошибок
Приложение Д. Решения некоторых упражнений
Главы 1- 33
Литература
Алфавитный указатель