commit e9d813b189322f9c49688ba068635e010a4c45ab Author: Александр Свекровин Date: Wed May 7 21:24:21 2025 +0300 Завершили настройку проекта diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ + diff --git a/git-bash.exe.lnk b/git-bash.exe.lnk new file mode 100644 index 0000000..7012407 Binary files /dev/null and b/git-bash.exe.lnk differ diff --git a/lab3.html b/lab3.html new file mode 100644 index 0000000..bb68453 --- /dev/null +++ b/lab3.html @@ -0,0 +1,164 @@ + + + + + + + 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. +
+

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

+ +
+ + + diff --git a/~$дание 3.docx b/~$дание 3.docx new file mode 100644 index 0000000..9b00fbe Binary files /dev/null and b/~$дание 3.docx differ diff --git a/задание 3.docx b/задание 3.docx new file mode 100644 index 0000000..4c1f32c Binary files /dev/null and b/задание 3.docx differ