<<
>>

Элементарные протоколы передачи данных

Знакомство с протоколами мы начнем с рассмотрения трех протоколов возрастающей сложности. Симулятор этих и следующих протоколов заинтересованные читатели могут найти на веб-сайте (см.
предисловие). Прежде чем приступить к изучению протоколов, полезно высказать некоторые допущения, лежащие в основе данной модели связи. Для начала мы предполагаем, что на физическом уровне, уровне передачи данных и сетевом уровне находятся независимые процессы, общающиеся с помощью передачи друг другу сообщений. Во многих случаях процессы физического уровня и уровня передачи данных будут работать на процессоре внутри специальной сетевой микросхемы ввода-вывода, а процесс сетевого уровня — на центральном процессоре. Однако другие варианты реализации также возможны (например, три процесса внутри одной микросхемы ввода-вывода; физический уровень и уровень передачи данных, вызываемые как процедуры процессом сетевого уровня, и т. д.). В любом случае, представление трех уровней в виде отдельных процессов будет служить поддержанию концептуальной чистоты обсуждения, а также подчеркнет независимость уровней.

Другим ключевым допущением будет то, что машина А хочет послать на машину В длинный поток данных, используя надежный ориентированный на соединение сервис. Позднее мы рассмотрим случай, при котором одновременно машина В также хочет послать данные на машину А. Предполагается, что у машины А имеется бесконечный источник данных, готовых к отправке, и что ей никогда не требуется ждать готовности данных. Когда уровень передачи данных машины А запрашивает данные, сетевой уровень всегда готов их ему предоставить. (Это ограничение также будет потом отброшено.)

Также предполагается, что компьютеры не выходят из строя. При передаче могут возникать ошибки, но не проблемы, связанные с поломкой оборудования или случайным сбросом.

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

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

Вначале получатель ничего не должен делать. Он просто сидит без дела, ожидая, что что-то произойдет. В приводимых в данной главе примерах протоколов ожидание событий уровнем передачи данных обозначается вызовом процедуры —wait_for_event(&event). Эта процедура возвращает управление, только когда что- то происходит (например, прибывает кадр). При этом переменная event сообщает, что именно случилось. Наборы возможных событий отличаются в разных протоколах и поэтому будут описываться для каждого протокола отдельно. Следует заметить, что в действительности уровень передачи данных не находится в холостом цикле ожидания событий, как мы предположили, а получает прерывание, когда это событие происходит. При этом он приостанавливает свои текущие процессы и обрабатывает пришедший кадр. Тем не менее, для простоты мы проигнорируем эти детали и предположим, что уровень передачи данных все свое время посвящает работе с одним каналом.

Когда приемная машина получает кадр, аппаратура вычисляет его контрольную сумму. Если она неверна (то есть при передаче возникли ошибки), то уровень передачи данных получает соответствующую информацию {event = cksum_err). Если кадр прибывает в целости, уровню передачи данных об этом также сообщается (eae«£=frame_arrival), после чего он может получить этот кадр у физического уровня с помощью процедуры from_physical_layer. Получив неповрежденный

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

Для запрета передачи сетевому уровню любой части заголовка кадра есть веская причина: поддержание полного разделения сетевого уровня и уровня передачи данных. До тех пор, пока сетевой уровень ничего не знает о формате кадра и протоколе уровня передачи данных, изменения формата и протокола не потребуют изменений программного обеспечения сетевого уровня. Поддержание строгого интерфейса между сетевым уровнем и уровнем передачи данных значительно упрощает разработку программ, так как протоколы различных уровней могут развиваться независимо.

В листинге 3.1 показаны некоторые объявления (на языке С), общие для многих протоколов, обсуждаемых далее. Определены пять структур данных: boolean, seq_nr, packet, frame_kind и frame. Тип boolean представляет собой перечисляемый тип, переменные которого могут принимать значения true или false. Тип seq_nr является целым без знака, используемым для нумерации кадров. Эти последовательные номера могут принимать значения от 0 до числа MAX_SEQ включительно, которое определяется в каждом протоколе, использующем его. Тип packet является единицей информации, используемой при обмене информацией между сетевым уровнем и уровнем передачи данных одной машины или двумя равноранговыми сетевыми уровнями. В нашей модели пакет всегда состоит из МАХ_ РКТ байт, хотя на практике он обычно имеет переменную длину.

