Перейти к основному содержимому

Сетевое программирование на Python

Разработчику Архитектору

См. также: Работа с файлами, сетью и внешними API · Асинхронность и многопоточность · Основы asyncio · раздел "Сети"


Зачем учить сокеты, если есть requests и FastAPI​

В повседневной работе Python-разработчик чаще пишет requests.get(...) или поднимает API на FastAPI — см. главу про файлы, сеть и API.

Под капотом и requests, и браузер, и Uvicorn используют сокеты — интерфейс ОС для обмена байтами по сети.

Понимание сокетов помогает:

  • разбираться в "connection refused", timeout, "broken pipe";
  • писать свои протоколы (чат, игра, IoT);
  • читать сетевую документацию без ощущения "магии библиотеки".

Модуль socket — в стандартной библиотеке Python.

Важный практический момент: сокеты редко пишут "вместо" HTTP-фреймворков. Чаще их изучают, чтобы глубже понимать поведение сетевых библиотек и диагностировать ошибки на уровне транспорта. Это напрямую помогает в проектах с API, интеграциями и realtime-сервисами.


Слои — от приложения до провода​

Ваш код (HTTP, JSON, свой протокол)
↓
HTTP / WebSocket / TLS
↓
TCP или UDP
↓
IP (127.0.0.1, 192.168…)
↓
Сетевой интерфейс

HTTP — правила текста поверх TCP. Сокет — уровень ниже: "отправь эти байты на порт".


Словарь​

ТерминПростыми словами
IP-адрес"Номер" машины в сети, например 127.0.0.1 (localhost)
ПортНомер службы на машине: 80/443 — веб, учебник — 50007
TCPНадёжный поток байтов
UDPПакеты без гарантии доставки
КлиентВызывает connect
Серверbind + listen + accept
СокетКанал для send / recv

Модель клиент–сервер​

Сокеты работают с байтами (b"текст"), не со строками. Кодировку (UTF-8) выбирает ваш код.


TCP — эхо-сервер — разбор построчно​

Код ITЗагрузка примера кода…

Фрагмент поднимает базовый TCP echo-сервер:

  • socket.socket(AF_INET, SOCK_STREAM) создаёт IPv4 TCP-сокет;
  • bind((HOST, PORT)) привязывает сервер к адресу и порту;
  • listen(1) переводит сокет в режим ожидания подключений;
  • accept() принимает клиента и возвращает его сокет conn;
  • в цикле recv(...) читаются байты, а sendall(data) отправляет их обратно.
СтрокаСмысл
AF_INETIPv4
SOCK_STREAMTCP
SO_REUSEADDRБыстрее перезапуск после остановки
bind / listenЗанять порт и ждать
accept()Ждать клиента
recv(1024)До 1024 байт за вызов
if not dataКлиент закрыл соединение
sendallОтправить все байты

Клиент:


import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
client.connect(("127.0.0.1", 50007))
client.sendall(b"ping")
print(client.recv(1024))

Этот клиент подключается к локальному серверу и проверяет обмен:

  • connect(("127.0.0.1", 50007)) открывает TCP-сессию;
  • sendall(b"ping") отправляет байтовое сообщение;
  • recv(1024) получает ответ, который echo-сервер вернул без изменений.

Длинные сообщения читают в цикле или по заголовку с длиной.


Как передавать сообщения корректно​

recv(1024) не гарантирует получение "ровно одного логического сообщения". TCP передаёт поток байтов, поэтому границы сообщений задаёт приложение.

Типовые схемы фрейминга:

  • фиксированная длина пакета;
  • префикс длины (4 байта длины + payload);
  • разделитель (\n) для текстового протокола;
  • сериализация структур в JSON/MessagePack/Protobuf.

Пример с префиксом длины:


import struct

def pack_message(data: bytes) -> bytes:
return struct.pack("!I", len(data)) + data

def unpack_header(header: bytes) -> int:
return struct.unpack("!I", header)[0]

Здесь реализован префикс длины для корректного фрейминга:

  • struct.pack("!I", len(data)) кодирует длину payload в 4 байта сетевого порядка;
  • pack_message(...) склеивает заголовок длины и само сообщение;
  • unpack_header(...) извлекает длину на принимающей стороне перед чтением тела.

Именно эта тема часто объясняет "пропадающие" и "слипшиеся" сообщения в первых сетевых проектах.


UDP​


import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b"hello", ("127.0.0.1", 50008))
data, addr = sock.recvfrom(1024)
sock.close()

Фрагмент показывает минимальный обмен по UDP:

  • SOCK_DGRAM выбирает датаграммный режим;
  • sendto(...) отправляет пакет сразу на адрес получателя;
  • recvfrom(...) возвращает и данные, и адрес отправителя;
  • явное close() освобождает системный дескриптор сокета.

sendto / recvfrom — без долгой сессии, как у TCP.


Несколько клиентов​

ПодходКогда
Поток на соединениеМало клиентов, простая логика
asyncioМного I/O
Nginx + UvicornПродакшен HTTP

import threading

def handle(conn):
with conn:
while True:
chunk = conn.recv(4096)
if not chunk:
break
conn.sendall(chunk)

Функция handle(conn) обслуживает одного клиента в отдельном потоке:

  • цикл читает входящие данные кусками по 4096 байт;
  • при пустом чтении соединение считается закрытым и цикл завершается;
  • полученный chunk сразу отправляется обратно, сохраняя логику echo.

asyncio​


import asyncio

async def tcp_echo_client():
reader, writer = await asyncio.open_connection("127.0.0.1", 50007)
writer.write(b"async ping\n")
await writer.drain()
data = await reader.read(100)
print(data.decode())
writer.close()
await writer.wait_closed()

asyncio.run(tcp_echo_client())

Здесь тот же клиент реализован асинхронно:

  • await asyncio.open_connection(...) открывает неблокирующее TCP-подключение;
  • writer.write(...) помещает данные в буфер отправки, await writer.drain() дожидается передачи;
  • await reader.read(100) получает ответ сервера;
  • writer.close() и await writer.wait_closed() завершают соединение корректно.

Связь с HTTP​

HTTP-запрос — текст в TCP-потоке. requests открывает сокет, при HTTPS добавляет TLS.

НастройкаУровень
timeoutОжидание байтов на сокете
Keep-AliveОдин TCP на несколько запросов

В проектах HTTP отдают WSGI/ASGI — веб и API.

ssl в стандартной библиотеке — TLS поверх сокета​


import socket
import ssl

host = "example.com"
context = ssl.create_default_context()

with socket.create_connection((host, 443), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=host) as tls_sock:
tls_sock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")
data = tls_sock.recv(4096)
print(data[:120])

Разбор фрагмента:

  • ssl.create_default_context() включает безопасные настройки TLS и проверку сертификата по умолчанию.
  • socket.create_connection(...) открывает TCP-соединение с таймаутом.
  • wrap_socket(..., server_hostname=...) поднимает TLS поверх существующего сокета и включает SNI.
  • sendall(...) отправляет HTTP-запрос уже в зашифрованном канале.
  • recv(...) читает первые байты ответа, что полезно для диагностики TLS/HTTP на низком уровне.

Ошибки и безопасность​

СитуацияПоведение
Порт занятAddress already in use
Сервер выключенConnection refused
Разрывrecv → b""
Таймаутsettimeout → TimeoutError

На байтах из сети не вызывайте eval / pickle от незнакомых клиентов. Лучше JSON + длина сообщения.


Практический roadmap по изучению​

  1. Запустить эхо-сервер и клиента на localhost.
  2. Добавить таймауты и обработку разрыва соединения.
  3. Ввести явный протокол сообщений (длина + payload).
  4. Поддержать несколько клиентов через threading или asyncio.
  5. Добавить TLS и логирование сетевых ошибок.

Для продолжения хорошо сочетаются материалы Асинхронность и многопоточность, Работа с файлами, сетью и внешними API и HTTP как основа веб-интеграций.


Когда что выбирать​

