Skip to content

Гончарук Ілля ННІ4-24-201 #25

Description

@sokratjostar

import streamlit as st
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

st.set_page_config(page_title="Моделювання DoS-атаки", layout="wide")

st.title("Моделювання DoS-атаки на вузли мережі")
st.write("Програма моделює перевантаження вузлів мережі та аналізує наслідки DoS-атаки.")

uploaded_file = st.file_uploader("Завантажте CSV-файл із ребрами мережі", type=["csv"])

attack_power = st.slider("Інтенсивність атакуючого трафіку", 10, 1000, 300)
node_capacity = st.slider("Гранична пропускна здатність вузла", 50, 1000, 250)

if uploaded_file is not None:
df = pd.read_csv(uploaded_file)

if df.shape[1] < 2:
    st.error("CSV-файл повинен містити мінімум два стовпці: початковий та кінцевий вузол.")
else:
    df = df.iloc[:, :2]
    df.columns = ["source", "target"]

    G = nx.Graph()
    for _, row in df.iterrows():
        G.add_edge(str(row["source"]), str(row["target"]))

    nodes = list(G.nodes())

    st.subheader("Вхідні дані")
    st.dataframe(df)

    attacked_node = st.selectbox("Оберіть вузол для DoS-атаки", nodes)

    loads = {}
    statuses = {}

    for node in nodes:
        normal_load = G.degree[node] * 30
        if node == attacked_node:
            total_load = normal_load + attack_power
        else:
            total_load = normal_load

        loads[node] = total_load
        statuses[node] = "Перевантажений" if total_load > node_capacity else "Нормальний"

    result_df = pd.DataFrame({
        "Вузол": list(loads.keys()),
        "Навантаження": list(loads.values()),
        "Стан": list(statuses.values())
    })

    st.subheader("Результати моделювання")
    st.dataframe(result_df)

    overloaded = result_df[result_df["Стан"] == "Перевантажений"]

    st.write(f"Кількість вузлів у мережі: {G.number_of_nodes()}")
    st.write(f"Кількість з’єднань у мережі: {G.number_of_edges()}")
    st.write(f"Кількість перевантажених вузлів: {len(overloaded)}")

    availability = round((1 - len(overloaded) / len(nodes)) * 100, 2)
    st.write(f"Орієнтовна доступність мережі: {availability}%")

    st.subheader("Графічне подання мережі")

    pos = nx.spring_layout(G, seed=42)
    colors = ["red" if statuses[node] == "Перевантажений" else "lightgreen" for node in G.nodes()]

    fig, ax = plt.subplots(figsize=(9, 6))
    nx.draw(
        G,
        pos,
        with_labels=True,
        node_color=colors,
        node_size=1200,
        edge_color="gray",
        font_size=10,
        ax=ax
    )
    st.pyplot(fig)

    st.subheader("Аналітичний висновок")

    if len(overloaded) == 0:
        st.success("Мережа працює стабільно, перевантажених вузлів не виявлено.")
    else:
        st.warning(
            "Під час моделювання DoS-атаки виявлено перевантажені вузли. "
            "Це свідчить про зниження доступності мережі та можливу відмову "
            "в обслуговуванні для частини користувачів."
        )

else:
st.info("Завантажте CSV-файл, щоб розпочати моделювання.")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions