Комментарии (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
Итоги
- HTTP — это протокол 7-го уровня (Application)
- TCP — это протокол 4-го уровня (Transport)
- HTTP всегда работает поверх TCP (для HTTP/1.1 и HTTP/2)
- HTTP/3 использует QUIC вместо TCP (более новый стандарт)
- HTTPS добавляет слой TLS для шифрования между HTTP и TCP
- TCP обеспечивает: гарантированную доставку, упорядочение пакетов, управление потоком данных
Это основная архитектура современной веб-коммуникации.