ЗадачаИнструмент
REST, вебrequests, Flask, FastAPI, Django
Двусторонний каналWebSocket (часто через фреймворк)
Мелкие пакеты, потеря допустимаUDP, socket.SOCK_DGRAM
Учебный разбор транспортаsocket, asyncio
SSH, SFTP, автоматизация серверовparamiko, Fabric
Настройка сетевого оборудованияnetmiko, NAPALM, Nornir
Анализ трафика и пакетовScapy, pyshark
DNS из кодаdnspython, aiodns

Полный обзор по категориям — в справочнике ниже.


Справочник сетевых библиотек Python​

Python покрывает сетевой стек от сырых сокетов до SDN и анализа пакетов. requests помогает быстро отправлять HTTP-запросы, socket — работать с TCP/UDP напрямую, paramiko — автоматизировать SSH-подключения и управление серверами. Ниже — подборка популярных библиотек и инструментов по задачам — HTTP, DNS, почта, очереди сообщений, QUIC/HTTP3, Linux networking и безопасность.

Стандартная библиотека и PyPI

Модули без установки — socket, ssl, asyncio, urllib, http.client, smtplib, ipaddress.

Остальное ставится через pip install ….

Подробнее про установку — как Python ищет модули.

Socket API — низкоуровневая сеть​

БиблиотекаНазначение
socketСтандартный интерфейс к TCP/UDP-сокетам ОС
selectorsМультиплексирование I/O поверх нескольких дескрипторов
asyncioАсинхронный event loop, задачи и неблокирующие соединения
ipaddressРабота с IPv4/IPv6-адресами, подсетями и CIDR
TwistedEvent-driven движок для протоколов и серверов
uvloopБыстрая замена event loop в asyncio (libuv)
trioАльтернатива asyncio с structured concurrency

См. также асинхронность и многопоточность.

HTTP-клиенты​

БиблиотекаНазначение
http.clientНизкоуровневый HTTP-клиент в stdlib
urllibОткрытие URL, запросы без внешних зависимостей
requestsСамый популярный синхронный HTTP-клиент
httpxСовременный клиент с sync и async API
aiohttpАсинхронный HTTP-клиент и сервер на asyncio

Практика requests и httpx — в главе про файлы, сеть и API; веб-серверы — в веб и REST API.

Веб-серверы и фреймворки​

БиблиотекаНазначение
http.serverПростейший HTTP-сервер в stdlib (учебные задачи)
wsgirefЭталонная реализация WSGI
FlaskЛёгкий WSGI-фреймворк
DjangoПолнофункциональный веб-фреймворк с ORM и админкой
FastAPIASGI-фреймворк для API с type hints
TornadoАсинхронный веб и сетевой I/O
SanicAsync веб-сервер и фреймворк

Сравнение синхронных и async-фреймворков — Фреймворки и библиотеки Python.

Почтовые протоколы​

БиблиотекаНазначение
smtplibКлиент SMTP (отправка почты)
imaplibКлиент IMAP4
poplibКлиент POP3
aiosmtplibАсинхронный SMTP-клиент
imap-toolsВысокоуровневые операции с IMAP

Порты SMTP/IMAP/POP3 — справочник по сетевым протоколам.

DNS​

БиблиотекаНазначение
dnspythonЗапросы A/AAAA/MX/TXT, зоны, DNSSEC
aiodnsАсинхронный резолвер для asyncio
pycaresОбёртка над c-ares для async DNS

Теория DNS — система доменных имён.

Передача файлов​

БиблиотекаНазначение
paramikoSSHv2, SFTP, выполнение команд на удалённом хосте
scpSCP поверх paramiko
pysmbКлиент SMB/CIFS
smbprotocolЧистый Python-клиент SMBv2/v3

SSH и SFTP — шифрование и протокол SSH.

Очереди сообщений и pub/sub​

БиблиотекаНазначение
paho-mqttКлиент MQTT (IoT, брокеры)
asyncio-mqttAsync-обёртка над paho-mqtt
aio-pikaAMQP 0.9.1 для RabbitMQ
aiokafkaAsync-клиент Apache Kafka
nats-pyКлиент NATS
pyzmqПривязки ZeroMQ

