Файл: Должность, уч степень, звание подпись, дата инициалы, фамилия пояснительная записка к курсовому проекту проектирование кольцевой лвс по дисциплине Сети эвм и телекоммуникации.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 97

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Переход p12 выполняется если кадр был сформирован.

Переход p13 если в кадре адреса получателя и отправителя не совпали с нашим адресом.

5. Описание используемого формата кадра и метода контроля ошибок



    1. Описание используемого формата кадра

При разработке кадра к нему предъявляются следующие требования:

  1. Кадр должен иметь следующие поля: признак начала кадра(НК), адрес получателя (АП) адрес источника (АИ), тип сообщения (ТС), длина блока данных (ДД), блок данных (ДАННЫЕ), блок контрольной суммы (FCS).

  2. Кадр должен иметь размер b = 800 бит.

8 бит

7 бит

7 бит

2 бита

10 бит

1 - 758 бит



8 бит

НК

АП

АИ

ТС

ДД

ДАННЫЕ

FCS

Рисунок 10 – Формат кадра для отправления данных

НК - начало кадра. Данная комбинация бит (01111110) является указанием на то, что следующие 7 бит— это первые 7 бит заголовка кадра.

АП - адрес получателя. Блок адресации. Так как в сети 100 станций то 7 бит будет достаточно для представления адреса получателя. Размерность блока предусматривает возможность расширения сети, т.к максимальное количество станций в сети - 128.

АИ - адрес источника размерность соответствует адресу получателя.

ТС - поле типа сообщения. Информация, записанная в этом поле, показывает, какой кадр передан в сеть: обычный кадр с данными или кадр-ответ. Если обычный кадр, тогда ТП = 00, если кадр-ответ, то ТП = 01.

FCS - поле проверочных символов (контрольная сумма). Используется для проверки данных на целостность.
ДД - длина данных. В этом поле записана длина передаваемых данных в байтах. Длина этого поля - 10 бит т.к объем всех полей помимо ДД и поля данных равно 32 бита при этом у нас остается свободными 768 бит под ДД и поле данных. Нам нужно выделить поле ДД количество бит = n такое чтобы
поэтому для данного поля мы выделяем 10 бит, следовательно, максимальная длина поля данных - 1024 бит, однако максимальное возможное значение, которое позволено записать в это поле составляет 758.

ДАННЫЕ - поле данных. Сюда записываются данные, которые хочет передать станция. Длина этого поля меняется в пределах от 1 бита до 758 бит в зависимости от поля ДД.

Так же следует представить формат кадра ответа.

Кадр-ответ отправляется тогда, когда обычный кадр успешно дошел до получателя. Он состоит из 32 бит и имеет следующий формат:


8 бит

7 бит

7 бит

2 бита

8 бит

НК

АП

АИ

ТC

FCS

Рисунок 11 – Формат кадра ответа

5.2 Разработка алгоритма контроля ошибок и протокола достоверной передачи кадра


Одним из самых простых способов контроля ошибок в кадре является использование контрольной суммы. В самом простом случае это сумма всех байт сообщения. При этом методе в передатчике подсчитывается сумма всех байтов передаваемого кадра (кроме открывающих/закрывающих байтов, т.к они не имеют информационной ценности) по модулю 256, вычисляется дополнение этой суммы до 256 и результат помещается в «концевик» кадра. На приемной стороне проводится аналогичная процедура суммирования всех принятых байтов (кроме открывающих/закрывающих байтов), включая контрольную сумму. Если получен нулевой результат, то считается, что кадр принят правильно. В противном случае определяется ошибочный прием кадра и требуется повторная его передача.
Допустим, что станция «А» хочет передать данные станции «В», тогда:

Станция «А» формирует кадр:

  • Формирует признак начала кадра (01111110) (Стандартный признак).

  • Формирует заголовок кадра (определяется и присоединяется адрес отправителя и адрес получателя).

  • В поле типа пакета заносится 00 - в случае передачи данных и 01 - в случае передачи ответного пакета (пакета с пустым полем данных).

  • В поле длины данных заносит длина передаваемой информации (если она есть).

  • В поле данных заносится информация для передачи (если она есть)

  • Подсчитывается контрольная сумма, результат заносится в поле FCS.

  • Кадр отправляется в соответствии с расставленными правилами кольца.

  • Ожидание ответа о получении кадра от принимающей станции или ждем истечения таймаута*, говорящего нам что кадр был отброшен в следствии ошибки.

