Файл: Должность, уч степень, звание подпись, дата инициалы, фамилия пояснительная записка к курсовому проекту проектирование кольцевой лвс по дисциплине Сети эвм и телекоммуникации.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 97
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Обоснование модели кольца со вставными регистрами
2. Анализ эквивалентной модели станции ЛВС
4. Разработка структуры сетевого контроллера и описание графа его состояний
4.1. Разработка структуры сетевого контроллера
4.2 Описание графа состояний сетевого контроллера
5. Описание используемого формата кадра и метода контроля ошибок
5.2 Разработка алгоритма контроля ошибок и протокола достоверной передачи кадра
6.1 Граф-схема разработанного алгоритма обработки кадра источником
Переход p12 выполняется если кадр был сформирован.
Переход p13 если в кадре адреса получателя и отправителя не совпали с нашим адресом.
5. Описание используемого формата кадра и метода контроля ошибок
-
Описание используемого формата кадра
При разработке кадра к нему предъявляются следующие требования:
-
Кадр должен иметь следующие поля: признак начала кадра(НК), адрес получателя (АП) адрес источника (АИ), тип сообщения (ТС), длина блока данных (ДД), блок данных (ДАННЫЕ), блок контрольной суммы (FCS). -
Кадр должен иметь размер 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