Структура frame состоит из четырех полей: kind, seq, ack и info, — первые три из которых содержат управляющую информацию, а последнее может содержать данные, которые необходимо передать. Эти три управляющих поля вместе называются заголовком кадра.

Поле kind сообщает о наличии данных в кадре, так как некоторые протоколы отличают кадры, содержащие только управляющую информацию, от кадров, содержащих также и данные. Поля seq и ack используются соответственно для хранения последовательного номера кадра и подтверждения. Подробнее их использование будет описано далее. Поле данных кадра, i nfo, содержит один пакет. В управляющем кадре поле info не используется. В реальной жизни используется поле info переменной длины, полностью отсутствующее в управляющих кадрах.

Важно понимать взаимоотношения между пакетом и кадром. Сетевой уровень создает пакет, принимая сообщение от транспортного уровня и добавляя к нему заголовок сетевого уровня. Этот пакет передается уровню передачи данных, который включает его в поле info исходящего кадра. Когда кадр прибывает на пункт назначения, уровень передачи данных извлекает пакет из кадра и передает его сетевому уровню. Таким образом, сетевой уровень может действовать так, как будто машины обмениваются пакетами напрямую.

В листинге 3.1 также перечислен ряд процедур. Это библиотечные процедуры, детали которых зависят от конкретной реализации, и их внутреннее устройство мы рассматривать не будем. Как уже упоминалось ранее, процедура wait_ for_event представляет собой холостой цикл ожидания какого-нибудь события. Процедуры to_network_layer и fromjietworkJ ayer используются уровнем передачи данных для передачи пакетов сетевому уровню и для получения пакетов от сетевого уровня соответственно. Обратите внимание: процедуры from_physical Jayer и to_physi cal_1 ayer используются для обмена кадрами между уровнем передачи данных и физическим уровнем, тогда как процедуры tojietwork Jayer и from_ networkj ayer применяются для передачи пакетов между уровнем передачи данных и сетевым уровнем.

Другими словами, процедуры to_network_l ayer и from_ networkj ayer относятся к интерфейсу между уровнями 2 и 3, тогда как процедуры from_physical Jayer и to_physical_layer относятся к интерфейсу между уровнями 1 и 2.

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

В наших примерах протоколов это реализовано в виде значения event=timeout, возвращаемого процедурой wait_for_event. Для запуска и остановки таймера используются процедуры startjimer и stop_timer соответственно. Событие timeout может произойти, только если запущен таймер. Процедуру start JH mer разрешается запускать во время работающего таймера. Такой вызов просто переинициа- лизирует часы, чтобы можно было начать отсчет заново (до нового тайм-аута, если таковой будет иметь место).

Процедуры start_ack_timer и stop_ack_timer используются для управления вспомогательными таймерами при формировании подтверждений в особых обстоятельствах.

Процедуры enablejnetworkJayer и disable_network_layer используются в более сложных протоколах, где уже не предполагается, что у сетевого уровня всегда есть пакеты для отправки. Когда уровень передачи данных разрешает работу сетевого уровня, последний получает также разрешение прерывать работу первого, когда ему нужно послать пакет. Такое событие мы будем обозначать как event=networkJayer_ready. Когда сетевой уровень отключен, он не может инициировать такие события. Тщательно следя за включением и выключением сетевого уровня, уровень передачи данных не допускает ситуации, в которой сетевой уровень заваливает его пакетами, для которых не осталось места в буфере.

Последовательные номера кадров всегда находятся в пределах от 0 до МАХ_ SEQ (включительно).

Число MAX_SEQ различно в разных протоколах. Для увеличения последовательного номера кадров на 1 циклически (то есть с обнулением при достижении числа MAXJSEQ) используется макрос inc. Он определен в виде макроса, поскольку используется прямо в строке в тех местах программы, где быстродействие является критичным. Как мы увидим позднее в этой книге, производительность сети часто ограничена быстродействием протоколов. Определение простых операций в виде макросов не снижает удобочитаемости программы, увеличивая при этом ее быстродействие. К тому же, поскольку МАХ_ SEQ в разных протоколах будет иметь разные значения, то, определив инкремент в виде макроса, можно один и тот же код без проблем использовать в нескольких протоколах. Такая возможность крайне полезна для симулятора.