Далее каждая транзитная станция выполняет следующие действия:

  • Принимает кадр из сети.

  • Производит поиск флага (01111110), пли его отсутствии кадр отбрасывается.

  • Подсчитывается контрольная сумма кадра и сравнивается с полем FCS принятого кадра. Если значения не совпадают, то кадр отбрасывается.

  • Происходит проверка адресов отправителя и получателя с адресом станции, на основании равенства или не равенства их кадр отбрасывается передается в кольцо или на станцию.

  • Если адрес получателя совпадает с текущем, то кадр изымается из сети, иначе он попадает в кольцо.

  • После изъятия кадра из сети происходит формирование кадра ответа для станции «А». Формирование ответа не отличается от формирования кадра при передаче данных А – В. С тем лишь отличием что кадр ответа не содержит поля длинны данных и поля данных соответственно.



* Таймаут вычисляется по следующей формуле:



Для начала рассчитаем – время равное средней величине задержки для передачи кадра на наиболее отдалённую станцию, для этого воспользуемся формулой (6).

38* 10^(-3) c=38 мс.

Далее рассчитаем – время равное средней величине задержки для передачи кадра на соседнюю станцию.



примем за 0,5 каждый.

В итоге мы получим :




6. Граф-схема разработанного алгоритма обработки кадра источником, программная модель работы станции в сети

6.1 Граф-схема разработанного алгоритма обработки кадра источником


Лист 1



Рисунок 12 – Схема алгоритма работы источника

6.2 Программная модель работы станции в сети


#include

#include

#include

#include

#include

#include

#define N 100 // Количество станций

int l=0;

typedef struct FRAME {//поля кадра

int start[8]; // Начало кадра

int recv[7]; // Адрес получателя

int send[7]; // Адрес отправителя

int control[2]; // Поле управления

int length[10]; // Длина данных

int data[758]; // Данные

int mod256; // Поле проверочных символов - проверка по mod 256

} FRAME;

