← Назад к вопросам

Какие знаешь сетевые протоколы?

1.0 Junior🔥 221 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сетевые протоколы

Сетевые протоколы — это наборы правил, определяющих формат и порядок обмена данными между компьютерами в сети. Разберу основные протоколы, которые часто используются в разработке.

Уровень приложения (Layer 7)

HTTP/HTTPS

Найболее используемый веб-протокол для передачи гипертекста и веб-приложений:

import requests

# GET запрос
response = requests.get('https://api.github.com/users/octocat')
print(response.status_code)  # 200
print(response.json())

# POST запрос
data = {'username': 'john', 'email': 'john@example.com'}
response = requests.post('https://api.example.com/users', json=data)

Характеристики:

  • Stateless протокол (каждый запрос независим)
  • HTTPS добавляет шифрование TLS/SSL
  • HTTP/2 и HTTP/3 для оптимизации производительности
  • Методы: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS

WebSocket

Протокол для двусторонней коммуникации в реальном времени:

import asyncio
from websockets import serve

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(f"Echo: {message}")

async def main():
    async with serve(echo, "localhost", 8765):
        await asyncio.Future()

asyncio.run(main())

Преимущества: low latency, persistent connection, идеален для чатов и real-time уведомлений.

SMTP, POP3, IMAP

Протоколы для отправки и получения электронной почты:

import smtplib
from email.mime.text import MIMEText

msg = MIMEText('Hello World')
msg['Subject'] = 'Test Email'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'

with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
    server.login('sender@gmail.com', 'password')
    server.sendmail('sender@example.com', 'recipient@example.com', msg.as_string())

Уровень транспорта (Layer 4)

TCP (Transmission Control Protocol)

Надёжный, упорядоченный протокол доставки:

import socket

# TCP сервер
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 5000))
server.listen(1)

while True:
    client, addr = server.accept()
    data = client.recv(1024)
    client.sendall(b'Received: ' + data)
    client.close()

Свойства:

  • Установление соединения (3-way handshake)
  • Гарантирует доставку и порядок пакетов
  • Медленнее UDP, но надёжнее
  • Используется в HTTP, FTP, SSH, SMTP

UDP (User Datagram Protocol)

Быстрый, но ненадёжный протокол без установления соединения:

import socket

# UDP сервер
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('localhost', 5000))

while True:
    data, addr = server.recvfrom(1024)
    server.sendto(b'Received', addr)

Характеристики:

  • Нет гарантии доставки
  • Низкая задержка
  • Используется в DNS, видео-стриминге, онлайн-играх
  • Лучше для real-time приложений

Уровень интернета (Layer 3)

IP (IPv4, IPv6)

Отвечает за маршрутизацию и адресацию пакетов в сети.

IPv4: 32-бит адреса (xxx.xxx.xxx.xxx)

IPv6: 128-бит адреса для расширенной адресации

import ipaddress

# Работа с IP адресами
ip = ipaddress.IPv4Address('192.168.1.1')
print(ip.version)  # 4
print(ip.is_private)  # True

network = ipaddress.IPv4Network('192.168.1.0/24')
for ip in network.hosts():
    print(ip)

Уровень канала данных (Layer 2)

DNS (Domain Name System)

Протокол для преобразования доменных имён в IP адреса:

import socket

# Получить IP адрес домена
ip = socket.gethostbyname('example.com')
print(ip)  # 93.184.216.34

# Обратный поиск
hostname = socket.gethostbyaddr('93.184.216.34')
print(hostname)

Характеристики:

  • Иерархическая система доменов
  • Использует UDP по умолчанию (TCP для больших ответов)
  • Кэширование на разных уровнях

Сравнение протоколов

ПротоколУровеньНадёжностьСкоростьИспользование
TCPТранспортВысокаяСредняяHTTP, FTP, SSH
UDPТранспортНизкаяВысокаяDNS, Video, Gaming
HTTPПриложениеВысокаяСредняяWeb apps
WebSocketПриложениеВысокаяНизкаяReal-time
SMTPПриложениеВысокаяНизкаяEmail

Практические примеры в Python

# Проверка доступности хоста
import socket
import subprocess

host = 'example.com'

# ICMP ping
result = subprocess.run(['ping', '-c', '1', host], capture_output=True)
if result.returncode == 0:
    print(f"{host} доступен")

# TCP port check
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    port = 80
    result = sock.connect_ex(('example.com', port))
    if result == 0:
        print(f"Порт {port} открыт")

Это основные сетевые протоколы, которые встречаются в повседневной разработке. Выбор протокола зависит от требований: надёжность, скорость, наличие соединения и тип передаваемых данных.