Скачиваний:
1
Добавлен:
23.04.2026
Размер:
506.75 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии

Кафедра Программной инженерии

Практическая работа 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 определяется случайным характером момента генерации пакетов станциями.