Имитация Практика №1
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии
Кафедра Программной инженерии
Практическая работа 1
По дисциплине: Разработка имитационных моделей инфокоммуникационных сетей и систем
Выполнил студент:
Яковлев М. А.
ИКПИ-32
Приняла работу:
Дмитриева В. В.
Дата выполнения:
«02» марта 2026 г.
Санкт-Петербург
2026 г.
Постановка задачи
Изучить, как работает протокол np-CSMA (непостоянный доступ с контролем несущей), и с помощью компьютерной модели посмотреть, как меняется его эффективность при разной загрузке сети.
Ход работы
В протоколе np-CSMA станция перед передачей пакета анализирует состояние канала. Если канал свободен, пакет отправляется немедленно. Если канал занят, станция не продолжает опрашивать его непрерывно, а ждёт случайный интервал времени, после чего снова проверяет канал и повторяет алгоритм.
Аналитические графики
После написания программы было проведено имитационное моделирование и получены следующие графики.
Из первого графика (рис. 1) видно, что при малых значениях нагрузки G пропускная способность S растёт, так как коллизий мало. При увеличении G рост замедляется, а дальнейший рост G приводит к спаду S, так как возрастает количество коллизий.
Рисунок 1 - График производительности
На втором графике (рис. 2) видно, как меняется задержка в зависимости от нагрузки G. Задержка минимальна, когда нагрузка маленькая, но при увеличении нагрузки задержка начинает расти.
Рисунок 2 - График задержки в зависимости от нагрузки
Текст программы на Python
import random
import math
import matplotlib.pyplot as plt
standby =0
transmit=1
collision=2
total=1000
brate=0.25e6
plen=500
time=plen/brate
dtime=0.1
delay=time*dtime
mnum=100
g = [0.1, 0.3, 0.5, 0.7, 0.9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
traffic_list=[]
s_model_list=[]
delay_list=[]
s_theory_list=[]
for G in g:
tint = -time/math.log(1-G/mnum)
rint=tint
spnum=0
splen=0
tplen=0
wtime=0.0
mgtime=[0.0]*mnum
for i in range(mnum):
r=random.random()
mgtime[i]=-tint*math.log(1-r)
mtime=mgtime[:]
mstate=[standby]*mnum
mplen=[plen]*mnum
mstime=[0.0]*mnum
now_time=min(mtime)
while spnum<total:
now_time=min(mtime)
indices=[]
for i in range(mnum):
if mtime[i] == now_time and mstate[i] == transmit:
indices.append(i)
for i in indices:
spnum=spnum+1
splen=splen+mplen[i]
wtime=wtime+(now_time-mgtime[i])
mstate[i]=standby
r =random.random()
new_time=now_time+(-tint*math.log(1-r))
mgtime[i]=new_time
mtime[i] =mgtime[i]
#конец коллизии
indices=[]
for i in range(mnum):
if mtime[i] == now_time and mstate[i] == collision:
indices.append(i)
for i in indices:
mstate[i] = standby
r =random.random()
new_time=now_time+(-rint*math.log(1-r))
mtime[i]=new_time
#попытка передачи
indices = []
for i in range(mnum):
if mtime[i] == now_time and mstate[i] == standby:
indices.append(i)
if indices:
for i in indices:
tplen = tplen+mplen[i]
for i in indices:
busy = False
for j in range(mnum):
if j == i:
continue
if mstate[j] == transmit or mstate[j] == collision:
if mstime[j]+delay<=now_time<mstime[j]+delay+time:
busy = True
break
if not busy:
mstate[i] =transmit
mstime[i] =now_time
mtime[i] =now_time + time
else:
r = random.random()
mtime[i] =now_time+(-rint*math.log(1-r))
#обнаружение коллизий
transmitting =[]
for i in range(mnum):
if mstate[i] == transmit or mstate[i] == collision:
transmitting.append(i)
if len(transmitting)>1:
for i in transmitting:
mstate[i] = collision
traffic=tplen/brate/now_time
s_model=splen/brate/now_time
delay_val=wtime/total*brate/plen
a=dtime
exp_a=math.exp(-a*traffic)
s_theory=traffic*exp_a/(traffic*(1+2*a)+exp_a)
traffic_list.append(traffic)
s_model_list.append(s_model)
delay_list.append(delay_val)
s_theory_list.append(s_theory)
print(G, traffic, s_model, delay_val, s_theory)
#Графики
plt.figure(1)
plt.plot(g, s_model_list, label='моделирование')
plt.plot(g, s_theory_list, label='теория')
plt.xlabel('G')
plt.ylabel('S')
plt.legend()
plt.title('Пропускная способность')
plt.figure(2)
plt.plot(g,delay_list)
plt.xlabel('G')
plt.ylabel('Задержка')
plt.title('Средняя задержка')
plt.show()
Вывод
В ходе выполнения лабораторной работы была разработана и исследована дискретно-событийная имитационная модель протокола np-CSMA.
Контрольные вопросы
1. Сформулируйте особенности работы протокола np-CSMA.
Особенностью протокола ненастойчивого np-CSMA является то, что станция, имеющая пакет для передачи, сначала прослушивает среду. Если среда занята (Busy), станция не продолжает попытки передать немедленно, а ждет в течение случайного интервала времени, после чего снова прослушивает среду. Если среда свободна (Idle), станция начинает передачу. Такой подход снижает вероятность коллизий.
2. Приведите и поясните временную диаграмму функционирования протокола np-CSMA.
На диаграмме на оси нормированного времени обозначены две станции для передачи сообщений. Обозначен цикл, который состоит из последовательности состояний Busy (занято) и следующего за ним Idle (свободно). Busy состоит из B = 1+a+Y, где 1 – нормированная длительность одного кадра, a – нормированная задержка распространения сигнала, Y – это время от начала передачи (t) до момента последнего прибытия пакета в интервале t, t + a, которое вызовет коллизию.
3. Как нормированная продолжительность состояния BUSY, IDLE и нормированная продолжительность состояния передачи кадров без коллизий связаны с пропускной способностью протокола np-CSMA?
Пропускная способность S это доля времени, когда канал реально передает полезные данные без коллизий. Она равна полезному времени U, деленному на общее время занятое B и свободное I.
4. Как нормированная нагрузка связана с нормированной продолжительностью состояния передачи кадров без коллизий в протоколе np-CSMA?
Нормированная нагрузка связана с нормированной продолжительностью состояния передачи кадров без коллизий следующей формулой:
5. Как нормированная продолжительность состояния IDLE связана с нормированной нагрузкой в протоколе np-CSMA?
Нормированная продолжительность состояния Idle I, когда кадры не генерируются, может быть представлена:
6. Чем определяется вероятностный характер параметра нормированной продолжительности состояния BUSY в протоколе np-CSMA?
Вероятностный характер состояния Busy определяется случайным характером момента генерации пакетов станциями.
