Предисловие
Мне выпала особая честь представить сторонникам принципов разработки систем с открытым исходным кодом третий том замечательной серии книг доктора Дугласа Э. Камера - "Сети TCP/IP".
Сама история разработки с открытым исходным кодом и развития протоколов TCP/IP служит превосходным примером того, насколько взаимосвязаны эти два направления. Во-первых, только после появления средств обмена данными по сети сложились предпосылки совместной работы программистов из разных стран мира, а во-вторых, одни из самых первых разработок программного обеспечения с открытым исходным кодом были посвящены именно реализации протоколов TCP/IP. Многие еще помнят начало 80-х годов. Это было задолго до того, как разработки с открытым исходным кодом стали излюбленной темой компьютерной прессы. В те дни лишь немногие исследователи сумели понять, какие проблемы лежат в основе архитектуры и реализации сетей. Дуглас и тогда был в числе лидеров. Он возглавил работы по обширной программе исследований и внес огромный вклад в решение многочисленных проблем.
В начале 90-х годов впервые появились предпосылки широкомасштабного применения сетевых технологий на производстве, но стал ощущаться большой дефицит знаний и опыта. Тем, кому было поручено создать на предприятии вычислительную среду на основе протоколов объединенных сетей, приходилось решать нелегкие задачи. Дуглас взял на себя обязанности по обучению и подготовке специалистов по сетям. Он раскрывал перед ними все тайны профессии и делился своими знаниями, накопленными нелегким трудом.
И вот настал XXI век. На помощь ветеранам пришло новое поколение разработчиков, которые создают распределенные приложения для Internet. Сравнительно недавно были созданы такие замечательные приложения для Internet, как napster, gnutella и infrasearch. Но к сожалению, лишь немногие из современных программистов освоили фундаментальные принципы проектирования сетей. Откровенно говоря, слишком часто те, кому поручены столь важные разработки, не знают даже основ, и это неизбежно приводит к тому, что вновь созданные приложения недостаточно хорошо масштабируются или даже просто не работают.
Именно по этой причине для сообщества пользователей Internet имеет особо важное значение выпуск третьего тома, "Разработка приложений типа клиент/сервер для Linux/POSIX", написанного Дугласом совместно с Дэвидом Л. Стивенсом. По этой замечательной книге можно научиться проектировать и строить приложения типа клиент/сервер и, что важнее всего, оценивать преимущества и недостатки каждого проектного решения.
Я надеюсь, что уважаемый читатель сумеет по достоинству оценить педагогический талант доктора Камера.
Маршалл Т. Роуз (Marshall T. Rose)
Теоретик и агент-реализатор
г. Петалума, шт. Калифорния
Июнь 2000 года
Пролог
Операционная система Linux становится все более популярной и все чаще применяется как система с поддержкой большого количества серверов. Эта новая версия тома 3, в которой используется система Linux, предназначена для программистов, стремящихся изучить все тонкости создания сетевых приложений. В целом, эта книга отвечает на вопрос: "Как применяются протоколы TCP/IP для обеспечения взаимодействия прикладных программ по объединенной сети?" В ней в основном рассматриваются принципы взаимодействия типа клиент/сервер и приведены алгоритмы работы клиентских и серверных компонентов распределенных программ. Каждый проект проиллюстрирован практическим примером, а также описаны все необходимые методы, включая шлюзы прикладного уровня и туннелирование. Кроме того, в книге рассматривается несколько стандартных прикладных протоколов, на примере которых описаны алгоритмы и методы реализации.
Хотя этот том можно изучать и использовать отдельно, важным дополнением к нему служат два других тома данной серии. В томе 1 можно найти ответ на вопрос: "Что такое объединенная сеть TCP/IP?" Том 2 посвящен изучению темы "Как функционирует программное обеспечение TCP/IP". В нем представлены дополнительные подробности, описано практическое применение кода и даны более подробные сведения по рассматриваемой теме, чем в томе 1. Итак, хотя программист может научиться создавать сетевые приложения только на основе изучения тома 3, два других тома могут обеспечить более глубокое понимание основополагающих технологий.
В этой версии тома 3 описаны новейшие сетевые технологии. Например, в одной главе показано, как использовать в программе Linux средства потоков POSIX для создания параллельного сервера. В главе, посвященной протоколу NFS, описана версия 3, которая, по нашему мнению, должна получить широкое признание среди разработчиков Linux. Кроме того, в эту книгу включены разделы с описанием принципов работы таких программ, как slirp, предоставляющих доступ к Internet по коммутируемому телефонному соединению без наличия на каждом компьютере уникального IP-адреса.
Две главы, которые можно охарактеризовать как особенно своевременные, посвящены описанию потоковых и смежных с ними технологий, применяемых для передачи аудио- и видеоинформации по Internet. В главе 28 описаны такие фундаментальные понятия, как протокол RTP (Real-time Transport Protocol - Транспортный протокол передачи в реальном времени), кодирование и флуктуационные буферы. В главе 29 описана реализация протокола RTP, применимая для приема и воспроизведения аудиоинформации в формате MP3.
Код всех примеров книги доступен в оперативном режиме. Для получения его копии через Web найдите ссылку на том 3 в списке книг по сетям на узле:
http://www.cs.purdue.edu/homes/comer/netbooks.html
Для получения этого кода по FTP воспользуйтесь URL:
ftp://ftp.cs.purdue.edu/pub/Xinu/TCPIP-vol3.linux.dist.tar.Z
Книга построена следующим образом. В начальных главах дано вводное описание принципов взаимодействия типа клиент/сервер и интерфейса сокетов, который применяется в прикладных программах для доступа к программному обеспечению протоколов TCP/IP. В них также описаны параллельные процессы и функции операционной системы, которые служат для создания таких процессов. В главах, которые следуют за вступительным материалом, рассматриваются проекты клиентов и серверов.
Изучение этой книги позволяет понять, что бесчисленное множество возможных проектов сетевых приложений возникло не случайно. Эти проекты подчиняются строгим закономерностям, которые можно постичь, рассмотрев все разнообразие средств организации параллельной работы и сетевого транспорта. Например, в одной главе описан проект непараллельного сервера, в котором используется транспортный протокол с установлением логического соединения (например, TCP), а в другой - аналогичный проект, основанный на использовании транспортного протокола без установления логического соединения (например, UDP).
В книге также описано, как каждый проект вписывается в пространство возможных реализаций, но не предпринимается попытка разработки абстрактной "теории" взаимодействия типа клиент/сервер. В ней сделан акцент на практических принципах и методах проектирования, наиболее важных для программистов. Каждый метод при определенных обстоятельствах имеет свои преимущества и может применяться в прикладном программном обеспечении. Авторы надеются, что понимание концептуальных связей между описанными проектами поможет читателю оценить сильные и слабые стороны каждого подхода и сделать выбор между ними.
В книге приведены примеры программ, которые демонстрируют практическое воплощение каждого проекта. В большинстве примеров реализуются стандартные прикладные протоколы TCP/IP. В каждом случае сделана попытка выбрать прикладной протокол, позволяющий довести до читателя рассматриваемую идею проекта без дополнительной сложной информации, затрудняющей понимание. Поэтому каждый пример программы иллюстрирует важное понятие, а некоторые из них превосходны сами по себе. В этой версии тома 3 во всех примерах программ используется механизм сокетов Linux (т.е. API-интерфейс сокетов); две другие версии этого тома содержат часть тех же примеров, выполненных с использованием интерфейса сокетов системы Windows компании Microsoft и интерфейса TLI компании AT&T.
Последние главы в основном посвящены описанию промежуточного программного обеспечения. В них рассматривается принцип дистанционного вызова удаленных процедур и описано, как этот принцип может применяться для построения распределенных программ. В этих главах показано, как связаны между собой модель вызова удаленных процедур и модель взаимодействия типа клиент/сервер, а также описано программное обеспечение, которое может применяться для формирования клиентских и серверных программ на основе описания интерфейса вызова удаленных процедур. В главах, посвященных протоколу TELNET, показано, насколько важными при разработке производственной программы могут быть даже мелкие подробности и насколько сложным иногда становится код реализации даже самого простого протокола, предназначенного для обмена символьными данными. Соответствующая часть книги заканчивается двумя главами по потоковым транспортным протоколам, упомянутым ранее.
Книга в основном посвящена описанию параллельной обработки. Многие описанные понятия покажутся знакомыми студентам, которым уже приходилось разрабатывать параллельные программы, поскольку эти понятия относятся ко всем параллельным программам, а не только к сетевым приложениям. А студентам, которым не приходилось заниматься разработкой параллельных программ, придется сделать определенные усилия по освоению этих понятий.
Книга может лечь в основу курса по программированию сокетов продолжительностью в один семестр, предназначенного для студентов старших курсов, или курса по распределенным вычислениям для аспирантов первых лет обучения. Поскольку она в основном посвящена описанию способов использования объединенной сети, а не принципов ее работы, от студентов для понимания этого материала не требуется предварительная подготовка по сетям. Ни одно из рассматриваемых понятий не покажется студентам слишком трудным при том условии, если преподаватель сумеет найти правильный темп изложения материала. Наилучшей основой для освоения книги может служить базовый курс, состоящий в изложении принципов работы операционных систем, или опыт в области параллельного программирования.
Студенты не смогут оценить важность излагаемого материала до тех пор, пока не приступят к его практическому применению. Поэтому любой курс, основанный на этой книге, должен начинаться с упражнений по программированию, которые поставят студентов перед необходимостью применять излагаемые идеи в практических программах. Студенты старших курсов могут изучать излагаемые основы, повторяя описанные проекты в программах реализации других прикладных протоколов. Аспиранты должны строить более сложные распределенные программы, в которых сделан акцент на некоторых более сложных методах (например, методах управления параллельной работой, которые рассматриваются в главе 16, и методах межсоединения, описанных в главах 18 и 19).
Авторы хотели бы выразить свою благодарность многим людям за их помощь. Члены исследовательской группы по Internet университета Пардью предоставили техническую информацию и внесли предложения по улучшению рукописи книги. Майкл Эвангелиста (Michael Evangelista) прочитал корректуру книги и разработал код реализации протокола RTP. Густаво Родригес-Ривера (Gustavo Rodriguez-Rivera) исправил отдельные главы, провел эксперименты для проверки некоторых сведений и отредактировал Приложение 1. Деннис Брилоу (Dennis Brylow) прокомментировал часть глав. Кристина Камер (Christine Comer) отредактировала весь текст, уточнила формулировки и устранила неточности.
Дуглас Э. Камер
Дэвид Л. Стивенс
Июль 2000 года
Об авторах
Доктор Дуглас Камер (Douglas Comer) - признанный в мире специалист по протоколам TCP/IP и сети Internet. Он стоял у истоков Internet и внес огромный вклад в развитие и становление глобальной сети в конце 70-х и начале 80-х годов XX века. Он был членом архитектурного совета по Internet (Internet Architecture Board - IAB) - группы специалистов, определявших стратегию развития глобальной сети. Дуглас также являлся председателем технического комитета и членом исполнительного совета CSNET.
Доктор Дуглас Камер консультирует различные компании по вопросам разработки и развертывания сетей, а также проводит по всему миру семинары по протоколам TCP/IP и созданию сетей на их основе. Его лекции рассчитаны как на профессионалов, так и на рядовых пользователей Internet. Дуглас написал операционную систему Xinu и создал собственную реализацию протоколов TCP/IP. Все это он отразил в своих книгах. Написанное им программное обеспечение используется во многих коммерческих продуктах.
Доктор Камер является профессором компьютерных наук университета Пардью (Purdue University), где он преподает и занимается научно-исследовательской работой в области локальных и глобальных компьютерных сетей и операционных систем. Кроме написания серии научно-технических книг, ставших бестселлерами во всем мире, Дуглас редактирует североамериканский журнал Software - Practice and Experience. Доктор Камер является также действительным членом ассоциации ACM (Association of Computing Machinery - Ассоциация пользователей вычислительных машин).
Дополнительную информацию о нем вы можете получить в Internet по адресу:
www.cs.purdue.edu/people/comer
Дэвид Стивенс получил степень бакалавра наук (1985) и магистра наук (1993) по информатике в университете Пардью. С 1983 года он был системным программистом UNIX и работал в основном с версиями ядра BSD UNIX. Он подготовил варианты реализации основной части набора протоколов для Internet и выпустил несколько учебников по компьютерным наукам совместно с доктором Камером. Область его профессиональных интересов включает операционные системы, компьютерные сети и проектирование крупномасштабных программных систем.
В последние годы Стивенс работал в области масштабируемых сетей на базе высокоэффективных многопроцессорных систем по поручению компании Sequent Computer Systems и корпорации IBM. Он также является почетным членом ACM и IEEE (Institute of Electrical and Electronics Engineers - Институт инженеров по электротехнике и электронике).
Мнения специалистов по поводу версии Linux/POSIX тома 3 серии "Сети TCP/IP"
Дастин Босуэлл (Dustin Boswell), компания Caltech:
- Безусловно, это самая лучшая книга по данной теме, которую я когда-либо читал. Спасибо авторам за то, что теперь можно легко понять, как действуют сокеты.
Джон Лин (John Lin), компания Bell Labs:
- Превосходная книга для тех, кто изучает разработку клиентских и серверных приложений TCP/IP. В ней наглядно описаны важные понятия и приведены примеры действующих программ; такое сочетание становится чрезвычайно эффективным способом изучения данной темы.
Джейкоби Свэйтс (Jacoby Thwaites):
- Ваша книга оказалась для меня исключительно ценной. Примите мою искреннюю благодарность.
Роб Молони (Rob Moloney):
- Наслаждаюсь ясностью и глубиной изложения!
Маршалл Роуз (Marshall Rose):
- Для сообщества пользователей Internet имеет особо важное значение выпуск третьего тома (Разработка приложений типа клиент/сервер для Linux/POSIX), написанного Дугласом совместно с Дэвидом Л. Стивенсом. По этой замечательной книге можно научиться проектировать и строить приложения типа клиент/сервер и, что важнее всего, понять, в чем состоят преимущества и недостатки каждого проектного решения.