Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Разработка протокола на основе локально-приоритетного доступа и описание используемого формата кадра



Допустим, что станция А хочет передать данные станции В, тогда:

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

1.1. Формирует признак начала кадра-преамбулу (10101010).

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

1.3. В поле типа пакета заносится 0 – в случае передачи данных и 1 – в случае передачи ответного пакета(пакета с пустым полем данных).

1.4. В поле длины данных заносится длина передаваемой информации

1.5. В поле данных заносится информация для передачи и подсчитывается контрольная сумма.

1.6. В поле FCS заносится контрольная сумма по модулю 256.

2. Устанавливается соединение со средой передачи.

3. При получении пакета каждая станция сравнивает адрес получателя со своим адресом. Если они не совпадают, то кадр транспортируется обратно в кольцо, при совпадении адресов управление передается на прием кадра из сети. Станция В выполняет следующие действия:

3.1. Изымает кадр из сети.

3.2. Проверяет поле типа пакета. Если ТП=0, то считываются данные, длина которых указана в поле ДЛ, и подсчитывается контрольная сумма.

3.3. Контрольная сумма сравнивается с полем FCS. Если они совпали, то формируется кадр-ответ.

4. Формирование кадра-ответа станцией В (кадр-ответ состоит из 4-х байт и отправляется только тогда, когда произошла ошибка):

4.1. Формирует признак начала кадра (10101010).

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

4.3. В поле типа пакета заносится 1(кадр-ответ).

5. Для станции А устанавливается timeout. Т.е. если кадр-ответ не приходит в течение 0,05 с, то станция А принимает решение, что кадр был либо не получен станцией В, либо содержал ошибки и повторно отправляет его станции В. Если кадр-ответ получен, то кадр изымается из буфера передачи. Ожидая кадр-ответ, станция A может передавать в кольцо чужие кадры приходящие ей из кольца.

 

Длина кадра меняется в пределах от 42 до 498 бит.

 

Рассмотрим формат кадра, который выглядит следующим образом:

 

8 бит 8 бит 8 бит 1 бит 9 бит 0 – 57 байт 8 бит
ПР АП АО ТП ДЛ ДАННЫЕ FCS

 

1. ПР – преамбула. Появление этой комбинации бит (10101010) является указанием на то, что следующий байт - это первый байт заголовка кадра.

2. АП – адрес получателя. Так как в сети 80 станций то 1 байта будет достаточно для представления адреса получателя. Максимальное количество станций в сети – 256.

3. АО – адрес отправителя.

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

5. ДЛ – длина данных. В этом поле записана длина передаваемых данных в байтах. Длина этого поля – 9 бит, следовательно, максимальная длина поля данных – 64 байта, однако максимальное возможное значение, которое позволено записать в это поле составляет 57 (111001)

6. ДАННЫЕ – поле данных. Сюда записываются данные, которые хочет передать станция. Длина этого поля меняется в пределах от 0 байта, до 57 байт, в зависимости от поля ДЛ.

7. FCS – поле проверочных символов. После получения кадра рабочая станция выполняет собственное вычисление контрольной суммы по модулю 256 для этого кадра, сравнивает полученное значение со значением поля и определяет целостность полученного кадра.

 

 

Листинг программы, моделирующей работы сети

Среда реализации: Visual Studio 2010

Язык реализации: C#

 

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

 

namespace NetworkProgramm

