глава 30 другие приложения tcp/ip в этой главе мы опишем приложения tcp/ip, которые присутствуют почти во всех реализациях. некоторые из них просты и их можно описать целиком (finger и whois), тогда как другие достаточно сложны (x window system). сложные приложения мы рассмотрим, не вдаваясь в подробности, фокусируя свое внимание на то, как они используют протоколы tcp/ip. в дополнение, мы приведем обзор некоторых средств internet, которые позволяют определить ресурсы. это средства, которые помогают нам ориентироваться в internet, искать отдельные пункты, точное положение которых и точные имена которых не известны. протокол finger возвращает информацию об одном или нескольких пользователях на указанном хосте. это приложение обычно используется, для того чтобы посмотреть, находится ли конкретный пользователь в настоящее время в системе, или чтобы получить имя какого-либо пользователя, чтобы послать ему почту. rfc 1288 [zimmerman 1991] описывает этот протокол. многие узлы не запускают finger сервер по двум причинам. во-первых, ошибки в программировании в ранних версиях сервера были одной из точек входа "червяка" в internet в 1988 году. (rfc 1135 [reynolds 1989] и [curry 1992] описывают этого "червяка" более подробно.) во-вторых, протокол finger может предоставить подробную информацию о пользователях (login имя, телефонные номера, время последнего логирования и так далее), а эту информацию большинство администраторов считают частной. раздел 3 rfc 1288 детально описывает аспекты секретности, соответствующие сервису finger. сервер finger использует заранее известный порт 79. клиент осуществляет активное открытие на этот порт и отправляет запрос длиной в 1 строку. сервер обрабатывает запрос, посылает назад вывод и закрывает соединение. запрос и отклик в формате nvt ascii, почти так же как мы видели в случае ftp и smtp. обычно большинство пользователей unix получают доступ к серверу finger с использованием клиента finger(1), однако мы воспользуемся telnet клиентом, подсоединимся непосредственно к серверу и рассмотрим команды, которые выдаются клиентом (команды длиной в 1 строку). если запрос клиента состоит из пустой строки (которая в nvt ascii передается как cr, за которой следует lf), это воспринимается как запрос на информацию о всех текущих пользователях.
пустые поля с названием офиса и рабочего телефона взяты из необязательных полей в файле пользовательских паролей (которые в данном случае отсутствуют). сервер на своей стороне осуществляет активное закрытие, при этом сервер возвращает переменное количество информации, а получение клиентом метки конца файла оповещает клиента о том, что вывод завершен. когда в запросе клиента содержится имя пользователя, сервер выдает информацию только об этом пользователе. здесь приведен еще один пример, вывод telnet клиента удален:
когда finger сервис отключен, клиент, в ответ на активное открытие, получает от сервера rst, так как никакой из процессов не осуществил пассивное открытие на порт 79: sun % finger @svr4 [svr4.tuc.noao.edu] connect: connection refused
некоторые узлы предоставляют определенный сервис на порт 79, однако они просто сообщают информацию, не обращая внимание на клиентские запросы:
существует возможность организовать брандмауэр (firewall gateway). маршрутизатор между организацией и internet, который фильтрует конкретные ip датаграммы. ([cheswick and bellovin 1994] описывает брандмауэры более подробно.) брандмауэр может быть сконфигурирован таким образом, чтобы отбрасывать входящие датаграммы, которые содержат tcp сегменты на порт 79. в этом случае finger клиент прекратит работу по тайм-ауту примерно через 75 секунд. у finger сервера и unix клиента finger существуют набор опций. обратитесь к rfc 1288 и к страницам помощи по finger(1) за более подробной информацией. rfc 1288 заявляет, что машины с tcp/ip соединениями, которые предоставляют сервер finger, должны отвечать на запрос клиента содержащий пустую строку, списком всех пунктов, доступных в настоящий момент. они должны отвечать на запрос клиента содержащий имя, счетчиком или списком доступных пунктов для этого продукта. протокол whois протокол whois это еще один информационный сервис. несмотря на то, что любой узел может предоставить whois сервис, наиболее широко используется internic, rs.internic.net. этот сервер содержит информацию о всех зарегистрированных dns доменах и о большинстве системных администраторов, которые ответственны за системы, подключенные к internet. (еще один подобный сервер nic.ddn.mil содержит информацию о сети milnet.) к сожалению, не всегда предоставляется полная информация. rfc 954 [harrenstein, stahl, and feinler 1985] документирует сервис whois. с точки зрения протокола, сервер whois работает с заранее известным портом tcp 43. он принимает от клиента запрос на соединение, после чего клиент отправляет на сервер запрос длиной в 1 строку. сервер выдает информацию и закрывает соединение. запросы и отклики передаются в формате nvt ascii. он практически идентичен серверу finger, за исключением того, что запросы и отклики содержат разную информацию. широко используемый unix клиент - программа whois(1) , однако можно использовать telnet и ввести команды самостоятельно. сначала отправляется запрос, содержащий знак вопроса, на что возвращается более подробная информация о поддерживаемых запросах клиента. когда nic было переименовано в internic в 1993 году, узел для сервера whois переместился с nic.ddn.mil на rs.internic.net. многие производители все еще поставляют версии клиента whois с именем nic.ddn.mil, встроенном вовнутрь. вам может потребоваться указать аргумент командной строки -h rs.internic.net, чтобы подсоединиться к нужному серверу. другой способ - использовать telnet, чтобы подсоединиться к rs.internic.net с именем whois.
воспользуемся whois сервером, чтобы получить информацию об авторе. (весь вывод telnet клиента удален.) первый запрос - поиск всех имен, совпадающих с шаблоном "stevens."
sun % telnet rs.internic.net whois
три заглавные буквы, которые стоят перед цифрами в скобках после имени, (wrs28), это персональный описатель nic. следующий запрос содержит восклицательный знак и описатель nic, что позволяет получить более подробную информацию об этом человеке.
также можно получить дополнительную информацию о переменных internet. например, запрос net 140.252 возвращает информацию о сети класса b 140.252. с использованием команды vrfy в smtp, вместе с протоколом finger и протоколом whois можно определить положение пользователей в internet. это напоминает использование белых страниц в телефонной книге, когда необходимо найти чей-нибудь телефонный номер. в настоящее время существуют широко доступные средства, однако проводятся исследования, призванные улучшить этот тип сервиса. [schwartz and tsirigotis 1991] приводит дополнительную информацию о различных сервисах белых страниц, которые появляются в internet. один из них netfind; к нему можно получить доступ по telnet на хосте bruno.cs.colorado.edu или ds.internic.net (имя пользователя netfind). rfc 1309 [weider, reynolds, and heker 1992] предоставляет краткое описание службы директорий osi, которая называется x.500, где приводится сравнение отличие с текущими технологиями internet (finger и whois). archie, wais, gopher, veronica и www средства, которые мы описали в двух предыдущих разделах, - finger, whois и сервис белых страниц предоставляют информацию о местонахождении персон. существуют другие средства, которые позволяют находить файлы и документы. в следующем разделе дается краткое описание этих средств. мы приводим только краткое описание, потому что рассмотрение в деталях каждого из них может занять целую книгу. новые программы разрабатываются постоянно. [obraczka, danzig, and li 1993] описывает сервисы поиска ресурсов в internet. многое из того, что показано этой книге, было получено с использованием анонимного ftp. проблема заключается в том, чтобы найти ftp узел, на котором находится необходимая программа. иногда мы даже не знаем точное имя файла, однако знаем какое-либо ключевое слово, которое может появиться в имени файла. archie предоставляет информацию о тысячах ftp серверов на бескрайних просторах internet. мы можем получить доступ к этой информации, зайдя на сервер archie и осуществив поиск файла, имя которого содержит указанное регулярное выражение. в ответ появится список серверов, для которых было найдено совпадение с именами файлов. затем мы используем анонимный ftp, чтобы получить файл. существует много archie серверов по всему миру. стартовая точка - telnet заход на ds.internic.net, под именем archie и исполнение команды servers. при этом будет возвращен список всех archie серверов и их положений. wais: информационные сервисы глобальных сетей archie помогает найти положение имен файлов, содержащих ключевые слова, однако иногда приходится искать файл или базу данных, ключевое слово в которой содержится внутри. таким образом, осуществляется поиск файла, содержащего ключевое слово, а не имени файла, содержащего ключевое слово. wais знает о сотнях баз данных, которые содержат информацию по темам, связанным с компьютерами, и другим общим темам. чтобы использовать wais, мы выбираем базы данных для поиска и указываем ключевые слова. чтобы попробовать wais, попробуйте подсоединиться telnetом к quake.think.com с именем пользователя wais. gopher это меню-ориентированное приложение для работы с разнообразными сервисами internet, таких как archie, wais и анонимный ftp. gopher это одно из наиболее легко используемых средств, так как его пользовательский интерфейс не зависит от того, какой сервис используется. чтобы воспользоваться gopher, подсоединитесь telnetом к is.internic.net с именем пользователя gopher. veronica: very easy rodent-oriented netwide index to computerized archives тогда как archie это индекс анонимных ftp серверов, veronica это индекс заголовков пунктов gopher. veronica обычно осуществляет поиск по сотням gopher серверов. чтобы получить доступ к veronica, необходимо воспользоваться клиентом gopher. выберите пункт меню в gopher "beyond internic: virtual treasures of the internet", а затем выберите veronica из следующего меню. world wide web позволяет нам просмотреть в мировом масштабе большой набор сервисов и документов с использованием средства, которое называется гипертекст (hypertext). по мере того как информация отображается, определенные ключевые слова подсвечиваются, и мы можем получить более подробную информацию с использованием этих ключевых слов. чтобы получить доступ к www, подсоединитесь telnetом к info.cern.ch. x window system, или просто x, это приложение клиент-сервер, которое позволяет нескольким клиентам (приложениям) использовать графический дисплей, управляемый сервером. сервер это программное обеспечение, которое управляет дисплеем, клавиатурой и мышкой. клиент это программа приложения, которая запущена либо на том же самом хосте, что и сервер, либо на другом хосте. в последнем случае обычная форма связи между клиентом и сервером это tcp, однако могут быть использованы и другие протоколы, такие как decnet. в некоторых случаях сервер это часть аппаратного обеспечения (x терминал), которая общается с клиентом на другом хосте. в другом случае отдельно стоящая рабочая станция, клиент и сервер находятся на одном и том же хосте и общаются с помощью коммуникаций между процессами на этом хосте, без использования сетевого обеспечения. однако наиболее стандартная ситуация, когда клиенты запущены на том же хосте, что сервер, или когда клиенты запущены на других хостах. x требует надежный, двунаправленный потоковый протокол, такой как tcp. (x не разработана для работы с ненадежными протоколами, такими как udp.) общение между клиентом и сервером осуществляется посредством обмена 8-битовыми байтами по этому соединению. [nye 1992] приводит формат более чем 150 сообщений, которыми обмениваются клиент и сервер по tcp соединению. в unix системах, когда x клиент и x сервер находятся на одном и том же хосте, вместо tcp обычно используются протоколы unix domain, потому что в этом случае осуществляется меньше обработки протоколов, нежели при использовании с tcp. протоколы unix domain это форма общения между процессами, которая может быть использована между клиентами и серверами на одном и том же хосте. обратитесь к рисунку 2.4, на котором видно, что когда tcp используется для общения между двумя процессами на одном и том же хосте, эти данные передаются по петле ниже ip уровня, при этом осуществляется обработка данных и tcp, и udp. на рисунке 30.1 показан возможный вариант общения трех клиентов, использующих один дисплей. один клиент на том же самом хосте, что и сервер, использует unix domain протоколы. остальные два клиента находятся на других хостах и используют tcp. один клиент это обычно оконный менеджер (window manager), который имеет право располагать окна на дисплее. оконный менеджер позволяет нам передвигать окна по экрану или, например, менять их размер. на первый взгляд термины клиент и сервер не совсем уместны в данном случае. с такими приложениями как telnet и ftp мы считаем, что клиент это интерактивный пользователь, который сидит за клавиатурой и дисплеем. однако в случае x клавиатура и дисплей принадлежат самому серверу. поэтому в данном случае сервер это то, что предоставляет сервис. сервис, предоставляемый x, это доступ к окну, клавиатуре и мышке. в случае telnet сервис это терминальный заход на удаленный хост. в случае ftp сервис это файловая система сервера. x сервер обычно стартует, когда x терминал или рабочая станция загружаются. сервер создает конечную точку tcp и осуществляет пассивное открытие на порт 6000 + n, где n это номер дисплея (обычно 0). рисунок 30.1 три x клиента, использующие один дисплей.
большинство unix серверов также создают unix domain сокет с именем /tmp/.x11-unix/xn, где n это тот же номер дисплея. когда клиент стартует на другом хосте, он создает tcp конечную точку и осуществляет активное открытие на порт 6000 + n сервера. каждый клиент имеет свое собственное tcp соединение с сервером. уже от сервера будет зависеть, как он поделит ресурсы между всеми клиентами. клиент отправляет по tcp соединению запросы на сервер (создает окно), сервер посылает обратно отклики, а также сервер посылает события клиенту (нажатие кнопки мыши, нажатие клавиш на клавиатуре, перемещение окна, изменение размера окна и так далее). на рисунке 30.2 повторен рисунок 30.1, где показаны фазы общения клиента с процессом x сервера, которые, в свою очередь, обслуживают окна на дисплее. здесь не показано, как x сервер обслуживает клавиатуру и мышь. рисунок 30.2 три клиента, использующие один дисплей.
подобная форма, когда один сервер обрабатывает несколько клиентов, отличается от обычного tcp конкурентного сервера, который мы описали в разделе "реализация tcp сервера" главы 18. ftp и telnet серверы, например, запускают новый процесс каждый раз, когда приходит запрос на новое tcp соединение, поэтому каждый клиент общается со своим процессом сервера. в случае x, все клиенты, запущенные на этом же хосте или на другом хосте, общаются с одним сервером. по tcp соединению между x клиентом и его сервером осуществляется обмен большим количеством данных. количество данных зависит от конкретной реализации приложения. например, если мы запустим клиента xclock, который отображает текущее время и дату в окне клиента на сервере и укажем ему обновляться один раз в секунду, x сообщения посылаются по tcp соединению от клиента к серверу один раз в секунду. если мы запустим эмулятор x терминала, xterm, каждое нажатие клавиши будет генерировать 32-байтное x сообщение (72 байта вместе со стандартными ip и tcp заголовками), и еще больше x сообщений в обратном направлении с символами, отраженными эхом. [droms and dyksen 1990] рассчитывает tcp траффик между различными x клиентами и одним конкретным сервером. удобная программа, с помощью которой можно определить, чем обмениваются x клиент и его сервер, это xscope. она поставляется с большинством реализаций x window. программа находится между клиентом и сервером, пропуская все данные в обоих направлениях, при этом отлавливая все запросы клиента и отклики сервера. на рисунке 30.3 показано, как это происходит. рисунок 30.3 использование xscope для мониторинга x соединения.
во-первых, мы стартовали процесс xscope на том же самом хосте, где находится сервер, при этом xscope слушает запросы на tcp соединение приходящие на порт 6001, а не 6000. затем мы стартовали клиента на другом хосте и указали дисплей номер 1, а не 0, таким образом, клиент подключается к xscope, а не непосредственно к серверу. когда запрос на соединение прибывает от клиента, xscope создает tcp соединение на реальный порт сервера 6000 и копирует все между клиентом и сервером, а также предоставляет читаемое описание запросов и откликов. мы запустим xscope на хосте sun, а клиента xclock на хосте svr4. svr4 % display=sun:1 xclock -digital -update 5
при этом отображаются время и дата в цифровом формате thu sep 9 10:32:55 1993
в окне на хосте sun. мы указали обновлять время один раз каждые 5 секунд. также указана опция -q команды xscope, чтобы получать минимальный вывод. доступны различные уровни отладки, что позволяет просмотреть все поля в каждом сообщении. следующий вывод показывает первые три запроса и отклика.
первое сообщение от клиента в момент времени 0,00 и отклик сервера в момент времени 0,02 это стандартное установление соединения между клиентом и сервером. клиент указывает порядок следования байтов и версию сервера, которую он ожидает. сервер сообщает о себе различную информацию. следующее сообщение в момент времени 0,03 содержит два запроса от клиента. первый запрос создает на сервере графическое окружение, в котором клиент будет рисовать. второй получает свойства от сервера (характеристика resource_manager). свойства обеспечивают общение между клиентами, обычно между приложением и оконным менеджером. отклик от сервера размером 396 байт в момент времени 0,20 содержит это свойство. следующие два сообщения от клиента в моменты времени 0,30 и 0,38 имеют форму одного запроса, который требует вернуть атом. (каждое свойство имеет уникальный целый идентификатор, который называется атом.) в момент времени 0.43 сервер отправляет отклик, содержащий атом. рассматривать этот пример дальше невозможно без подробного описания того, как работает система x window system, что не является целью нашего повествования. в этом примере мы видим, что перед тем как на дисплее появилось окно, клиент отправил 12 сегментов, содержащих 1668 байт, а сервер отправил 10 сегментов, содержащих 1120 байт. весь процесс занял 3,17 секунды. с этого момента, каждые 5 секунд, клиент посылает маленький запрос в среднем по 44 байта, которые обновляют окно. это продолжается до тех пор, пока клиент не будет выключен. lbx: x с низкой шириной полосы кодирование, используемое протоколом x, оптимально для работы в локальных сетях, где время, которое тратится на кодирование и декодирование данных, более важно, нежели минимизация количества передаваемых данных. при работе с ethernet все нормально, однако в случае медленных последовательных каналов, таких как slip и ppp (глава 2, разделы "slip: ip по последовательной линии" и "ppp: протокол точка-точка") возникают проблемы. поэтому был разработан стандарт low bandwidth x (lbx), который использует следующую технику для уменьшения сетевого траффика: кэширование, отправку изменений от предыдущих пакетов и сжатие. спецификации появились в 1993 году с реализацией x window system release 6. первые два приложения, которые мы рассмотрели, finger и whois, предназначены для получения информации о пользователях. клиент finger запрашивает сервер, чаще всего для того, чтобы найти какое-либо имя (например, чтобы отправить пользователю почту) или для того чтобы посмотреть, зашел ли кто-либо в систему терминалом в настоящий момент. клиент whois обычно общается с сервером, запущенным от internic, в поисках информации о человеке, организации, домене или номере сети. другие сервисы, позволяющие более эффективно работать с ресурсами internet, это archie, wais, gopher, veronica и www. они помогают найти в internet файлы и документы. в настоящее время разрабатываются и другие средства определения ресурсов. эта глава закончена кратким рассмотрением системы x window system, еще одного очень "серьезного" приложения, работающего с tcp/ip. мы видели, что x сервер обслуживает несколько окон на дисплее и обеспечивает общение клиента с его окном. с помощью программы xscope мы видели, как существует возможность поместить еще одну программу между клиентом и сервером, чтобы получить информацию о том, с помощью каких сообщений осуществляется обмен. упражнения
|