From 5a759cb1b5af88c4197aec9f7dc63bb3f9ebf2aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=A1=D0=B2=D0=B5=D0=BA=D1=80=D0=BE=D0=B2=D0=B8=D0=BD?= Date: Fri, 9 May 2025 19:28:32 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C=20la?= =?UTF-8?q?b3.html?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab3.html | 164 ------------------------------------------------------ 1 file changed, 164 deletions(-) delete mode 100644 lab3.html diff --git a/lab3.html b/lab3.html deleted file mode 100644 index bb68453..0000000 --- a/lab3.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - lab3 - - - - -

Работа с сетевыми соединениями в Python

-

Цели и задачи

-

Цель данного занятия — ознакомить студентов с основами работы с сетевыми соединениями в Python, а также научить их анализировать сетевой трафик с помощью Wireshark. В рамках занятия студенты изучат:

- -

Подготовительный этап

-

Работу следует выполнять в среде Visual Studio Code, используя установленное расширение для Python. Перед началом необходимо:

-
    -
  1. Создать и активировать виртуальное окружение с помощью venv или conda.
  2. -
  3. Установить библиотеку requests для работы с HTTP-запросами.
  4. -
  5. Инициализировать Git-репозиторий, добавить .gitignore и README.md.
  6. -
  7. Закоммитить изменения. Не выполнять push.
  8. -
-

Создание простых программ для клиент-серверного взаимодействия и анализ сетевого трафика в Wireshark

-

Необходимо реализовать две программы: сервер и клиент. Они должны обмениваться данными по протоколам TCP и UDP. В первом случае клиент отправляет строку, а сервер её модифицирует и возвращает обратно.

-

Пример TCP-сервера:

-
import socket
-
-server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-server.bind(("0.0.0.0", 10000))
-server.listen(1)
-print("TCP сервер запущен")
-
-while True:
-
-    conn, addr = server.accept()
-    print(f"Подключение от {addr}")
-
-    data = conn.recv(1024)
-    if not data:
-        break
-    conn.sendall(data.upper())
-
-    conn.close()
-
-    if data.upper() == b'EXIT':
-        break
-
-
-

Пример TCP-клиента:

-
import socket
-
-client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-client.connect(('127.0.0.1', 10000))
-client.sendall(b'hello server')
-data = client.recv(1024)
-print(f"Ответ от сервера: {data.decode()}")
-client.close()
-
-

Wireshark — это инструмент для анализа сетевого трафика, который позволяет просматривать отправленные и полученные пакеты. Важным аспектом работы с TCP является трёхстороннее рукопожатие (three-way handshake):

- -

Задание:

-
    -
  1. Запустите Wireshark и начните захват трафика. Вам очень поможет фитльр tcp.port==10000 || udp.port==10001.
  2. -
  3. Запустите сервер и клиент, зафиксируйте обмен пакетами.
  4. -
  5. Остановите захват и найдите последовательность SYN, SYN-ACK, ACK.
  6. -
  7. Обратите внимание на Sequence Number, Sequence Number (raw), Acknowledgment Number, Acknowledgment Number (raw), Flags. Эти параметры определяют порядок передачи данных и подтверждения приёма.
  8. -
  9. Зафиксируйте последовательность завершения соединения (FIN), которая включает обмен FIN- и ACK-пакетами.
  10. -
  11. Измените TCP-клиент так, чтобы TCP-сервер завершил работу.
  12. -
-

Пример UDP-сервера:

-
import socket
-
-server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-server.bind(('0.0.0.0', 10001))
-print("UDP сервер запущен")
-
-while True:
-    data, addr = server.recvfrom(1024)
-    print(f"Сообщение от {addr}: {data.decode()}")
-    server.sendto(data.upper(), addr)
-
-

Пример UDP-клиента:

-
import socket
-
-client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-client.sendto(b'hello server', ('127.0.0.1', 10001))
-data, _ = client.recvfrom(1024)
-print(f"Ответ от сервера: {data.decode()}")
-client.close()
-
-

Задание:

-
    -
  1. Запустите Wireshark и начните захват трафика.
  2. -
  3. Запустите сервер и клиент, зафиксируйте обмен пакетами.
  4. -
  5. Проанализируйте разницу в передаче данных между TCP и UDP, сравнив структуру пакетов в Wireshark.
  6. -
  7. Модифицируйте серверную программу, чтобы изменять входящие данные перед отправкой клиенту. Измените порты для сервера и клиента.
  8. -
-

Подключение к веб-серверу и работа с HTTP-запросами

-

Создайте TCP-клиент, который устанавливает соединение с vyatsu.ru по порту 80 и отправляет HTTP-запрос:

-
import socket
-
-client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-client.connect(('vyatsu.ru', 80))
-request = "GET / HTTP/1.1\r\nHost: vyatsu.ru\r\n\r\n"
-client.sendall(request.encode())
-response = client.recv(4096)
-print(response.decode())
-client.close()
-
-

Задание:

-
    -
  1. Запустите Wireshark, выполните запрос и проанализируйте трафик (фильтр tcp.port==80 оставит интересующие нас пакеты видимыми). Определите используемые протоколы. Поясните ответ от сервера.
  2. -
  3. Повторите запрос с использованием requests:
  4. -
-
import requests
-
-response = requests.get("http://vyatsu.ru")
-print(response.text[:500])
-
-
    -
  1. Сравните полученные данные с анализом Wireshark и измените код первого примера так, чтобы он выглядел как захваченный трафик при использовании requests.
  2. -
-

Работа с API Gitea

-

Задание:

-
    -
  1. Сгенерируйте API-токен в Gitea (https://git.vyatsu.ru/user/settings/applications) с правами только на чтение.
  2. -
  3. Важно! Токен не должен попадать в коммиты. Добавьте его в .gitignore и используйте переменные окружения.
  4. -
  5. Выполните запрос к API Gitea:
  6. -
-
import requests
-
-TOKEN = "ВАШ_ТОКЕН"
-headers = {"Authorization": f"token {TOKEN}"}
-response = requests.get("https://git.vyatsu.ru/api/v1/user", headers=headers)
-print(response.json())
-
-
    -
  1. Выпустите новый токен с правами на запись и, например, создайте репозиторий, issue или комментарий. У каждого студента должно быть свой вариант.
  2. -
  3. Закоммитьте весь написанный код и выполните git push из среды Visual Studio Code.
  4. -
-

Критерии успешного выполнения

- -
- - -