Книги: [Классика] [Базы данных] [Internet/WWW] [Сети] [Программирование] [UNIX] [Windows] [Безопасность] [Графика] [Software Engineering] [ERP-системы] [Hardware]
Введение
Сетевое программирование подразумевает написание программ, взаимодействующих через сеть. Одна из этих программ обычно называется клиентом, а другая — сервером. В большинстве операционных систем имеются предварительно скомпилированные программы, взаимодействующие через сеть — в мире TCP/IP наиболее типичным примером таких программ являются web-клиенты (браузе-ры) и web-серверы, а также клиенты и серверы FTP и Telnet, — однако в этой книге рассказывается о том, как писать собственные сетевые приложения.
Сетевые приложения пишутся с использованием программного интерфейса приложений, или API (Application Program Interface). В этой книге мы рассматриваем два API для сетевого программирования:
- Сокеты, иногда называемые Беркли-сокетами (Berkeley), что указывает на их связь с Berkeley Unix.
- XTI (X/Open Transport Interface — транспортный интерфейс группы X/Open), являющийся модификацией TLI (Transport Layer Interface — интерфейс транспортного уровня), разработанного группой AT&T.
Все примеры в этой книге относятся к операционной системе Unix, хотя основные понятия и концепции сетевого программирования практически нс зависят от операционной системы. В примерах используется набор протоколов TCP/IP, причем рассматривается как IP версии 4, так и IP версии 6.
Для написания сетевых приложений необходимо знание лежащей в их основе операционной системы и сетевых протоколов. Эта книга опирается на другие мои книги по двум указанным темам:
- Advanced Programming in the Unix Environment [93J;
- TCP/IP Illustrated, vol. 1 [94];
- TCP/IP Illustrated, vol. 2 [105];
- TCP/IP Illustrated, vol. 3 [95].
Это книга, являющаяся вторым изданием книги «UNIX Network Programming», содержит также сведения по операционной системе Unix и по протоколам TCP/IP, но для получения более подробной информации по различным темам в этих областях следует обращаться к четырем перечисленным выше книгам, используя многочисленные ссылки, включенные в текст. В большей степени это относится к книге [105], в которой представлена реализация 4.4BSD функций сетевого программирования для API сокетов (socket, b1 nd, connect и т.д.). При понимании того, как реализована та или иная функциональная возможность, ее применение в приложениях становится более осмысленным.
Изменения по сравнению с первым изданием
Второе издание этой книги содержит очень много изменений. Все они стали результатом моего опыта преподавания данного материала и чтения материалов сетевых конференций Usenet в период с 1990 по 1996 год — это дало мне возможность выявить те темы и концепции сетевого программирования, которые регулярно оказываются неверно понятыми. Ниже перечислены основные изменения, внесенные во второе издание:
- Для всех примеров в этом издании используется ANSI С.
- Старые главы 6 («Berkeley Sockets» — «Сокеты Беркли») и 8 («Library Rou-tins» — «Библиотечные функции») были расширены, и теперь соответствующий материал занимает 25 глав. Это семикратное увеличение (из расчета количества слов), вероятно, является самым значительным изменением со времени первого издания. Большинство разделов прежней главы 6 теперь выросли в отдельные главы, при этом было увеличено количество примеров.
- Части прежней главы 6, посвященные TCP и UDP, теперь разделены. Сначала мы рассматриваем функции TCP и все, что относится к клиент-серверному взаимодействию TCP, а затем — функции UDP и взаимодействие клиента и сервера UDP. Для новичков в этой области такой подход будет проще, чем, например, подробное изучение всех особенностей функции connect с различной семантикой в случае UDP и TCP.
- Старая глава 7 («System V Transport Layer Interface» — «Интерфейс транспортного уровня System V») была расширена, и теперь соответствующий материал занимает 7 глав. Мы также рассматриваем более новую технологию ХТ1, пришедшую на смену технологии TLI, о которой шла речь в первом издании.
- Глава 2 первого издания («The Unix Model» — «Модель Unix») не вошла во второе издание. В этой главе содержался обзор системы Unix, и занимала она 75 страниц. В 1990 году эта глава была необходима, поскольку было не так много книг, адекватно описывающих основной программный интерфейс Unix (в частности, существовавшие на тот период различия между реализациями Беркли и System V). В настоящее время гораздо больше читателей имеют представление о Unix, и поэтому такие понятия, как идентификатор пользователя, файлы паролей, каталоги и идентификаторы групп пользователей, уже не нуждаются в особом пояснении. (Для читателей, которым необходима дополнительная информация в области программирования под Unix, предназначена моя книга [93], содержащая 700 страниц материала по этим вопросам.)
- Некоторые более сложные темы из прежней главы 2, предназначенные для опытных программистов, вошли и во второе издание, но они рассматриваются параллельно с применением соответствующей функциональности. Например, при рассмотрении нашего первого параллельного сервера (раздел 4.8) мы подробно описываем функцию fork. Когда мы описываем обработку сигнала SIGCHLD, мы рассказываем о многих дополнительных функциональных возможностях обработки сигналов Posix (зомбированные процессы, прерванные системные вызовы и т. д.).
- Везде в книге мы стремились по возможности использовать стандарт Posix. (Более подробно о семействе стандартов Posix говорится в разделе 1.10.) Сюда относятся не только стандарт Posix. 1 для основных функций Unix (управление процессами, сигналы и т. п.), но и более новый стандарт Posix. lg для соке-тов и ХТ1 и стандарт Posix. 1 1996 года для потоков.
При описании таких функций, как socket и connect, термин «системный вызов» был заменен на термин «функция» Это связано с принятым в Posix соглашением о том, что различие между системным вызовом и функцией — это подробность реализации, как правило, не имеющая значения для программиста.
- Прежние главы 4 («A Network Primer» — «Сетевой букварь») и 5 («Communication Protocols» — «Протоколы передачи данных») заменены приложением А, в котороштисываются протоколы IP версии 4 (IPv4) и версии 6 (IPv6), и главой 2, в которой рассказывается о протоколах TCP и UDP. Этот новый материал в основном посвящен тем аспектам сетевых протоколов, с которыми наиболее часто встречается разработчик сетевых приложений. В книге также приводится описание протокола IPv6. Хотя на момент написания книги этот протокол только начал применяться, он, вероятно, станет наиболее широко используемым протоколом, когда книга дойдет до читателя,
В процессе преподавания сетевого программирования я пришел к выводу, что около 80% всех возникающих в этой области проблем на самом деле не имеет ничего общего с собственно сетевым программированием. Я имею в виду, что эти проблемы связаны не с функциями API, такими как accept или sel ect, а с непониманием лежащих в их основе сетевых протоколов. Например, я обнаружил, что как только студенту удается разобраться с трехэтапным рукопожатием (three-way handshake) и последовательностью обмена четырьмя пакетами при завершении соединения, ему становятся понятны и многие аспекты сетевого программирования.
Из второго издания удалены разделы, посвященные XNS, SNA, NetBIOS, протоколам OSI и UUCP, так как уже в начале 1990-х стало очевидно, что они уступили место протоколам TCP/IP. (Хотя UUCP не устарел и до сих пор пользуется популярностью, в контексте сетевого программирования мало что можно рассказать об этом протоколе.)
- Во втором издании освещены следующие новые темы:
- Совместимость IPv4 и IPv6 (глава 10).
- Независимые от протокола преобразования имен (глава II).
- Маршрутизирующие сокеты (глава 17).
- Многоадресная передача (глава 19).
- Потоки (глава 23). D Параметры IP (глава 24).
- Доступ к канальному уровню (глава 26).
- Альтернативное устройство клиента и сервера (глава 27),
- Виртуальные сети и туннелирование (приложение Б).
- Технологии отладки сетевых программ (приложение В).
К первому изданию было сделано столько добавлений, что, к сожалению, получившийся материал не может войти в одну книгу. Поэтому планируется выпустить еще как минимум два тома.
- Второй том получит подзаголовок «Взаимодействие процессов» (IPC: Interprocess Communications) и станет расширением главы 3 первого издания. В него также войдет описание механизмов IPC реального времени по стандарту Posix.l.
- Третий том будет иметь подзаголовок - «Приложения» («Applications») и будет представлять собой расширение глав 9-18 первого издания.
Большинство сетевых приложений будет рассматриваться в третьем томе, но некоторые специальные приложения рассматриваются в этом томе, а именно программы Ping, Traceroute и демон Inetd.
Кому адресована эта книга
Эту книгу можно использовать и как учебное пособие по сетевому программированию, и как справочник для более опытных программистов. При использовании его как учебника или для ознакомления с сетевым программированием следует уделить особое внимание второй части («Элементарные сокеты», главы 3-9), после чего можно переходить к чтению тех глав, которые представляют наибольший интерес. Во второй части рассказывается об основных функциях сокетов — как для TCP, так и для UDP; кроме того, рассматриваются мультиплексирование ввода-вывода, параметры сокетов и основные преобразования имен и адресов. Всем читателям следует прочесть главу 1, в особенности раздел 1.4, так как в нем описаны некоторые функции-обертки, используемые далее во всей книге. Глава 2 и, возможно, приложение А могут быть использованы по мере необходимости для получения справочных сведений в зависимости от уровня подготовки читателя. Большинство глав в третьей части («Дополнительные возможности сокетов») могут быть прочитаны независимо от других содержащихся в этой же части.
Для тех, кто собирается использовать эту книгу в качестве справочного пособия, имеется подробный предметный указатель. Для тех, кто будет читать только выборочные главы в произвольном порядке, в книге имеются ссылки на те места, где обсуждаются близкие темы.
Хотя API сокетов стал фактическим стандартом сетевого программирования, наравне с ним используется и ХТ1, иногда с отличным от TCP/IP набором протоколов. Интерфейсу ХТ1 посвящена четвертая часть. Он описан нс так подробно, как интерфейс сокетов во второй и третьей частях. Это объясняется тем, что основные концепции интерфейса сокетов применимы и к ХТ1. Например, все кон-
Этот том также переведен и выпущен издательством «Питер»: У. Стивене. UNIX: взаимодействие процессов. — СПб.: Питер, 2002.
Концепции интерфейса сокетов, относящиеся к использованию неблокируемого ввода-вывода, широковещательной и многоадресной передачи, управляемого сигналом ввода-вывода, внеполосных данных и потоков, остаются в силе и для интерфейса ХТ1. Действительно, многие аспекты сетевого программирования схожи в своей основе независимо от того, сокеты или ХТ1 вы используете в своих программах, и вряд ли есть какие-то задачи, которые один API позволяет решить, а другой нет. Концепции остаются неизменными — меняются лишь имена функций и их аргументы.
Исходный код и замеченные опечатки
Исходный код для всех примеров расположен на моей домашней странице, адрес которой указан в конце предисловия. Чтобы научиться сетевому программированию, лучше всего будет взять эти программы, изменить их и расширить. На самом деле написание программ таким образом является единственным способом овладеть изученными технологиями. В конце каждой главы приводятся упражнения, а ответы на большинство из них содержатся в приложении Г.
Список найденных опечаток по этой книге также находится на моей домашней странице.
Начало
Краткое содержание
Полное содержание
[Заказать книгу в магазине "Мистраль"]
|
|