Доступ к службе TIME

В клиентах для доступа к службе TIME через порт протокола 37 может использоваться протокол TCP или UDP (формально, в стандартах определены две отдельные службы: одна для UDP, а другая для TCP). В версии службы TIME для протокола TCP сигналом к активизации вывода является появление запроса на установление соединения, во многом аналогично службе DAYTIME, описанной выше. Клиент формирует соединение TCP с сервером TIME и ожидает поступления данных, предназначенных для чтения. При обнаружении нового запроса на установление соединения сервер передает текущее время, закодированное в виде целого числа, а затем закрывает соединение. Клиент не передает никаких данных, поскольку сервер никогда не выполняет чтения из соединения. Недорогие офисные кресла в Москве. Частные объявления - прибор от комаров - бесплатная доставка.

Клиенты могут также получить доступ к службе TIME с помощью протокола UDP. Для этого клиент отправляет запрос, состоящий из одной дейтаграммы. Сервер не обрабатывает входящую дейтаграмму, не считая того, что извлекает из нее адрес отправителя и номер порта протокола для использования в ответе. Сервер представляет текущее время в виде целого числа, помещает его в дейтаграмму и отправляет ее в ответ клиенту.

7.14. Точные показания времени и сетевые задержки

Хотя служба TIME устраняет различия в часовых поясах, она не позволяет решить проблему запаздывания при передаче по сети. Если для прохождения сообщения от сервера к клиенту требуется 3 секунды, то клиент получит значение времени, отстающее на 3 секунды от показаний часов сервера. Поэтому для синхронизации часов используются другие, более сложные протоколы. Однако служба TIME остается популярной по трем причинам. Во-первых, она является чрезвычайно простой по сравнению со службами, основанными на использовании протоколов синхронизации часов. Во-вторых, большинство клиентов обращаются к серверам в локальной сети, где сетевое запаздывание составляет всего лишь несколько миллисекунд. В-третьих, кроме как при использовании программ, в которых отметки времени служат для синхронизации управления обработкой данных в реальном времени, мало кого волнует отклонение показаний часов компьютера на небольшую величину.

В тех случаях, когда требуется более высокая точность, можно усовершенствовать протокол TIME или использовать иной протокол. Простейшим способом повышения точности показаний часов, получаемых с помощью службы TIME, является вычисление аппроксимированного значения сетевой задержки между сервером и клиентом, а затем суммирование этой аппроксимации со значением времени, полученным от сервера. Например, один из способов аппроксимации запаздывания требует от клиента вычисления времени, истекшего в процессе прохождения сигнала от клиента к серверу и обратно. В клиентской программе предполагается наличие равной задержки в обоих направлениях и формируется оценка времени прохождения в обратном направлении путем деления общего времени кругового обращения на два. Затем в клиентской программе аппроксимация задержки складывается со значением времени, полученным от сервера.

7.15. Клиент UDP для службы TIME

Код реализации клиента UDP для службы TIME содержится в файле UDPtime.c. /* Файл UDPtime.c - главная процедура.

Программа, приведенная в этом примере, обращается к службе TIME, передавая дейтаграмму. Затем в ней вызывается функция read для получения ответа и извлечения из него значения времени. Сразу после получения информации о времени программа UDPtime должна преобразовать значение времени в форму, подходящую для локального компьютера. На первом этапе в ней используется функция ntohl для преобразования 32-битового значения (представленного в переменной типа long языка С) из стандартного сетевого порядка байтов в машинно-зависимый порядок байтов хоста. На втором этапе программа UDPtime должна преобразовать значение времени в локальное представление на компьютере. Программа, приведенная в этом примере, разработана для операционной системы Linux. Как и в протоколах Internet, в системе Linux для представления времени используются 32-битовые целые числа, которые рассматриваются как число секунд. Однако в отличие от протоколов Internet, в системе Linux началом эпохи отсчета времени считается 1 января 1970 года. Поэтому для преобразования значения времени, отсчитанного от начала эпохи, которая применяется в протоколе TIME, в значение времени от начала эпохи Linux, клиентская программа должна вычесть число секунд, прошедших между 1 января 1900 года и 1 января 1970 года. В коде этого примера для преобразования используется константа 2208988800. После преобразования значения времени в представление для локального компьютера, программа UDPtime вызывает библиотечную процедуру ctime, преобразующую значение времени в форму, предназначенную для восприятия человеком.

7.16. Служба ECHO

В стандартах TCP/IP определена служба ECHO для протоколов UDP и TCP. На первый взгляд служба ECHO кажется почти бесполезной, поскольку сервер ECHO просто возвращает назад все данные, полученные им от клиента. Но несмотря на ее простоту, служба ECHO является важным инструментальным средством для сетевых администраторов, поскольку позволяет проверять достижимость хостов, отлаживать программное обеспечение протоколов и выявлять проблемы маршрутизации.

В стандарте службы ECHO для протокола TCP определено, что сервер должен принимать входящие запросы на установление соединения, получать данные, поступающие из соединения, и передавать те же данные назад через то же соединение до тех пор, пока клиент не прекратит передачу. Между тем, клиентская программа передает данные, введенные пользователем, а затем снова их принимает.

В этом примере клиента службы ECHO для работы по протоколу UDP используется тот же общий алгоритм, что и в версии для протокола TCP. В этой программе повторно выполняется чтение строки ввода, передача ее на сервер, прием с сервера и вывод. Наиболее существенное различие между версиями для UDP и TCP заключается в том, как в них обрабатываются данные, полученные от сервера. Поскольку протокол UDP предоставляет дейтаграммную службу передачи данных, в клиентской программе каждая строка ввода рассматривается как единое целое и помещается в отдельную дейтаграмму. Аналогичным образом, сервер ECHO также получает и возвращает целые дейтаграммы. Таким образом, клиент TCP принимает входящие данные в виде потока байтов, а клиент UDP либо получает от сервера всю строку, либо вообще ее не получает; каждый вызов функции read возвращает всю строку, но только если не возникла ошибка.

Похожие статьи Меню Опрос Фото Популярное