{

class Packet

{

public byte preambule;

public byte receiverAdress;

public byte senderAdress;

public bool packetType;

public byte dataLength;

public bool[] data;

public byte testError;

public Packet(byte sender,byte receiver,bool[] data)

{

preambule = 170;

packetType=false;

senderAdress = sender;

receiverAdress = receiver;

dataLength=(byte)data.Length;

this.data=data;

testError = GetFCS();

}

public Packet(byte sender,byte receiver)

{

preambule=170;

packetType=true;

senderAdress=sender;

receiverAdress=receiver;

dataLength=0;

data=new bool[0];

testError = GetFCS();

}

public override string ToString()

{

string str;

str = preambule.ToString() + "|";

if (packetType)

str += "1|";

else str += "0|";

str += senderAdress.ToString() + "|" + receiverAdress.ToString() + "|"

+ dataLength.ToString() + "|";

for (int i = 0; i < dataLength; i++)

{

if (data[i])

str += "1";

else str += "0";

}

str+="|"+testError.ToString();

return str;

}

private byte GetFCS()

{

ulong FCS;

FCS = (ulong)(preambule + senderAdress + receiverAdress + dataLength);

byte tmp=0;

if (packetType)

tmp += 1;

for (int i = 0; i < data.Length; i++)

if (data[i])

tmp += 1;

FCS += tmp;

return (byte)(FCS%256);

}

}

class Station

{

private byte stationId;

public byte id

{

get{return stationId;}

}

public List<Packet> transitBuffer;

public List<Packet> transmissionBuffer;

public Station(byte id)

{

this.stationId = id;

transitBuffer = new List<Packet>();

transitBuffer.Capacity = 8;

transmissionBuffer = new List<Packet>();

transmissionBuffer.Capacity = 8;

}

private bool[] GenerateDataForPacket(byte senderId, byte receiverId)

{

Random r = new Random();

bool[] data=new bool[r.Next(1,56)];

for (int i=0;i<data.Length;i++)

{

if (r.Next() % 2 == 0)

data[i] = true;

else

data[i] = false;

}

return data;

}

public Packet GeneratePacket(byte senderId, byte receiverId)

{

return new Packet(senderId, receiverId, GenerateDataForPacket(senderId, receiverId));

}

public bool IsAnyNewPacketToSend()

{

Random r = new Random(DateTime.Now.Millisecond);

if (r.Next(0,100)==88)

return true;

return false;

}

public byte ReceivePacket(Packet p)

{

this.transitBuffer.Add(p);

if (transitBuffer.Count < 6 || (p.packetType))

{

if (!IsAnyNewPacketToSend())

return CheckAdress(p);

else

return 2;

}

else

return CheckAdress(p);

}

public byte ReceivePacket()

{

Packet p = transitBuffer[transitBuffer.Count - 1];

transitBuffer.Remove(transitBuffer[transitBuffer.Count - 1]);

return CheckAdress(p);

}

private byte CheckAdress(Packet p)

{

if (p.receiverAdress == this.id)

{

this.transitBuffer.Remove(p);

return 1;

}

else

this.transitBuffer.Remove(p);

return 0;

}

}

class Network

{

StreamWriter sw;

System.DateTime dt;

private byte numOfStations;

public Station[] st;

public Network(byte num)

{

dt = DateTime.Now;

numOfStations = num;

st = new Station[80];

for (byte i = 0; i < numOfStations; i++)

{

st[i] = new Station(i);

}

sw = new StreamWriter("c:\\log.txt");

sw.WriteLine("Сеть с "+numOfStations+" станциями\n");

}

public void Simulate(int n)

{

Random r = new Random();

byte id1;

byte id2;

for (int i = 0; i < n; i++)

{

id1 = (byte)r.Next(0, numOfStations);

id2 = (byte)r.Next(0, numOfStations);

SendPacket(st[id1], st[id2], st[id1].GeneratePacket(st[id1].id, st[id2].id));

}

sw.Close();

}

private void SendPacket(Station sender,Station receiver,Packet p)

{

sw.WriteLine(GetTime()+"Станция#"+sender.id+" начинает передачу пакета !"+ p.ToString()+"! станции#"+receiver.id);

SendPacket(st[(sender.id+1)%numOfStations], p);

}

private void SendPacket(Station receiver,Packet p)

{

switch (receiver.ReceivePacket(p))

{

case 0:

sw.WriteLine(GetTime()+"Пакет !" + p.ToString() + "! проходит транзитом через станцию#" + receiver.id);

SendPacket(st[(receiver.id + 1) % numOfStations], p);

break;

case 1:

if (p.packetType)

{

sw.WriteLine(GetTime()+"Станция#" + receiver.id + " приняла ответный пакет!");

}

else

{

sw.Write(GetTime() +"Станция#" + receiver.id+"приняла пакет! ");

sw.WriteLine("Начинаю передачу ответного пакета!");

SendPacket(st[p.receiverAdress], st[p.senderAdress], new Packet(p.receiverAdress, p.senderAdress));

}

break;

case 2:

Random r = new Random();

byte id = (byte)r.Next(0, numOfStations);

SendPacket(st[receiver.id], st[id], st[receiver.id].GeneratePacket(receiver.id, id));

if (st[receiver.id].ReceivePacket() == 0)

{

sw.WriteLine(GetTime()+"Пакет!"+p.ToString()+"!проходит транзитом через станцию#" + receiver.id);

SendPacket(st[(receiver.id + 1) % numOfStations], p);

}

else

{

if (p.packetType)

{

sw.WriteLine(GetTime() + "Станция#" + receiver.id + " приняла ответный пакет!");

}

else

{

sw.Write(GetTime()+"Станция#"+receiver.id+"приняла пакет! ");

sw.WriteLine("Начинаю передачу ответного пакета!");

SendPacket(st[p.receiverAdress], st[p.senderAdress], new Packet(p.receiverAdress, p.senderAdress));

}

}

 

break;

}

}

private string GetTime()

{

dt=DateTime.Now;

return dt.ToString() + ":" + dt.Millisecond.ToString()+"\t";

}

}

class Program

{

static void Main(string[] args)

{

Network net = new Network(80);

net.Simulate(1);

}

}

}

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.