Цель данного занятия — ознакомить студентов с основами работы с сетевыми соединениями в Python, а также научить их анализировать сетевой трафик с помощью Wireshark. В рамках занятия студенты изучат:
socket
и requests
.Работу следует выполнять в среде Visual Studio Code, используя установленное расширение для Python. Перед началом необходимо:
venv
или conda
.requests
для работы с HTTP-запросами..gitignore
и README.md
.Необходимо реализовать две программы: сервер и клиент. Они должны обмениваться данными по протоколам 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):
Задание:
tcp.port==10000 || udp.port==10001
.Пример 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()
Задание:
Создайте 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()
Задание:
tcp.port==80
оставит интересующие нас пакеты видимыми). Определите используемые протоколы. Поясните ответ от сервера.requests
:import requests
response = requests.get("http://vyatsu.ru")
print(response.text[:500])
requests
.Задание:
https://git.vyatsu.ru/user/settings/applications
) с правами только на чтение..gitignore
и используйте переменные окружения.import requests
TOKEN = "ВАШ_ТОКЕН"
headers = {"Authorization": f"token {TOKEN}"}
response = requests.get("https://git.vyatsu.ru/api/v1/user", headers=headers)
print(response.json())
git push
из среды Visual Studio Code.socket
и requests
.