



Создание сетевых приложений в среде
Linux
Руководство разработчика
Шон Уолтон
Москва•Санкт Петербург•Киев 2001
www.books-shop.com
ББК 32.973.26 018.2.75
УДК681.3.07
Издательский дом "Вильяме"
По общим вопросам обращайтесь в Издательский дом "Вильяме" поадресу:info@williamspublishing.com,http://www.williamspublishing.com
Уолтон, Шон.
Создание сетевых приложений в среде Linux. : Пер. с англ.— М. : Издательский дом "Вильяме", 2001. — 464 с.: ил. — Парал: тит. англ.
ISBN 5 8459 0193 6 (рус.)
Данная книга в основном посвящена программированию сокетов на языке С в среде Linux. В ней шаг за шагом рассказывается о том, как писать профессиональные сетевые клиентские, серверные и одноранговые приложения. Читатель узнает, как работать с су ществующими клиент серверными протоколами (в частности, HTTP), взаимодействовать с другими компьютерами по протоколу UDP и создавать свои собственные протоколы. В книге описываются все типы пакетов, поддерживаемых в семействе протоколов TCP/IP, их достоинства и недостатки.
Помимо базового материала представлены сведения о различных методиках многоза дачности, рассказывается о средствах управления вводом выводом и обеспечения безо пасности сетевых приложений. В книге также описываются объектно ориентированные подходы к сетевому программированию на языках Java и C++. Отдельные главы посвяще ны технологии RPC, протоколу SSL, работе в групповом и широковещательном режимах и стандарту IPv6.
Книга предназначена профессиональным программистам и студентам, которые хотят научиться создавать не только линейные алгоритмы, но и полнофункциональные много задачные сетевые приложения.
ББК 32.973.26 018.2.75
Все названия программных продуктов являются зарегистрированнымиторговыми марками соответст вующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотоко пирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Sams Publishing.
Authorized translation from the English language edition published by Sams Publishing Copyright © 2001
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, elec tronic or mechanical, including photocopying recording or by any information storage retrieval system, without permission from the Publisher.
Russian language edition published by Williams Publishing House according to the Agreement with R&I En terprises International, Copyright © 2001
ISBN 5 8459 0193 6 (рус.) |
О Издательский дом "Вильяме", 2001 |
ISBN 0 672 31935 7 (англ.) |
© Sams Publishing, 2001 |
www.books-shop.com
Оглавление
Часть I. Создание сетевых клиентских приложений |
23 |
|
Глава 1. |
Простейший сетевой клиент |
24 |
Глава 2. |
Основы TCP/IP |
41 |
Глава 3. |
Различные типы Internet пакетов |
58 |
Глава 4. |
Передача сообщений между одноранговыми компьютерами |
79 |
Глава 5. |
Многоуровневая сетевая модель |
99 |
Часть II. Создание серверных приложений |
115 |
|
Глава 6. |
Пример сервера |
116 |
Глава 7. |
Распределение нагрузки: многозадачность |
131 |
Глава 8. |
Механизмы ввода вывода |
167 |
Глава 9. |
Повышение производительности |
188 |
Глава 10. Создание устойчивых сокетов |
213 |
|
Часть III. Объектно ориентированные сокеты |
231 |
|
Глава 11. Экономия времени за счет объектов |
232 |
|
Глава 12. Сетевое программирование в Java |
248 |
|
Глава 13. Программирование сокетов в C++ |
263 |
|
Глава 14. |
Ограничения объектно ориентированного программирования |
279 |
Часть IV. Сложные сетевые методики |
291 |
|
Глава 15. Удаленные вызовы процедур (RPC) |
292 |
|
Глава 16. Безопасность сетевых приложений |
308 |
Глава 17. |
Широковещательная, групповая и магистральная передача сообщений 326 |
||
Глава 18. |
Неструктурированные сокеты |
336 |
|
Глава 19. |
IPv6: следующее поколение протокола IP |
345 |
|
Часть V. Приложения |
357 |
||
Приложение А. |
Информационные таблицы |
358 |
|
Приложение Б. |
Сетевые функции |
379 |
|
Приложение В. |
API функции ядра |
407 |
|
Приложение Г. |
Вспомогательные классы |
434 |
www.books-shop.com
Введение |
|
|
19 |
|
Часть I. Создание сетевых клиентских приложений |
23 |
|||
Глава 1. Простейший сетевой клиент |
|
24 |
||
Связь с окружающим миром посредством сокетов |
|
27 |
||
Правила общения: основы адресации в TCP/IP |
|
28 |
||
Прослушивание сервера: простейший алгоритм клиентской программы |
29 |
|||
Системный вызов socket() |
|
|
30 |
|
Подключение к серверу |
|
|
32 |
|
Получение ответа от сервера |
|
|
35 |
|
Разрыв соединения |
|
|
39 |
|
Резюме: что происходит за кулисами |
. |
|
40 |
|
Глава 2. |
Основы TCP/IP |
|
|
41 |
IP адресация |
|
|
42 |
|
Идентификация компьютера |
|
|
42 |
|
Структура адресов Internet |
, |
|
43 |
|
Маски подсети |
|
|
45 |
|
Маршрутизаторы и преобразование адресов |
|
46 |
||
Специальные и потерянные адреса |
|
|
46 |
|
Номера IP портов |
|
|
48 |
|
Порядок следования байтов |
|
|
50 |
|
Функции преобразования данных |
|
|
50 |
|
Расширение клиентского приложения |
|
|
52 |
|
Различные виды пакетов |
|
|
56 |
|
Именованные каналы в UNIX |
|
|
56 |
|
Резюме: IP адреса и средства преобразования данных |
|
57 |
||
Глава 3. |
Различные типы Internet пакетов |
|
58 |
|
Базовый сетевой пакет |
|
|
59 |
|
Поле version |
|
|
61 |
|
Поле header_len |
|
|
61 |
|
Поле serve_type |
|
|
62 |
|
Поле ID |
|
|
62 |
|
Поля dont_frag, more_frag и frag_offset |
|
62 |
||
Поле time_to_live (TTL) |
|
|
63 |
|
Поле protocol |
|
|
63 |
|
Поле |
options |
|
|
64 |
Поле data |
|
|
64 |
|
Анализ различных типов пакетов |
|
|
64 |
|
Характеристики пакетов |
|
|
65 |
|
Типы пакетов |
|
|
67 |
|
Взаимосвязь между протоколами |
|
|
75 |
|
Анализ сетевого трафика с помощью утилиты tcpdump |
|
76 |
||
Создание сетевого анализатора |
|
|
77 |
|
Резюме: выбор правильного пакета |
|
|
78 |
|
Глава 4. |
Передача сообщений между одноранговыми компьютерами . |
79 |
||
Сокеты, требующие установления соединения |
|
80 |
||
Открытые каналы между программами |
|
80 |
||
Надежные соединения |
|
|
80 |
|
Соединения по протоколам более низкого уровня |
|
82 |
Содержание
www.books-shop.com
Пример: подключение к демону HTTP |
|
, |
84 |
|
Упрощенный протокол HTTP |
|
|
84 |
|
Получение HTTP страницы |
|
|
84 |
|
Сокеты, не требующие установления соединения |
|
|
85 |
|
Задание адреса, |
сокета |
|
86 |
|
Упрощение процедуры квитирования |
|
|
87 |
|
ПротоколТ/ТСР |
|
|
88 |
|
|
|
|
||
Прямая доставка сообщений |
|
|
89 |
|
Привязка порта к сокету |
|
|
90 |
|
Обмен сообщениями |
|
|
92 |
|
Прием сообщения |
|
|
93 |
|
Подтверждение доставки UDP сообщения |
|
|
94 |
|
Усиление надежности UDP |
|
|
94 |
|
Упорядочение пакетов |
|
|
95 |
|
Избыточность пакетов |
. |
|
96 |
|
Проверка целостности данных |
|
|
96 |
|
Задержки при передаче данных |
|
|
97 |
|
Переключение задач: введение в многозадачность |
|
|
97 |
|
Резюме: модели взаимодействия с установлением и без установления соединения |
|
98 |
||
Глава 5. |
Многоуровневая сетевая модель |
|
|
99 |
Решение сетевой задачи |
|
|
100 |
|
Аппаратная среда |
|
|
100 |
|
Передача данных в сети |
|
|
102 |
|
Взаимодействие сети и операционной системы |
|
|
103 |
|
. Взаимодействие сети и приложений |
|
|
104 |
|
Сетевая модель OSI |
|
|
105 |
|
Уровень 1: физический |
|
|
105 |
|
Уровень 2: канальный |
|
' |
106 |
|
Уровень 3: сетевой |
|
|
107 |
|
Уровень 4: транспортный |
|
|
107 |
|
Уровень 5: сеансовый |
' |
|
107 |
|
Уровень 6: представительский |
|
|
108 |
|
Уровень 7: прикладной |
|
|
108 |
|
Набор протоколов Internet |
|
|
108 |
|
Уровень 1: доступ к сети |
|
|
108 |
|
Уровень 2: межсетевой (IP) |
|
|
109 |
|
Уровень 2: управляющие расширения (ICMP) |
|
|
110 |
|
Уровень 3: межузловой (UDP) |
|
|
110 |
|
Уровень 3: потоки данных (TCP) |
|
|
111 |
|
Уровень 4: прикладной |
|
|
112 |
|
Фундаментальные различия между моделями OSI и IP |
|
|
112 |
|
Что чему служит |
|
|
113 |
|
Резюме: от теории к практике |
|
|
113 |
|
Часть II. Создание серверных приложений |
|
115 |
||
Глава 6. |
Пример сервера |
|
|
116 |
Схема работы сокета: общий алгоритм сервера |
,' |
|
117 |
|
Простой эхо сервер |
|
|
118 |
|
Привязка порта к сокету |
|
|
119 |
|
Создание очереди ожидания |
|
|
121 |
|
Прием запросов от клиентов |
|
|
122 |
|
Взаимодействие с клиентом |
|
|
123 |
|
Общие правила определения протоколов |
|
|
124 |
Содержание
www.books-shop.com
Какая программа должна начинать передачу первой? |
|
|
125 |
|
Какая программа должна управлять диалогом? |
|
|
125 |
|
Какой уровень сертификации требуется? |
|
|
125 |
|
Какой тип данных используется? |
|
|
125 |
|
Как следует обрабатывать двоичные данные? |
|
|
126 |
|
Как обнаружитьвзаимоблокировку? |
|
|
126 |
|
Необходима ли синхронизация по таймеру? |
|
|
126 |
|
Как и когда переустанавливать соединение? |
|
|
126 |
|
Когда завершать работу? |
|
|
127 |
|
Более сложный пример: сервер HTTP |
|
|
127 |
|
Резюме: базовые компоненты сервера |
|
|
130 |
|
Глава 7. |
Распределение нагрузки: многозадачность |
|
131 |
|
Понятие о многозадачности: процессы и потоки |
|
|
132 |
|
Когда следует применять многозадачный режим |
|
|
134 |
|
Характеристики многозадачного режима |
|
|
135 |
|
Сравнение процессов и потоков |
|
|
136 |
|
Создание процесса |
|
|
136 |
|
Создание потока |
|
|
139 |
|
Системный вызов _clone() |
|
|
142 |
|
Взаимодействие заданий |
|
|
145 |
|
Обгоняя время: исключающие семафоры и гонки |
|
|
155 |
|
Гонки за ресурсами |
|
|
155 |
|
Исключающий семафор |
|
|
156 |
|
Проблемы с исключающими семафорами в библиотеке Pthreads |
|
158 |
||
Предотвращение взаимоблокировки |
|
. |
158 |
|
Управление дочерними заданиями и задания зомби |
|
|
159 |
|
Приоритеты и планирование дочерних заданий |
|
|
159 |
|
Уничтожение зомби: очистка после завершения |
|
|
160 |
|
Расширение существующих версий клиента и сервера |
|
|
162 |
|
Вызов внешних программ с помощью функций семейства ехес() |
|
163 |
||
Резюме |
|
|
|
166 |
Глава 8. |
Механизмы ввода вывода |
|
|
167 |
Блокирование ввода вывода: зачем оно необходимо? |
|
|
168 |
|
Когда следует переходить в режим блокирования? |
|
|
170 |
|
Альтернативы блокированию |
|
|
170 |
|
Сравнение различных методик ввода вывода |
|
|
171 |
|
Опрос каналов ввода вывода |
• |
|
172 |
|
Чтение данных по методике опроса |
|
|
173 |
|
Запись данных по методике опроса |
|
|
175 |
|
Установление соединений по методике опроса . |
|
|
176 |
|
Асинхронный ввод вывод |
|
|
177 |
|
Чтение данных по запросу |
' |
|
179 |
|
Асинхронная запись данных |
|
|
180 |
|
Подключение по запросу |
|
|
181 |
|
Устранение нежелательного блокирования с помощью функций poll() и select() |
|
182 |
||
Реализациятайм аутов |
|
|
185 |
|
Резюме: выбор методик ввода вывода |
|
|
186 |
|
Глава 9. |
Повышение производительности |
|
|
188 |
Подготовка к приему запросов на подключение |
|
|
189 |
|
• Ограничение числа клиентских соединений |
|
|
189 |
|
Предварительное ветвление сервера |
|
|
191 |
|
Адаптация к различным уровням загруженности |
|
|
193 |
Содержание
www.books-shop.com
Расширение возможностей сервера с помощью функции select() |
, , |
195 |
|
Лавиноподобная загрузка планировщика |
,. • |
|
195 |
Чрезмерное использование функции |
select() |
|
196 |
Разумное использование функции |
select() |
|
197 |
Проблемы реализации |
|
|
198 |
Перераспределение нагрузки |
|
|
199 |
Анализ возможностей сокета |
|
|
200 |
Общие параметры |
|
|
201 |
Параметры протокола IP |
|
|
203 |
Параметры стандарта IPv6 |
|
|
205 |
Параметры протокола TCP |
|
|
206 |
Восстановление дескриптора сокета |
|
|
206 |
Досрочная отправка: перекрытие сообщений |
. |
|
207 |
Проблемы файлового ввода вывода |
|
|
208 |
Ввод вывод по запросу: рациональное использование ресурсов процессора |
208 |
||
Ускорение работы функции send() |
|
|
208 |
Разгрузка функции |
recv() |
|
209 |
Отправка приоритетных сообщений |
|
|
209 |
Резюме |
|
|
212 |
Глава 10. Создание устойчивых сокетов |
|
|
213 |
Методы преобразования данных |
|
|
214 |
Проверка возвращаемых значений |
|
|
215 |
Обработка сигналов |
|
|
217 |
SIGPIPE |
|
|
218 |
SIGURG |
|
|
219 |
SIGCHLD |
|
|
219 |
SIGHUP |
|
|
220 |
SIGIO |
|
|
220 |
SIGALRM |
|
|
220 |
Управление ресурсами |
|
|
221 |
Управление файлами |
|
|
221 |
Динамическая память ("куча") |
|
|
221 |
Статическая память |
|
|
223 |
Ресурсы процессора, совместно используемая память и процессы |
|
223 |
|
Критические серверы |
|
|
223 |
Что называется критическим сервером |
|
|
224 |
Коммуникационные события и прерывания |
|
|
224 |
Особенности возобновления сеанса |
|
|
225 |
Способы возобновления сеанса |
|
|
226 |
Согласованная работа клиента и сервера |
|
|
227 |
Сетевые взаимоблокировки |
|
|
228 |
Сетевое зависание |
|
|
228 |
Отказ отобслуживания |
|
|
229 |
Резюме: несокрушимые серверы |
|
|
230 |
Часть III. Объектно ориентированные сокеты |
231 |
||
Глава 11. Экономия времени за счет объектов |
|
232 |
|
Эволюция технологий программирования |
|
|
233 |
Функциональное программирование: пошаговый подход |
|
233 |
|
Модульное программирование: структурный подход |
|
234 |
|
Абстрактное программирование: отсутствие ненужной детализации |
|
235 |
|
Объектно ориентированное программирование: естественный способ общения с миром |
235 |
||
Рациональные методы программирования |
|
|
236 |
Содержание
www.books-shop.com
Повторное использование кода |
|
|
|
236 |
||
Создание подключаемых компонентов |
|
|
237 |
|||
Основы объектно ориентированного |
программирования |
|
|
238 |
||
Инкапсуляция кода |
|
|
|
238 |
||
Наследование поведения |
|
|
|
239 |
||
Абстракция |
данных |
• |
|
|
240 |
|
Полиморфизм методов |
|
|
|
241 |
||
Характеристики объектов |
|
|
|
241 |
||
Классы и объекты |
|
|
|
241 |
||
Атрибуты |
|
|
|
|
|
241 |
Свойства |
|
|
|
|
|
242 |
Методы |
|
|
|
|
|
242 |
Права доступа |
|
|
|
|
242 |
|
Отношения |
|
|
|
|
242 |
|
Расширение объектов |
|
|
|
243 |
||
Шаблоны |
|
|
' . |
|
|
243 |
Постоянство |
|
|
|
|
243 |
|
Потоковая передача данных |
|
|
|
243 |
||
Перегрузка |
|
|
|
|
|
244 |
. Интерфейсы |
|
|
|
|
244 |
|
События и исключения |
|
|
|
244 |
||
Особые случаи |
|
|
|
|
|
245 |
Записи и структуры |
|
|
|
245 |
||
Наборы функций |
|
|
|
245 |
||
Языковая поддержка |
|
|
|
246 |
||
Классификация объектно ориентированных языков |
|
|
246 |
|||
Работа с объектами в процедурных языках |
|
|
246 |
|||
Резюме: объектно ориентированное |
мышление |
|
|
247 |
||
Глава 12. Сетевое программирование в Java |
|
|
248 |
|||
Работа с сокетами |
|
|
|
|
249 |
|
Программирование клиентов и серверов |
|
|
250 |
|||
Передача |
UDP сообщений |
|
|
|
253 |
|
Групповая передача дейтаграмм |
|
|
|
254 |
||
Ввод вывод в Java |
|
|
|
|
256 |
|
Классификация классов ввода вывода |
|
|
256 |
|||
Преобразование потоков |
|
|
|
257 |
||
Конфигурирование |
сокетов |
. . |
. |
|
258 |
|
Общие методы конфигурирования |
|
|
258 |
|||
Конфигурирование групповых сокетов |
. |
|
259 |
|||
Многозадачные |
программы |
|
|
|
259 |
|
Создание потокового класса |
|
|
|
259 |
||
Добавление потоков к классу |
|
|
|
260 |
||
Синхронизация |
методов |
|
|
|
261 |
|
Существующие ограничения |
|
|
|
262 |
||
Резюме |
|
|
|
' |
, |
262 |
Глава 13. Программирование сокетов в C++ |
|
|
263 |
|||
Зачем программировать сокеты в C++? |
|
|
264 |
|||
Упрощение работы ссокетами |
|
|
|
264 |
||
Отсутствие ненужной детализации |
|
|
264 |
|||
Создание многократно используемых компонентов ' |
• |
265 |
||||
Моделирование по необходимости |
|
|
265 |
|||
Создание библиотеки сокетов |
|
|
|
265 |
||
Определение общиххарактеристик |
|
|
266 |
|||
10 |
|
|
|
|
Содержание |
www.books-shop.com