Листинг 3.1. Общие объявления для последующих протоколов. Объявления располагаются в файле protocol.h

#define МАХ_РКТ 1024 /* определяет размер пакета в байтах */

typedef enum {false, true} boolean; /* тип boolean */

typedef unsigned int seq_nr: /* порядковые номера кадров или подтверждений

*/

typedef struct {unsigned char data[MAX_PKT];} packet: /* определение пакета */ typedef enum {data. ack. nak} frame_kind: /* определение типа пакета */

/* данный уровень занимается транспортировкой кадров

/* тип кадра */

/* порядковый номер */

/* номер подтверждения */

/* пакет сетевого уровня */

/* ожидать события и вернуть тип события в переменной event */ void wait_for_event(event_type *event): /* получить пакет у сетевого уровня для передачи по каналу */ void from_network_layer(packet *р);

/* передать информацию из полученного пакета сетевому уровню */ void to_network_layer(packet *р);

/* получить пришедший пакет у физического уровня и скопировать его в г */ void from_physical_layer(frame *r);

/* передать кадр физическому уровню для передачи */ void to_physical_layer(frame *s);

/* запустить таймер и разрешить событие timeout */ void start_timer(seqjir k):

/* остановить таймер и запретить событие timeout */ void stop_timer(seq_nr k);

/* запустить вспомогательный таймер и разрешить событие ack_timeout */ void start_ack timer(void): /* остановить вспомогательный таймер и запретить событие ack_timeout */ void stop_ack_timer(void);

/* разрешить сетевому уровню инициировать событие network_layer_ready */ void enable_network_layer(void);

/* запретить сетевому уровню инициировать событие network_layer_ready */ void disablejietworkjayer(void);

/* макрос inc развертывается прямо в строке: Циклически увеличить переменную к */ fdefine inc(k) if (к < MAX SEQ) к = к + 1; else к = 0

Объявления в листинге 3.1 являются частью всех последующих протоколов. Для экономии места и удобства ссылок они были извлечены и собраны вместе, но, по идее, они должны быть объединены с протоколами. В языке С такое объединение производится с помощью директивы препроцессора #include с указанием ссылки на файл protocol.fi, в котором помещаются данные определения.

<< | >>
Источник: Э. ТАНЕНБАУМ. КОМПЬЮТЕРНЫЕ СЕТИ 4-Е ИЗДАНИЕ. 2003

Еще по теме Элементарные протоколы передачи данных:

  1. 18.1. Особенности информационных правоотношений, возникающих при производстве, передаче и потреблении персональных данных
  2. § 29 Передача и переход прав по обязательствам. – Римская конструкция права передачи. – Облегчение передачи новейшим законодательством. – Передаточная надпись. – Ограничения передачи. – Действие передачи. – Ответственность передатчика и права приобретателя. – Вступление в право кредитора или суброгация. – Русский закон передачи. – Передача заемных писем. – Переход требований к кредиторам.
  3. 1. Развитие общей и мелкой моторики. Формирование элементарных графомоторных навыков
  4. Глава 4. Киотский протокол в Украине
  5. § 6. Протокол судебного заседания
  6. Судебные протоколы вообще
  7. Пример обработки протокола.
  8. Базовый протокол устранения проблемы с BSFF
  9. В. Г. Олифер, Н. А. Олифер. 54 Компьютерные сети. Принципы, технологии, протоколы: Учебник для вузов. 3-е изд, 2006
  10. Интервью с официальными лицами или представителями их пресс-служб чреваты двумя проблемами: опасностью невольного искажения информации при передаче, интерпретации фактов, а также передачей намеренно дозированных сведений.
  11. Григорьев Ю.А., Ревунков Г.И.. Банки данных, 2002
  12. 18.4. Права субъекта персональных данных
  13. Анализ и интерпретация полученных данных
  14. Анализ и интерпретация полученных данных
  15. Оценка данных о личности.
  16. Банк данных
  17. Подготовка исходных данных
  18. 4.5. Право изготовителя базы данных
  19. 4.1. Общие принципы анализа данных