Методические указания по выполнению лабораторного практикума дисциплина Сети эвм и телекоммуникации
Скачать 389.91 Kb.
|
3.2 Транспортный протокол UDP Протокол UDP (User Datagram Protocol) является более простым транс- портным протоколом, чем протокол TCP. Он предоставляет прикладным про- цессам услуги транспортного уровня, которые мало чем отличаются от услуг более низкого уровня, предоставляемых протоколом IP. Протокол UDP обеспе- чивает доставку дейтаграмм, но не требует подтверждения их получения. По- этому он не требует установления соединения между передающим и прини- мающим процессами. Протокол UDP используется в тех случаях, когда требуется передать дан- ные без установления соединения. Такая связь в принципе не надежна, так как отправителю не сообщается, правильно ли принято его сообщение и получено ли оно вообще. Для проверки возникновения ошибок может использоваться контрольная сумма пакета, но ошибки никак не обрабатываются – они либо иг- норируются, либо их обработка выполняется уже на более высоком, приклад- ном уровне. Данные, отправляемые прикладным процессом через UDP, достигают мес- та назначения как единое целое, не дробясь на части. Например, если процесс- 28 отправитель передал пять сообщений через порт, то и процесс-получатель дол- жен считать из порта пять сообщений. Размер каждого записанного сообщения должен совпадать с размером каждого прочитанного. Протокол UDP используется тогда, когда требуется простейший механизм передачи данных. Тогда контроль ошибок либо не выполняется (например, в прикладном протоколе TFTP – Trivial File Transfer Protocol – простейший про- токол передачи файлов), либо выполняется на прикладном уровне (например, в управляющем протоколе SNMP – Simple Network Management Protocol или в файловой системе NFS – Network File System). 3.3 Порты, мультиплексирование и демультиплексирование Пакеты, поступающие на транспортный уровень, организуются операци- онной системой в виде множества очередей к точкам входа различных при- кладных процессов. В терминологии TCP/IP такие системные очереди называ- ются портами. Порт однозначно определяет приложение в пределах компьюте- ра. Порты приложений не стоит путать с портами (интерфейсами) оборудова- ния. Существуют два способа присвоения порта приложению – централизован- ный и локальный. За каждым из этих способов закреплен свой диапазон номе- ров портов: для централизованного - от 0 до 1023, для локального – от 1023 до 65 535. Если процессы представляют собой популярные общедоступные службы, такие как FTP, telnet, HTTP, TFTP, DNS и т. п., то за ними закрепляются стан- дартные присвоенные (assigned) номера, иногда также называемые хорошо из- вестными (well-known) номерами. Централизованное присвоение службам но- меров портов выполняется организацией Internet Assigned Numbers Authority (IANA). Эти номера закрепляются и публикуются в стандартах Internet (RFC 1700). Примеры хорошо известных портов приведены в таблице 3.1. Для тех служб, которые еще не стали столь распространенными, чтобы за- креплять за ними стандартные номера, номера портов выделяются локально. На каждом компьютере операционная система ведет список занятых и свободных 29 номеров портов. При поступлении запроса от приложения, выполняемого на данном компьютере, операционная система выделяет ему первый свободный номер. Такие номера называют динамическими (dynamic). В дальнейшем все сетевые приложения должны адресоваться к данному приложению с указанием назначенного ему номера порта. После того как приложение завершит работу, выделенный ему локальный номер порта возвращается в список свободных и может быть назначен другому приложению. Таблица 3.1 – Примеры номеров портов наиболее популярных служб сети Internet Номер порта Служба сети Описание 0 Зарезервирован 7 echo Эхо-ответ на входящие сообщения 9 discard Сброс (поглощение) всех входящих сообщений 11 users Активные пользователи 13 daytime Отклик, содержащий время дня 19 chargen Генератор символов 20 ftp data Передача данных по протоколу FTP 21 ftp Передача управляющих команд по протоколу FTP 23 telnet Порт подключения по протоколу TELNET 25 smtp Протокол передачи почтовых сообщений SMTP 37 time Отклик, содержащий время 42 name Сервер имен 53 domain Сервер имен доменов 67 boots Протокол удаленной загрузки сервера 68 bootc Протокол удаленной загрузки клиента 69 tftp Упрощенный протокол передачи файлов TFTP 79 finger Протокол получения информации о пользователях FINGER 80 http Протокол передачи гипертекста HTTP 109 pop2 Протокол почтового ящика POP2 110 pop3 Протокол почтового ящика POP3 111 rpc Протокол удаленного вызова процедур RPC 156 sqlserv Служба SQL 161 snmp Управляющий протокол SNMP 30 Все сказанное выше о портах в равной степени относится к обоим прото- колам транспортного уровня. Нет никакой зависимости между назначением номеров для приложений, использующих протокол TCP, и приложений, рабо- тающих с протоколом UDP. Приложения, которые передают данные на уровень IP, используя протокол UDP, получают номера, называемые портами UDP. Аналогично приложениям, обращающимся к протоколу TCP, выделяются пор- ты TCP. В том и другом случаях это могут быть как назначенные, так и дина- мические номера. Диапазоны чисел, из которых выделяются номера портов TCP и UDP, совпадают. Протоколы TCP и UDP ведут для каждого номера порта две очереди: оче- редь пакетов, поступающих в данный порт из сети, и очередь пакетов, отправ- ляемых данным портом в сеть. Процедура приема данных протоколом TCP (или UDP), поступающих от нескольких прикладных служб, называется мульти- плексированием. Обратная процедура распределения протоколом TCP (или UDP) поступающих от сетевого уровня пакетов между набором высокоуровне- вых служб, идентифицированных номерами портов, называется демультиплек- сированием. 3.4 Логические соединения Для надежной передачи данных между двумя прикладными процессами предусматривается установление логического соединения. Номер порта в сово- купности с номером сети и номером конечного узла однозначно определяют прикладной процесс в сети. Этот набор идентифицирующих параметров (IP- адрес, номер порта) имеет название сокет (socket). Каждый взаимодействующий процесс идентифицируется сокетом – парой (IP-адрес интерфейса, номер порта), а каждое соединение – парой сокетов взаимодействующих процессов. Каждый процесс одновременно может участ- вовать в нескольких соединениях. Так, например, если (IP1, n1), (IP2, n2), (IP3, nЗ) – сокеты трех разных про- цессов, то возможно образование следующих соединений: − соединение 1 – {(IP1, n1), (IP2, n2)}; 31 − соединение 2 – {(IP1, n1), (IP3, n3)}; − соединение 3 – {(IP2, n2), (IP3, n3)}. Каждая такая пара однозначно идентифицирует соединение. Сутыо же по- нятия «соединение» является договоренность о параметрах, характеризующих процедуру обмена данными между двумя процессами. В протоколе TCP каждая сторона соединения посылает противоположной стороне следующие парамет- ры: − максимальный размер сегмента, который она готова принимать; − максимальный объем данных (возможно несколько сегментов), которые она разрешает другой стороне передавать в свою сторону, даже если та еще не получила подтверждения на предыдущую порцию данных; − начальный порядковый номер байта, с которого она начинает отсчет потока данных в рамках данного соединения. После того как в результате переговорного процесса модулей TCP с двух сторон соединения параметры процедуры обмена определены, одни из них ос- таются постоянными в течение всего сеанса связи, а некоторые адаптивно из- меняются. Когда устанавливается несколько соединений, то может случиться, что не- сколько машин пошлют запросы на соединение, в которых указаны одинаковые порты источники и получатели. Однако путаницы с соединениями не возника- ет, потому что IP-адреса у всех машин разные, следовательно, каждое соедине- ние будет однозначно определено своим сокетом. 3.5 Программирование обмена данными на основе транспортных протоколов TCP должен взаимодействовать не только с протоколами нижележащего уровня, но и с протоколами и приложениями прикладного уровня. Связь с при- кладным уровнем осуществляется с помощью набора сервисных примитивов. Сервисные примитивы определены в стандарте протокола, а для прикладных программ они доступны в форме библиотек работы с сокетами. 32 При установлении соединения каждая из сторон выполняет некоторые операции, называемые открытием соединения. Открытие может быть пассив- ным или активным. Как правило, одна из сторон производит активное открытие соединения, а другая – пассивное, тогда соединение устанавливается. Оба ре- жима подчиняются четким правилам. Пассивное соединение еще иногда назы- вают серверным, а активное – клиентским. При активном соединении процесс прикладного уровня передает про- граммному обеспечению TCP на той же ЭВМ сервисный примитив запроса на установление соединения с номером сокета, после чего TCP отправляет полу- чателю запрос на установление соединения, затем ждет ответа. После установ- ления соединения активный процесс (клиент) может инициировать прием или передачу данных. При пассивном соединении прикладная программа переводит программное обеспечение TCP в режим ожидания запроса на соединение от удаленной сис- темы. Когда поступает запрос, программное обеспечение TCP осуществляет ус- тановку соединения, после чего пассивный процесс (сервер) готов принимать и передавать данные. Программный интерфейс сокетов изначально был разработан для операци- онной системы (ОС) UNIX. Библиотека функций, поддерживающих этот ин- терфейс, входит в ядро всех ОС типа UNIX и Linux. Однако принципы работы с этим программным интерфейсом применимы к большинству ОС, поддержи- вающих TCP/IP (например, в семействе ОС и оболочек типа Windows про- граммный интерфейс сокетов реализован в динамической библиотеке Winsock.dll). Для протокола TCP пассивное (на стороне сервера) соединение с сокетом приводит к выполнению следующих функций: − создание сокета и установление его типа (в ОС типа UNIX функция socket); − настройка сокета на конкретное соединение (указывает адрес и номер порта – в ОС типа UNIX – функция bind); 33 − создание очередей клиентов (в ОС типа UNIX – функция listen); − ожидание приходящего запроса на соединение с сокетом (в ОС типа UNIX – функция accept); − прием и передача данных от клиента (в ОС типа UNIX – функции read, write, send, recv и их модификации); − закрытие соединения с клиентом (в ОС типа UNIX – функция close). Получив входящий запрос на соединение, сервер должен решать как бы две задачи одновременно: обслуживать уже установленное с клиентом соеди- нение в соответствии с прикладным протоколом (принимать и отдавать данные клиенту) и ожидать поступления новых запросов на соединение от других кли- ентов. Обычно в развитых ОС (к ним относятся все современные ОС) эта про- блема решается за счет возможностей параллельного выполнения нескольких процессов. Сервер может породить новый процесс (или новую цепочку выпол- нения – thread), который и должен будет заняться обслуживанием уже установ- ленного соединения, а основной процесс сервера может закрыть текущее со- единение и вновь вернуться к ожиданию запросов на соединение от других клиентов. В ОС типа UNIX создание нового процесса решается с помощью функции fork, при этом за вновь созданным процессом сохраняются все соеди- нения, сделанные в основном процессе. Для протокола TCP активное (на стороне клиента) соединение с сокетом приводит к выполнению следующих функций: − создание сокета и установление его типа (в ОС типа UNIX функция socket); − установление соединения с сервером (указывает адрес и номер порта – в ОС типа UNIX – функция connect); − прием и передача данных (в ОС типа UNIX – функции read, write, send, recv и их модификации); − закрытие соединения с сервером (в ОС типа UNIX – функция close). Клиент, как правило, не требует для своей работы параллельного выпол- нения нескольких процессов. 34 В среде программирования Borland Delphi существуют специальные клас- сы, которые позволяют выполнять те же действия, что и библиотека сокетов в ОС UNIX. Они взаимодействуют с библиотекой Winsock.dll на основе специ- альных технологий ОС (ActiveX технологии и COM-объекты). В среде Borland Delphi версии 3.0 для целей клиентского и серверного соединений служит класс объектов TTCP; а в среде Borland Delphi версии 5.0 и выше для клиентского со- единения существует класс объектов TClientSocket, а для серверного – TServerSocket. Естественно, пользователь может на основе базовых классов разрабатывать свои собственные классы, которые будут поддерживать соеди- нения по определенным им самим прикладным протоколам. Для того чтобы создать сокет, достаточно создать экземпляр объекта вы- бранного класса (TTCP – в среде Borland Delphi версии 3.0 на страничке компо- нент «Internet», TClientSocket или TServerSocket – в среде Borland Delphi версии 5.0 и выше также на страничке компонент «Internet»). Это можно выполнить при проектировании приложения в среде разработки или же средствами языка программирования при выполнении приложения. Чтобы специфицировать (на- строить) сокет, необходимо созданному экземпляру объекта присвоить нужные значения в указанные свойства (properties) – как правило, это свойства с имена- ми вида «Port» и «Host» (имена и состав свойств зависят от версии среды разра- ботки). Это тоже можно сделать как в режиме проектирования приложения, так и командами присвоения свойств объекта в тексте программы. После этого со- кет инициализирован и с ним можно работать. Для работы сокета клиента необходимо открыть сокет (процедура Open устанавливает в Thru свойство Active), затем использовать процедуры установ- ления соединения, передачи и приема данных, а в конце работы закрыть сокет (процедура Close). При удалении экземпляра объекта автоматически прекратит существование и связанный с ним сокет. Краткое описание основных свойств, событий и методов объектов приведено в пункте 3.8 «Справочные данные». По установлению соединения наступит событие, которое программист должен соответствующим образом обработать. В среде Borland Delphi версии 35 3.0 программист сам должен создавать потоки выполнения для обслуживания соединения (для выполнения потоков служат экземпляры класса объектов TThread), а в среде Borland Delphi версии 5.0 и выше это можно сделать в авто- матическом режиме. Более подробную информацию о функциях программного интерфейса с сокетами можно получить в справке соответствующей среды разработки или специализированной литературе. 3.6 Пример реализации простейшего клиент-серверного приложения на основе сокетов Запустить Delphi. На пустой форме (возможен вариант совмещения функ- ций клиента и сервера в одном приложении) разместить два компонента с за- кладки Internet: TClientSocket и TServerSocket (в 6 и 7 версии Delphi они могут отсутствовать; для установки надо выполнить шаги: Component – Install Packages – Add – dclsockets60.bpl или dclsockets70.bpl). Для клиентской части программы понадобятся два компонента TEdit (один для ввода ip-адреса или dns-имени сервера, другой – для ввода передаваемой информации) и одна кнопка «Послать» для соединения с сервером и отправки ему сообщения. Для серверной части понадобится один компонент TMemo для выдачи служебной информации о подключениях и отображения принимаемых сообще- ний). В свойствах TServerSocket: установить Port в 4000, затем – Active в true. В обработчике Button1Click написать код для соединения с сервером: ClientSocket1.Host:=Edit1.Text; ClientSocket1.Port:=4000; ClientSocket1.Active:=true; Теперь, при нажатии на Button1 произойдет соединение с сервером, адрес которого был указан в Edit1. При установлении соединения произойдет собы- тие ClientSocket1.OnConnect, которое, например, надо обработать так, чтобы на сервер передавалась строка из Edit2 и происходило отсоединение: 36 Socket.SendText(Edit2.Text); ClientSocket1.Active:=False; При подключении клиента к ServerSocket1 произойдет событие Server- Socket1.OnClientConnect, в котором нужно вывести следующую информацию: Memo1.Lines.Add('Client connected from: '+Socket.RemoteHost); При попытке передать клиентом на сервер сообщение на сервере произой- дет событие ServerSocket1.OnClientRead, в котором текст считывается и выво- дится в Memo1: ReceivedString:=''; {локальная переменная типа string} while Socket.ReceiveLength>0 do ReceivedString:=ReceivedString+Socket.ReceiveText; Memo1.Lines.Add('Received string: '+ReceivedString); При отсоединении клиента произойдет событие OnClientDisconnect, в ко- тором мы добавим в Memo1 соответствующее сообщение: Memo1.Lines.Add('Client '+Socket.RemoteHost+' disconnected.'); Запустите проект и протестируйте его. В качестве ip-адреса можно исполь- зовать адреса соседних компьютеров, на которых запущены аналогичные про- граммы или адрес 127.0.0.1 для тестирования на локальном компьютере. Примечание: Оправка сообщений с сервера клиентам осуществляется с ис- пользованием тех же методов и событий соответственно на стороне сервера и клиентов. Отличие заключается в необходимости точного указания номера со- единения в свойстве Connections[Index: Integer]: TcustomWinSocket. Например: ServerSocket1.Socket.Connections[i].SendText('Test'); Здесь i = (0..N-1) – номер соединения, N – общее количество соединений. 3.7 Задание на лабораторную работу 1. Ознакомиться с теоретическим и справочным материалом. 2. Реализовать приведенное в пункте 2 простейшее приложение и ознако- миться с работой компонентов Socket. 37 3. Разработать приложение сервера и приложение клиента, позволяющее общаться между клиентами в режиме online (один сервер обслуживает несколь- ко клиентов). Приложение сервера постоянно опрашивает входящие соединения, хранит историю сообщений определенной глубины (например, 20), список зарегистри- рованных пользователей и другую информацию, необходимую для решения за- дачи. Приложение клиента должно обеспечивать: регистрацию нового пользова- теля и его авторизацию по имени пользователя и паролю на сервере, передачу сообщений на сервер и прием сообщений от сервера, переданных на сервер другими клиентами. |