60 Глава
1.
Введение
висного центра должен находиться у телефона, чтобы иметь возможность отве-
тить в том случае, если он зазвонит. Клиент совершает звонок. Когда менеджер
поднимает трубку, считается, что соединение установлено.
Следующим шагом будет выполнение сервером примитива RECEIVE, подго-
тавливающего систему к принятию первого запроса. В нормальной ситуации это
происходит сразу же после прекращения ожидания (LISTEN), даже до того, как
клиент получает подтверждение соединения. Системный вызов RECEIVE вновь
блокирует сервер.
Клиент выполняет SEND, передает запрос (3) и сразу же выполняет RECEIVE,
ожидая ответ.
Прием пакета с запросом разблокирует процесс сервера, благодаря чему он
может обработать запрос. По окончании обработки выполняется примитив SEND,
и ответ отсылается клиенту (4). Прием пакета разблокирует клиента, теперь на-
ступает его очередь обрабатывать пакет. Если у клиента есть еще запросы к сер-
веру, он может отослать их. В противном случае соединение разрывается с помо-
щью DISCONNECT. Обычно первый примитив DISCONNECT отсылает пакет,
уведомляющий сервер об окончании сеанса, и блокирует клиента (5). В ответ
сервер генерирует свой примитив DISCONNECT, являющийся подтверждением
для клиента и командой, разрывающей связь. Клиент, получив его, разблокиру-
ется, и соединение считается окончательно разорванным. Именно так в двух сло-
вах можно описать схему коммуникации с установлением соединения.
Конечно, жизнь не настолько проста. Описанный алгоритм работы весьма схе-
матичен, а кое-что просто неправильно (например, CONNECT на самом деле вы-
полняется до LISTEN). При этом пакеты, бывает, теряются, возникают и другие
проблемы. Позднее мы рассмотрим все это гораздо более подробно, но на дан-
ный момент можно получить лишь общее представление о работе клиент-сервер-
ной системы с установлением соединения. Для этого полезно внимательно изу-
чить рис. 1.14.
Увидев эти шесть пакетов, необходимых для работы протокола, можно уди-
виться, почему же не используется протокол без установления соединения? От-
вет таков: в идеальном мире, где нужны всего два пакета — один для запроса и
один для ответа, — это, возможно, имело бы смысл. Но стоит представить себе
передачу большого сообщения (скажем, мегабайтного файла), причем в обе сторо-
ны, причем с ошибками при передаче, потерянными пакетами и т. д., как ситуа-
ция меняется. Если ответ сервера состоит из нескольких сотен пакетов, парочка
из которых затерялась по пути, то как клиент узнает, что он получил сообщение
не в полном объеме? Как он узнает о том, что последний принятый пакет являет-
ся действительно последним? Допустим, клиент запросил второй файл. Как он
отличит пакет 1 из второго файла от потерянного пакета 1 из первого файла, ко-
торый вдруг нашелся? Короче говоря, в реальном мире простой протокол запро-
сов-ответов без подтверждений часто не подходит. В главе 3 мы обсудим прото-
колы, позволяющие решать самые разные проблемы, возникающие при передаче
данных. А сейчас поверьте на слово: наличие надежной связи с упорядоченным
байтовым потоком между процессами — это удобно.
Сетевое программное обеспечение 61
Службы и протоколы
Службы и протоколы являются различными понятиями, хотя часто
эти
поня-
тия смешиваются. Различие между ними, однако, столь важно, что мы хотели бы
еще раз обратить на него ваше внимание. Служба (или сервис) — это набор при-
митивов (операций), которые более низкий уровень предоставляет более высоко-
му<
Служба определяет, какие именно операции уровень будет выполнять от
лица своих пользователей, но никак не оговаривает, как должны реализовывать-
ся эти операции. Служба описывает интерфейс между двумя уровнями, в кото-
ром нижний уровень является поставщиком сервиса, а верхний — его потреби-
телем.
Напротив, протокол — это набор правил, описывающих формат и назначение
кадров, пакетов или сообщений, которыми обмениваются одноранговые сущно-
сти внутри уровня. Сущности используют протокол для реализации определе-
ний их служб. Они могут менять протокол по желанию, при условии что при
этом остаются неизменными службы, предоставляемые ими своим пользова-
телям. Таким образом, служба и протокол оказываются практически незави-
симыми.
Другими словами, службы — это нечто связанное с межуровневыми интер-
фейсами, тогда как протоколы связаны с пакетами, передающимися сущностями
одного уровня, расположенными на разных машинах. Это показано на рис. 1.15.
Важно не путать эти два понятия.
Стоит провести аналогию с языками программирования. Службу можно упо-
добить абстрактному типу данных или объекту в объектно-ориентированных язы-
ках программирования. Он определяет операции, которые могут выполняться с
объектом, но не описывает, как реализованы эти операции. В этом случае прото-
кол относится к реализации службы и, таким образом, невидим для пользовате-
лей службы.
Уровень к
+1
Т Сервис, предоставляемый уровнем к
Уровень
к
I
Протокол
Уровень
к+
1
I
Уровень к
Т
Уровень к - 1 Уровень к - 1
Рис. 1.15. Связь между службой и протоколом
Во многих старых системах служба не отделялась от протокола. В результате
типичный уровень мог содержать примитив службы SEND PACKET, в котором
пользователь должен был указать ссылку на полностью собранный пакет. Это
означало, что любые изменения протокола тут же становились видимыми для
пользователей. Большинство разработчиков сетей сегодня считают подобный под-
ход серьезнейшей ошибкой.