Смекни!
smekni.com

Протокол HDLC (стр. 4 из 5)

Приемник постоянно контролирует поток битов. При получении нуля с пятью далее идущими подряд единицами (011111) анализирует следующий (седьмой) бит. Если это нуль, он удаляет этот бит. Однако если седьмой бит является единицей (0111111), приемник анализирует восьмой бит. Если это нуль (01111110), он считает, что получена флаговая комбинация. Если это единица, выполняется анализ последующих бит. Возможна ситуация приема либо сигнала покоя, либо сигнала аварийного завершения, на которые станция реагирует соответствующим образом. Таким образом, в протоколе HDLC обеспечиваются кодовая прозрачность по данным. Протоколу безразлично, какие кодовые комбинации находятся в потоке данных. Единственное, что требуется, - это поддерживать уникальность флагов.

HDLC используется также два других сигнала: сигнал аварийного завершения (АЗ) состоит из последовательности единиц, число которых не меньше семи и не больше четырнадцати; состояние покоя представляется последовательностью пятнадцати или большего числа единиц.

Управление потоком

Управление потоком в HDLC осуществляется с помощью передающих и принимающих окон. Окно устанавливается на каждом конце канала связи, чтобы обеспечить резервирование ресурсов обеих станций. Этими ресурсами могут быть ресурсы вычислителя или пространство буфера. В большинстве случаев окно обеспечивает и буферное пространство, и правила нумерации (сообщений). Окно устанавливается во время инициирования сеанса связи между станциями. Если станция А и станция В должны обменяться данными, А резервирует окно для В, а В резервирует окно для А. Использование окон необходимо для полнодуплексных протоколов, потому что они подразумевают непрерывный поток кадров в принимающий узел без периодических подтверждений с остановкой и ожиданием.

Переменные состояния станции V(S) и V(R). Окна в принимающем и передающем узлах управляются переменными состояния, которые представляют по сути состояние счетчика. Передающий узел поддерживает переменную состояния посылки V(S). Это порядковый номер следующего по очереди I-кадра, который должен быть передан. Принимающий узел поддерживает переменную состояния приема V(R), которая содержит номер, который, как ожидается, является порядковым номером следующего I-кадра. V(S) увеличивается на 1 при передаче каждого кадра и помещается в поле порядкового номера посылки кадра. Получив кадр, принимающий узел производит проверку наличия ошибок передачи и сравнивает порядковый номер со своим V(R). Если кадр может быть принят, узел увеличивает V(R) на 1, помещает его в поле порядкового номера приема кадра подтверждения АСК и посылает этот кадр в узел-отправитель, завершая квитирование передачи.

Если V(R) не равен порядковому номеру посылки в кадре или обнаружена ошибка, значит, что-то произошло, и после тайм-аута в узел-отправитель посылается NAK [с порядковым номером приема, содержащим значение V(R)]. В большинстве протоколов этот NAK называется Неприем (REJ) или Выборочный неприем (SREJ). Значение V(R) уведомляет передающее устройство ООД о том, что ожидается посылка нового кадра. Т. к. передатчик восстанавливает старое значение V(S) и повторяет передачу кадра, порядковый номер которого совпадает со значением V(S).

Во многих системах для V(S) и V(R) у порядковых номеров в кадре используются числа 0-7. если переменные состояния в результате последовательного увеличения достигли 7, то, начиная с 0, эти числа снова используются. Вследствие повторного использования чисел устройствам сттанциям не разрешено посылать кадр с порядковым номером, который не был подтвержден. Например, протокол должен дождаться подтверждения кадра с номером 6, прежде чем он опять использует V(S)=6. Этот процесс показан на рис.1. Здесь кадры с 6 по 4 еще не подтверждены. Если бы был послан еще один кадр с порядковым номером 6, соответствующее подтверждение АСК с номером 6 не позволило бы определить, приход какого кадра с порядковым номером 6 подтверждается.

Использование номеров 0-7 позволяет семи кадрам быть в активном состоянии, прежде, чем "закроется" окно. Несмотря на то что диапазон 0-7 дает восемь порядковых номеров, V(R) содержит значение следующего ожидаемого кадра, что ограничивает число активных кадров до 7.

Системные параметры Т1, N2, N1, K и рекомендации по их установке

Таймер Т1 запускается с момента передачи каждого кадра и используется для инициирования повторной передачи, в случае его переполнения. При выборе периода таймера Т1 необходимо учитывать, запускается ли таймер по началу или по концу кадра. Для правильной работы процедуры необходимо, чтобы период таймера Т1 был больше, чем максимальное время между передачей некоторого кадра (SARM, SABM, DM, DISC, FRMR, I или супервизорной команды) и приемом соответствующего кадра, возвращаемого в качестве отклика на этот кадр (UA, DM или подтверждающий кадр).

Счетчик N2 используется для определения максимального числа повторных передач, выполняемых по переполнении таймера Т1. Переменные Т1 и N2 используются также командами / ответами установления звена, такими, как SABM и UA.

Счетчик N1 - максимальное число битов в I-кадре. Определяет максимальную длину информационных полей.

Размер окна К - максимальное число переданных, но не подтвержденных I-кадров. Это максимальное число последовательно занумерованных I-кадров, которые в любой момент времени станции могут передать без получения подтверждения. Оно не должно быть более 7.

