Э. Таненбаум - Компьютерные сети. (4-е издание) (PDF) (1130118), страница 63
Текст из файла (страница 63)
Снова предполагается, что в канале связи нет ошибок.Однако на этот раз емкость буфера получателя ограничена, и, кроме того, ограниченаскорость обработки данных получателя. Поэтому протокол должен не допускать отправленияданных быстрее, чем получатель способен их обработать. */Симплексный протокол с ожиданиемТеперь мы отбросим самое нереальное предположение, использованное в протоколе 1, — способность получающего сетевого уровня мгновенно обрабатыватьприходящие данные (или, что то же самое, наличие у получающего уровня передачи данных неограниченного буферного пространства, в которое он помещаетвсе приходящие кадры). Сохраняется предположение о том, что в канале связинет ошибок.
Линия связи остается симплексной.Основная проблема, которую нам предстоит решить, — как предотвратить ситуацию, когда отправитель посылает данные быстрее, чем получатель может ихобработать. То есть если получателю требуется время Д t, чтобы выполнить процедуры from_physica1_layer и to_network_layer, то отправитель должен передаватьсо средней скоростью меньшей, чем один кадр за интервал времени Д t. Более того, если мы предполагаем, что в принимающей аппаратуре не производится автоматической буферизации, то отправитель не должен посылать новый кадр до техпор, пока старый кадр не будет считан процедурой from_physical_layer.
В противном случае новый кадр окажется записанным поверх старого.247typedef enum {frame_arrival} event_type;finclude "protocol.h"void sender2(void){frame s:/* буфер для исходящего кадра */• packet buffer;/* буфер для исходящего пакета */event_type event: /* единственное возможное событие - прибытие кадра (событиеframe arrival)*/while (true) {from network layer(&buffer): /* получить у сетевого уровня пакет для передачи•*/s.info = buffer:to_physi cal_layer(&s);wait_for_evint(&event);разрешения *//* скопировать его в кадр s для передачи *//* до свидания, кадрик, до свидания *//* не продолжать, пока на это не будет получено248Элементарные протоколы передачи данныхГлава 3, Уровень передачи данныхЧтобы осознать, чем плох данный вариант протокола, вспомните, что задачауровня передачи данных заключается в предоставлении безошибочной прозрачной связи между двумя процессами сетевого уровня. Сетевой уровень машины Апередает серию пакетов своему уровню передачи данных, который должен гарантировать доставку идентичной серии пакетов сетевому уровню машины В ее уровнем передачи данных.
В частности, сетевой уровень машины В не может распознать недостачу пакета или дублирование пакета, поэтому уровень передачи данныхдолжен гарантировать, что дублирования пакетов не произойдет ни при какихобстоятельствах.Рассмотрим следующий сценарий.1. Сетевой уровень машины А передает пакет 1 своему уровню передачи данных.Пакет доставляется в целости на машину В и передается ее сетевому уровню.Машина В посылает кадр подтверждения назад на машину А.2. Кадр подтверждения полностью теряется в канале связи. Он просто не попадает на машину А.
Все было бы намного проще, если бы терялись только информационные — но не управляющие — кадры, однако канал связи, к сожалению, не делает между ними большой разницы.3. У уровня передачи данных машины А внезапно истекает отведенный интервал времени. Не получив подтверждения, он предполагает, что посланный имкадр с данными был поврежден или потерян, и посылает этот кадр еще раз.4. Дубликат кадра прибывает на уровень передачи данных машины В и передается на сетевой уровень.
Если машина А посылала на машину В файл, то частьэтого файла продублировалась, таким образом, копия файла на машине В будет неверной. Другими словами, протокол допустил ошибку.5. Понятно, что необходим некий механизм, с помощью которого получатель смогбы отличать новый кадр от переданного повторно. Наиболее очевидным способом решения данной проблемы является помещение отправителем порядкового номера кадра в заголовке кадра.
Тогда по номеру кадра получатель сможет понять, новый это кадр или дубликат.Поскольку отводить в кадре много места под заголовок нежелательно, возникает вопрос: каково минимальное количество бит, достаточное для порядковогономера кадра? Единственная неопределенность в данном протоколе может возникнуть между кадром т и следующим за ним кадром т + 1. Если кадр т потерян или поврежден, получатель не подтвердит его и отправитель пошлет его ещераз. Когда он будет успешно принят, получатель пошлет отправителю подтверждение. Именно здесь находится источник потенциальной проблемы. В зависимости от того, будет получено подтверждение или нет, отправитель может послать кадр т или кадр т + 1.Отправитель может начать посылать кадр т + 2 только когда получит подтверждение получения кадра т + 1. Но это означает, что кадр т уже был отправлен и подтверждение его получения было отправлено и получено.
Следовательно,неопределенность может возникнуть только между двумя соседними кадрами.Таким образом, должно быть достаточно всего одного бита информации (созначением 0 или 1). В каждый момент времени получатель будет ожидать при-void receiver2(void)/* буферы для кадров */frame г, s;/* frame arrival является единственным возможнымevent_type event;событием */while (true) {/* единственное возможное событие - прибытие кадраwait_for_event(&event);(событие frame_arriva1)*//* получить прибывший кадр */from_physical_layer(&r);передать данные сетевому уровню */to_network_1ayer(&r.info); /*/* передать пустой кадр, чтобы разбудитьto_physical_layer(&s);отправителя */Как и в протоколе 1, отправитель в начале цикла работы получает пакет отсетевого уровня, формирует из него кадр и отправляет кадр по линии связи.
Однако теперь, в отличие от протокола 1, отправитель должен ждать прибытия кадра с подтверждением, прежде чем он пойдет на следующую итерацию цикла иобратится к сетевому уровню за следующим пакетом. В данной модели уровеньпередачи данных отправителя даже не должен просматривать полученный полинии кадр: его содержимое не имеет значения, поскольку сам кадр означает только одно: подтверждение.Единственное отличие процедуры receiver2 от receiverl заключается в том,что после передачи пакета сетевому уровню receiver2 посылает кадр подтверждения обратно отправителю, после чего идет на следующую итерацию цикла.Поскольку для отправителя важно только прибытие ответного кадра, а не егосодержание, то получателю не нужно заполнять кадр специальной информацией.Симплексный протоколдля зашумленных каналовТеперь рассмотрим реальную ситуацию: канал связи, в котором могут бытьошибки.
Кадры могут либо портиться, либо теряться. Однако мы будем предполагать, что если кадр будет поврежден при передаче, то приемная аппаратура определит это при подсчете контрольной суммы. Если кадр будет поврежден такимобразом, что контрольная сумма совпадет, что очень маловероятно, то этот протокол (и любой другой протокол) передаст неверный пакет сетевому уровню.На первый взгляд может показаться, что нужно лишь добавить таймер к протоколу 2. Получатель будет возвращать подтверждение только в случае получения правильных данных. Неверные пакеты будут просто игнорироваться.
Черезнекоторое время у отправителя истечет интервал времени, и он отправит кадреще раз. Этот процесс будет повторяться до тех пор, пока кадр, наконец, не прибудет в целости.В приведенной выше схеме имеется один критический недостаток. Преждечем читать дальше, попытайтесь понять, что же неверно в данном алгоритме.249шй250Глава 3. Уровень передачи данныхбытия кадра с определенным порядковым номером. Кадр с неверным номеромбудет отбрасываться как дубликат. Кадр с верным номером принимается, передается сетевому уровню, после чего номер следующего ожидаемого кадра увеличивается по модулю 2 (то есть 0 становится 1, а 1 — 0).Пример подобного протокола приведен в листинге 3.4.
Протоколы, в которыхотправитель ожидает положительного подтверждения, прежде чем перейти к пересылке следующего кадра, часто называются PAR (Positive Acknowledgementwith Retransmission — положительное подтверждение с повторной передачей)или ARQ (Automatic Repeat reQuest — автоматический запрос повторной передачи). Подобно протоколу 2, он также передает данные только в одном направлении.Листинг 3.4. Протокол с положительным подтверждением и повторной передачей/* Протокол 3 (PAR) обеспечивает симплексную передачу данных по ненадежному каналу. */fdefine MAX_SEQ I/* в протоколе 3 должно быть равно 1 */typedef enum {frame_arrival, cksum_err, timeout} event_type;#iinclude "protocol .h"void sender3(void)seq_nr next_frame_to_send:/*/frame s;packet buffer;event_type event:/* порядковый номер следующего исходящего кадра/* временная переменная *//* буфер для исходящего пакета */next_frame_to_send = 0;/* инициализация исходящих последовательныхномеров */from_network_layer(&buffer):/* получить первый пакет у сетевого уровня */while (true) {s.info = buffer;/* сформировать кадр для передачи */s.seq = next_frame_to_send: /* вставить порядковый номер в кадр *//* послать кадр по каналу */to_physical_layer(&s):/* запустить таймер ожидания подтверждения */start_timer(s.seq);wait_for_event(&event): /* ждать события frame_arrival, cksum_err или timeout */if (event == frame_arrival) {from_physical_layer(&s): /* получить подтверждение */if (s.ack = next_frame_to_send) {from_network_layer(&buffer); /* получить следующий пакет у сетевогоуровня */inc(next_frame_to_send); /* инвертировать значение переменной next_frame_to_send */}void receiver3(void){seqjir frame_expected:frame r.
s:Элементарные протоколы передачи данных251event_type event;frame expected = 0;while~(true) {wait_for_event(&event); /* ожидание возможных событий: frame_arrival. cksum_err*/if (event == frame_arrival) {/* прибыл неповрежденный кадр *//* получить прибывший кадр */from_physical_layer(&r);if (r.seq = frame_expected) { /* именно этот кадр и ожидался *//* передать данные сетевому уровню */to_network_layer(&r.info);/* в следующий раз ожидать кадр с другимi nc(frame_expected);порядковым номером *//* номер кадра, для которого посылается}s.ack = 1 - frame_expected;/* ни одно из полей не используется */подтверждение */to_physical_layer(&s);}Протокол З отличается от своих предшественников тем, что и отправитель,и получатель запоминают номера кадров.