int Receive(int n, FRAME receiver, int vv=1) {

int i, buf = 0, counter, counter1;

int station[7]; // Номер станции

counter = 0;

counter1 = 0;

int k = n;

int flag = 0;

// Заполняем номер станции

for (i = 0; i < 7; i++) {

station[6 - i] = k % 2;

k = (n - station[6 - i]) / 2;

n = k;

}

if (receiver.control[1] == 0) {

//Проверяем mod 256

for (i = 0; i < 7; i++)

buf += receiver.send[i] * pow((float)2, 6 - i) + receiver.recv[i] * pow((float)2, 6 - i);

for (i = 0; i < 2; i++)

buf += receiver.control[i] * pow((float)2, 1 - i);

for (i = 0; i < 10; i++)

buf += receiver.length[i] * pow((float)2, 9 - i);

for (i = 0; i < 8; i++)

buf += receiver.data[i] * pow((float)2, 7 - i);

buf = (buf + receiver.mod256) % 256;

}

else

{

for (i = 0; i < 7; i++)

buf += receiver.send[i] * pow((float)2, 6 - i) + receiver.recv[i] * pow((float)2, 6 - i);

for (i = 0; i < 2; i++)

buf += receiver.control[i] * pow((float)2, 1 - i);

buf = (buf + receiver.mod256) % 256;

}
if (receiver.control[0] == 0 && receiver.control[1] == 0) {

i = 0;

if (buf == 0) {

// Проверка - наш ли кадр?

for (i = 0; i < 7; i++)

if (receiver.recv[i] == station[i])

counter1++;

if (counter1 == 7) {

printf("\n\nКадр не был принят, кадр отброшен\n");

}

for (i = 0; i < 7; i++)

if (receiver.send[i] == station[i])

counter++;

if (counter == 7) {

flag = 1;

if (vv == 0) {

printf("\n\nКадр принят\n");

printf("Начало кадра: ");

for (i = 0; i < 8; i++)

printf("%d", receiver.start[i]);
printf("\nАдрес источника: ");

for (i = 0; i < 7; i++)

printf("%d", receiver.recv[i]);
printf("\nАдрес получателя: ");

for (i = 0; i < 7; i++)

printf("%d", receiver.send[i]);
printf("\nТип сообщения: ");

for (i = 0; i < 2; i++)

printf("%d", receiver.control[i]);
printf("\nДлина данных:");

for (i = 0; i < 10; i++)

printf("%d", receiver.length[i]);
printf("\nMod 256: ");

printf("%d\n\n", receiver.mod256);

}

}

}

else {

printf("\nКадр отброшен!\n");

printf("\nВремя ожидания кадра ответв истекло!\n");

system("pause");

return flag=-1;

}

}

else

{

i = 0;

if (buf == 0) {

for (i = 0; i < 7; i++)

if (receiver.send[i] == station[i])

counter++;

if (counter == 7) {

if (l == 0) {

flag = 1;

}

printf("\n\nКадр принят\n");

printf("Начало кадра: ");

for (i = 0; i < 8; i++)

printf("%d", receiver.start[i]);
printf("\nАдрес источника: ");

for (i = 0; i < 7; i++)

printf("%d", receiver.recv[i]);
printf("\nАдрес получателя: ");

for (i = 0; i < 7; i++)

printf("%d", receiver.send[i]);
printf("\nТип сообщения: ");

for (i = 0; i < 2; i++)

printf("%d", receiver.control[i]);
printf("\nMod 256: ");

printf("%d\n\n", receiver.mod256);


}

}

else {

printf("\nКадр отброшен!\n");

printf("\nВремя ожидания кадра ответв истекло!\n");

system("pause");

return flag = -1;

}
}

return flag;

}
int main() {

setlocale(LC_ALL, "Rus");

int buf;

int i, fl,f,v=1,vv=1,rand1=0;

FRAME fr;

srand(time(0));

buf = 0;

fl = 0;

printf("\nДемонстрация работы обработки кадра отправителем\n");

printf("\nВыбирите режим работы, режим работы с ошибками ?(Да 0/ НЕТ 1):");

scanf_s("%d", &v);

printf("\nОтобразить ли путь кадра ?(Да 0/ НЕТ 1):");

scanf_s("%d", &vv);

// Заполняем начало кадра

fr.start[0] = 0;

fr.start[1] = 1;

fr.start[2] = 1;

fr.start[3] = 1;

fr.start[4] = 1;

fr.start[5] = 1;

fr.start[6] = 1;

fr.start[7] = 0;

int num;

// Заполняем адрес отправителя

printf("\nВыбирите адресс получателя (0-100):");

scanf_s("%d", &num);

int snd = num;

for (int z = 6; z>= 0; z--)

{

if (pow(2, z) <= num) {

num = num - pow(2, z);

fr.send[6-z] = 1;

}

else {

fr.send[6-z] = 0;

}

}

// Заполняем адрес получателя

printf("\nВыбирите адресс отправителя (0-100):");

scanf_s("%d", &num);

int rs = num;

for (int z = 6; z >= 0; z--)

{

if (pow(2, z) <= num) {

num = num - pow(2, z);

fr.recv[6 - z] = 1;

}

else {

fr.recv[6 - z] = 0;

}

}

// Заполняем поле управления

fr.control[0] = 0;

fr.control[1] = 0;
// Заполняем длину данных

fr.length[0] = 0;

fr.length[1] = 0;

fr.length[2] = 0;

fr.length[3] = 0;

fr.length[4] = 0;

fr.length[5] = 0;

fr.length[6] = 0;

fr.length[7] = 0;

fr.length[8] = 0;

fr.length[9] = 1;
// Заполняем данные

for (i = 0; i < 757; i++)

fr.data[i] = 0;

fr.data[0] = 1;

fr.data[1] = 1;

fr.data[2] = 0;

fr.data[3] = 1;

fr.data[4] = 0;

fr.data[5] = 1;

fr.data[6] = 0;

fr.data[7] = 0;
// Проверка данных mod 256

for (i = 0; i < 7; i++)

buf += fr.send[i] * pow((float)2, 6 - i) + fr.recv[i] * pow((float)2, 6 - i);

for (i = 0; i < 2; i++)

buf += fr.control[i] * pow((float)2, 1 - i);

for (i = 0; i < 10; i++)

buf += fr.length[i] * pow((float)2, 9 - i);

for (i = 0; i < 8; i++)

buf += fr.data[i] * pow((float)2, 7 - i);

fr.mod256 = 256 - (buf % 256);

int j = 0;

for (i = 0; i < 7; i++)

j += fr.recv[i] * pow((float)2, 6 - i);
printf("\nТекущая станция - %d ", j);

j++;

j = j % N;

printf("\nСтанция сформировала кадр...\n");

printf("Начало кадра: ");

for (i = 0; i < 8; i++)

printf("%d", fr.start[i]);
printf("\nАдрес источника: ");

for (i = 0; i < 7; i++)

printf("%d", fr.recv[i]);
printf("\nАдрес получателя: ");

for (i = 0; i < 7; i++)

printf("%d", fr.send[i]);
printf("\nТип сообщения: ");

for (i = 0; i < 2; i++)

printf("%d", fr.control[i]);

printf("\nMod 256: ");

printf("%d\n\n", fr.mod256);

printf("\nСтанция ждет кадра...\n");

// Отправляем пакет

buf = 0;

for (i = 1; i < 101; i++) {//101 т.к полный круг (выступает в качестве таймера)

if (v == 0) {

rand1 = rand() % 100;

}

if (v == 0 && rand1==99){

fr.data[7] = 1;//ошибка

}

j = i+rs;

j = j % N;

fl = Receive(j, fr,vv);

if (fl == -1)

exit(0);

if (fl == 1 ) {

if (vv == 0)

printf("\n Кадр ответ отбыл %d\n", j);///

num =rs;

for (int z = 6; z >= 0; z--){

if (pow(2, z) <= num) {

num = num - pow(2, z);

fr.send[6 - z] = 1;

}

else {

fr.send[6 - z] = 0;

}

}

// Заполняем адрес получателя

num = snd;

for (int z = 6; z >= 0; z--){

if (pow(2, z) <= num) {

num = num - pow(2, z);

fr.recv[6 - z] = 1;

}

else {

fr.recv[6 - z] = 0;

}

}

fr.control[0] = 0;

fr.control[1] = 1;

for (int z = 0; z < 7; z++)

buf += fr.send[z] * pow((float)2, 6 - z) + fr.recv[z] * pow((float)2, 6 - z);

for (int z = 0; z < 2; z++)

buf += fr.control[z] * pow((float)2, 1 - z);

fr.mod256 = 256 - (buf % 256);

l = 1;

}

else {

if (j != rs && vv==0) {

printf("\n Кадр прошел транзитный узел %d\n", j);

}

else

{

rs = rs;

}

}

}

system("pause");

return 0;

}

7. Демонстрация работы




Рисунок 13 – Получение станцией корректного кадра данных.



Рисунок 14 – Получение станцией корректного кадра данных с отображением пути кадра



Рисунок 15 – Получение станцией кадра данных с ошибкой, с отображением пути кадра



Рисунок 16 – Получение станцией кадра данных, не принятого ни одной станцией

8. Выводы


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

Моделирование работы станции в сети для заданного режима произведено успешно.

На рисунке 11 можно увидеть содержание полей кадра, который передается по сети. Используемый формат кадра описан корректно.

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

Разработанный протокол имеет преимущества и недостатки. К преимуществам можно отнести малый размер пакета, он не перегружен служебными полями, что сделает аппаратную часть приемника более простой, а в следствии и более дешевой, также преимуществам можно отнести то, что он позволяет осуществить достоверную передачу данных. Основным минусом протокола является наличие тайм-аута, а также выбранный метод контроля ошибок является слабо эффективным, поскольку не может определить, где в кадре произошла ошибка.
1   2   3   4   5   6