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

Сетевое программирование на 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
Разрывrecvb""
ТаймаутsettimeoutTimeoutError

На байтах из сети не вызывайте 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 как основа веб-интеграций.