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

Поверх какого протокола работает http

2.3 Middle🔥 151 комментариев
#Python Core

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

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

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

# Протоколы и слои HTTP

HTTP работает поверх TCP (Transmission Control Protocol), который, в свою очередь, работает поверх IP (Internet Protocol). Это трёхуровневая архитектура.

1. Модель OSI и стек TCP/IP

Слои TCP/IP (в порядке от верхнего к нижнему)

Приложение (Application Layer)
    ↑
    ↓
HTTP, HTTPS, FTP, SMTP, DNS
    ↑
    ↓
Транспортный слой (Transport Layer)
    ↑
    ↓
TCP, UDP, SCTP
    ↑
    ↓
Межсетевой слой (Internet Layer)
    ↑
    ↓
IP (IPv4, IPv6), ICMP
    ↑
    ↓
Канальный слой (Link/Data Link Layer)
    ↑
    ↓
Ethernet, Wi-Fi, PPP

Соответствие с моделью OSI

Слой OSIНазваниеПротоколы
7 (Application)ПриложениеHTTP, HTTPS, FTP, SMTP, SSH
6 (Presentation)ПредставлениеSSL/TLS, Кодирование
5 (Session)СеансTLS, PPTP
4 (Transport)ТранспортTCP, UDP, SCTP
3 (Network)СетьIP, ICMP, IGMP
2 (Data Link)КанальныйEthernet, Wi-Fi (802.11)
1 (Physical)ФизическийКабели, радиоволны

2. HTTP поверх TCP

Как это работает

HTTP (HyperText Transfer Protocol) — это протокол 7-го уровня (Application). TCP (Transmission Control Protocol) — это протокол 4-го уровня (Transport).

# На уровне Python видим только HTTP
import requests

response = requests.get('http://example.com')
print(response.text)

# Но снизу происходит следующее:
# 1. DNS запрос для получения IP адреса example.com
# 2. TCP трёхстороннее рукопожатие (SYN, SYN-ACK, ACK)
# 3. HTTP запрос отправляется по установленному TCP соединению
# 4. TCP доставляет данные с гарантией доставки
# 5. TCP завершает соединение (FIN, FIN-ACK)

Процесс установления соединения

Клиент                                      Сервер
  |                                           |
  |-------- SYN (seq=x) -------->            |
  |                                           |
  |  <------ SYN-ACK (seq=y, ack=x+1) ------|
  |                                           |
  |-------- ACK (seq=x+1, ack=y+1) -------->|
  |                                           |
  |  [Соединение установлено]                |
  |                                           |
  |-------- HTTP GET запрос ------->         |
  |                                           |
  |  <------ HTTP 200 + контент --------    |
  |                                           |
  |-------- FIN ------->                     |
  |  <------ FIN-ACK -----                   |
  |                                           |

3. HTTP vs HTTPS

HTTP (незащищённый)

Приложение (HTTP)
    ↓
Транспорт (TCP)
    ↓
Сеть (IP)
    ↓
Канальный (Ethernet/Wi-Fi)

HTTPS (защищённый)

Приложение (HTTP)
    ↓
Безопасность (SSL/TLS)
    ↓
Транспорт (TCP)
    ↓
Сеть (IP)
    ↓
Канальный (Ethernet/Wi-Fi)

HTTPS добавляет слой TLS/SSL между HTTP и TCP для шифрования.

import ssl
import socket

def https_connection():
    # Создаём сокет TCP
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # Оборачиваем его TLS/SSL
    context = ssl.create_default_context()
    ssock = context.wrap_socket(sock, server_hostname='example.com')
    
    # Подключаемся к серверу
    ssock.connect(('example.com', 443))
    
    # Теперь идёт шифрованное соединение
    ssock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
    response = ssock.recv(4096)
    
    ssock.close()

4. Практическая демонстрация

Сырой HTTP запрос через TCP

import socket

def raw_http_request(host, port=80):
    # Создаём TCP сокет
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # Подключаемся к серверу (TCP соединение)
    sock.connect((host, port))
    
    # Отправляем HTTP запрос сырыми байтами
    http_request = (
        f'GET / HTTP/1.1\r\n'
        f'Host: {host}\r\n'
        f'Connection: close\r\n'
        f'\r\n'
    ).encode('utf-8')
    
    sock.sendall(http_request)
    
    # Получаем ответ
    response = b''
    while True:
        data = sock.recv(4096)
        if not data:
            break
        response += data
    
    sock.close()
    return response.decode('utf-8', errors='ignore')

response = raw_http_request('example.com')
print(response)

5. Другие комбинации протоколов

HTTP/2 и HTTP/3

HTTP/2 работает поверх TCP (как и HTTP/1.1), но с оптимизациями:

  • Множественные потоки в одном TCP соединении
  • Сжатие заголовков
  • Пушинг ресурсов

HTTP/3 работает поверх QUIC (не TCP!):

HTTP/3
   ↓
QUIC (UDP на основе)
   ↓
UDP (User Datagram Protocol)
   ↓
IP
   ↓
Ethernet/Wi-Fi

HTTP/3 решает проблемы TCP:

  • Быстрее восстанавливается при потере пакетов
  • Моментальное установление соединения
  • Поддержка миграции с Wi-Fi на 4G

WebSockets

WebSockets тоже используют TCP, но с upgrade:

from websockets import serve
import asyncio

async def handler(websocket, path):
    async for message in websocket:
        print(f'Received: {message}')
        await websocket.send(f'Echo: {message}')

# WebSocket работает так:
# HTTP Upgrade запрос (HTTP) поверх TCP
# После успеха протокол переходит на WebSocket
# Данные передаются через TCP в бинарном формате

async def main():
    async with serve(handler, 'localhost', 8765):
        await asyncio.Future()  # run forever

asyncio.run(main())

6. Адреса и порты

# HTTP по умолчанию использует TCP порт 80
# HTTPS по умолчанию использует TCP порт 443
# WebSocket обычно порты 80/443 (с upgrade)

import urllib.parse

url = 'https://example.com:8443/api/users?id=1'
parsed = urllib.parse.urlparse(url)

print(f'Схема: {parsed.scheme}')      # https
print(f'Хост: {parsed.hostname}')      # example.com
print(f'Порт: {parsed.port}')          # 8443
print(f'Путь: {parsed.path}')          # /api/users
print(f'Параметры: {parsed.query}')    # id=1

Итоги

  1. HTTP — это протокол 7-го уровня (Application)
  2. TCP — это протокол 4-го уровня (Transport)
  3. HTTP всегда работает поверх TCP (для HTTP/1.1 и HTTP/2)
  4. HTTP/3 использует QUIC вместо TCP (более новый стандарт)
  5. HTTPS добавляет слой TLS для шифрования между HTTP и TCP
  6. TCP обеспечивает: гарантированную доставку, упорядочение пакетов, управление потоком данных

Это основная архитектура современной веб-коммуникации.

Поверх какого протокола работает http | PrepBro