Параметры Т1, N2, N1 и K являются системными, подлежащими согласованию с администрацией на некоторый период времени
Описание интерфейса


В окошке «Передаваемые данные» отображается передаваемый файл в двоичном виде, т.е. в виде нулей и единиц.

В поле «флаг» - последовательность 01111110, обозначающая начало и конец кадра.

В поле CRC – контрольный циклический код.

В поле «адрес» - адрес первичной или вторичной станции.



Во вторичном окне отображаются состояние вторичной станции

В окошке «принятые данные» - принятые данные в двоичном виде

Дальше уже понятно

Заключение

Семейство HDLC протоколов канального уровня продолжает развиваться и расширяться. Однако акцент на обеспечение безошибочной передачи ослабляется по мере использования высокоскоростных каналов связи и использования методов коррекции ошибок. В полной мере возможности HDLC протокола используется при построении глобальных сетей передачи данных.

Литература

1. Блэк Ю. Сети ЭВМ: протоколы, стандарты, интерфейсы. М., Мир, 1990.

2. Протоколы информационно-вычислительных сетей: Справочник/ С.А.Аничкин, С.А.Белов, А.В.Берштейн и др.; Под. ред. И.А Мизина, А.П.Кулешова. - М.: Радио и связь, 1990. - 504с.:ил.


Приложение (Листинг программы)

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ScktComp, ComCtrls, Buttons, ExtCtrls;

type

TForm1 = class(TForm)

GroupBox1: TGroupBox;

Edit1: TEdit;

Label1: TLabel;

Edit2: TEdit;

Label2: TLabel;

Edit3: TEdit;

Label3: TLabel;

Memo1: TMemo;

Label4: TLabel;

Edit5: TEdit;

Label5: TLabel;

Edit6: TEdit;

Label7: TLabel;

GroupBox2: TGroupBox;

RichEdit1: TRichEdit;

OpenDialog1: TOpenDialog;

Button1: TSpeedButton;

Button3: TSpeedButton;

SpeedButton1: TSpeedButton;

LabeledEdit1: TLabeledEdit;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioGroup1: TRadioGroup;

RadioGroup2: TRadioGroup;

Memo2: TMemo;

SpeedButton2: TSpeedButton;

GroupBox3: TGroupBox;

Memo3: TMemo;

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

kl:boolean;

implementation

uses Unit2;

{$R *.dfm}

procedure perev1016(sr:string;var se:string);

var chis:real;

begin

chis:=strtofloat(sr);

se:=inttohex(trunc(chis),24);

end;

procedure perev210(sr:string;var se:string);

var j,chis,i,pol:integer;

begin

chis:=0;

pol:=length(sr);

j:=0;

for i:=pol downto 1 do

begin

if sr[i]='1' then

chis:=chis+trunc(exp(j*ln(2)));

j:=j+1;

end;

se:=inttostr(chis);

end;

procedure perev162(sr:string;var se:string);

var chis:real;i,p:integer;so:string;

begin

p:=length(sr);

se:='';

for i:=1 to p do

begin

case sr[i] of

'0':se:=se+'0000';

'1':se:=se+'0001';

'2':se:=se+'0010';

'3':se:=se+'0011';

'4':se:=se+'0100';

'5':se:=se+'0101';

'6':se:=se+'0110';

'7':se:=se+'0111';

'8':se:=se+'1000';

'9':se:=se+'1001';

'A':se:=se+'1010';

'B':se:=se+'1011';

'C':se:=se+'1100';

'D':se:=se+'1101';

'E':se:=se+'1110';

'F':se:=se+'1111';

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var st:string;

begin

if InputQuery('Введите IP адрес первичной станции','Адрес вторичной станции',st) then

begin

edit2.Text:='1010010101';

end;

end;

procedure Delay(msecs : Longint);

var

FirstTick : Longint;

begin

FirstTick := GetTickCount;

repeat

Application.ProcessMessages;

until GetTickCount - FirstTick >= msecs;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

if opendialog1.Execute then

begin

kl:=true;

LabeledEdit1.Text:=OpenDialog1.FileName;

memo3.Lines.LoadFromFile(OpenDialog1.FileName);

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

var st6,st5,st3,st2,st1,st,st4:string;kol,k,i,j,im:integer;f:file of char;ch:char;

begin

if kl=true then

begin

kl:=false;

assignfile(f,OpenDialog1.filename);

reset(f);

form2.Memo3.Lines.Clear;

while not eof(f) do

begin

im:=0;

form2.Memo2.Lines.Clear;

edit3.Text:='10100000';

memo2.Lines.Add('Команда RR - готов к приему');

memo2.Lines.Add('---------------------------');

Radiogroup1.itemindex:=0;

RichEdit1.Lines.Clear;

RichEdit1.Lines.Add('011111101010010101100000000000000001111110');

RadioGroup2.ItemIndex:=1;

delay(2000);

form2.RadioGroup1.ItemIndex:=0;

form2.RadioGroup2.ItemIndex:=1;

form2.memo1.Lines.Clear;

form2.memo1.Lines.Add('011111101010010101100000000000000001111110');

form2.Show;

delay(2000);

form2.Memo1.Lines.Clear;

form2.Memo1.Lines.Add('011111101010010101110000000000000001111110');