MQTT и порты — справочник протоколов.

RPC​

БиблиотекаНазначение
xmlrpcXML-RPC клиент и сервер (stdlib)
grpciogRPC поверх HTTP/2
thriftApache Thrift
json-rpcJSON-RPC транспорт
tinyrpcМодульная RPC-библиотека
pycapnpCap'n Proto для Python

gRPC в микросервисах — 8.05 / 1202.

Service discovery​

БиблиотекаНазначение
zeroconfmDNS/Bonjour — объявление и поиск служб в LAN
python-consulКлиент HashiCorp Consul
etcd3Клиент etcd v3

QUIC и HTTP/3​

БиблиотекаНазначение
aioquicQUIC и HTTP/3 на asyncio
qh3Реализация QUIC/HTTP3
hyper-h3HTTP/3 и QUIC-стек

Контекст HTTP/3 — современная HTTP-экосистема.

Анализ и манипуляция пакетами​

БиблиотекаНазначение
ScapyСборка, отправка и разбор произвольных пакетов
dpktБыстрый парсинг/создание пакетов
pysharkPython-обёртка над tshark (Wireshark CLI)
kameneФорк Scapy
pypcapkitНабор для захвата и разбора трафика
impacketКлассы для сетевых протоколов (в т.ч. Windows/SMB)

Для учебного разбора достаточно Scapy или pyshark; в продакшене анализ трафика часто делают на уровне инфраструктуры (mirror port, IDS).

Сетевая автоматизация​

БиблиотекаНазначение
netmikoSSH к коммутаторам и маршрутизаторам разных вендоров
NAPALMЕдиный API поверх netmiko и других драйверов
NornirПараллельное выполнение задач с inventory
ncclientNETCONF-клиент
pysnmpSNMP-опрос и traps
pyntcМульти-вендорное взаимодействие с устройствами
pygnmigNMI (управление через gRPC)
pyangВалидация и генерация кода из YANG

Сценарии DevOps и SSH — автоматизация и DevOps-скрипты.

Linux networking​

БиблиотекаНазначение
pyroute2Netlink — маршруты, интерфейсы, правила
netifacesСписок сетевых интерфейсов и адресов
ifaddrПеречисление IP на адаптерах
psutilСоединения, порты, статистика сети и процессов
tcconfigНастройка traffic control (tc)
python-iptablesПривязки к iptables

Диагностика с терминала — сетевые команды.

Беспроводные сети​

БиблиотекаНазначение
pywifiУправление Wi‑Fi-интерфейсами
bleakBLE-клиент (кроссплатформенный)
pybluezBluetooth (Linux; поддержка ограничена)

Безопасность и TLS​

БиблиотекаНазначение
sslTLS поверх сокета (stdlib)
hmacHMAC для аутентификации сообщений
cryptographyПримитивы и рецепты (сертификаты, шифры)
pyOpenSSLОбёртка над OpenSSL
certifiКорневые CA для проверки HTTPS

Подробнее про SSH и TLS — информационная безопасность.

Прокси​

БиблиотекаНазначение
mitmproxyПерехватывающий HTTP(S)-прокси с UI
PySocksSOCKS-клиент
aiohttp-socksSOCKS-коннектор для aiohttp
proxy.pyЛёгкий HTTP(S)-прокси-сервер

Сериализация для сетевых протоколов​

БиблиотекаНазначение
jsonJSON (REST, конфиги)
pickleСериализация объектов Python (не для недоверенной сети)
structУпаковка бинарных полей (см. фрейминг сообщений)
protobufProtocol Buffers (gRPC, высокопроизводительные API)
msgpackКомпактная бинарная сериализация
cbor2CBOR

SDN и эмуляция сетей​

БиблиотекаНазначение
ryu.ofprotoOpenFlow в контроллере Ryu
pox.openflowOpenFlow в POX
poseidonSDN-мониторинг безопасности
faucetOpenFlow-контроллер для enterprise
mininetЭмулятор SDN-топологий для экспериментов

Связанные материалы​


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.