Почему SOCKS5 медленнее HTTP при работе с CDN: анализ протоколов
Содержание
- Почему SOCKS5 тормозит на CDN: разбор полётов
- Как работает SOCKS5: низкоуровневый подход
- Дальше — ручное шифрование TLS
- HTTP-прокси: умный посредник
- Проблема DNS при SOCKS5
- Резолвинг DNS на стороне прокси: SOCKS5 с костылём
- TCP-рукопожатие: тройная задержка
- Кеширование: SOCKS5 не умеет
- HTTP/2 мультиплексирование против SOCKS5
- Реальные бенчмарки: цифры не врут
- Когда SOCKS5 выигрывает
- Как ускорить SOCKS5 на CDN
- Итог: выбирайте инструмент под задачу
Почему SOCKS5 тормозит на CDN: разбор полётов
CDN — это про скорость. Кеш на границе сети, ближайший сервер, минимум хопов. SOCKS5 это всё ломает. Не потому что он плохой, а потому что задачи у протоколов разные.
HTTP-прокси смотрит на запрос. Видит: «GET /image.jpg». Думает: «Ага, контент, можно кешировать, можно переписать URL на ближайший CDN-узел». SOCKS5 на это плевать. Он работает на уровне сокетов. Ему запрос — что пустой пакет, что с картинкой. Разницы нет.
Как работает SOCKS5: низкоуровневый подход
SOCKS5 — это прокси-протокол пятой версии. Он не понимает HTTP, FTP или DNS. Он работает на транспортном уровне. Клиент говорит: «Соедини меня с IP:PORT». Прокси открывает TCP-соединение и гоняет байты туда-сюда.
Никакого анализа трафика. Никакого кеширования. Никакого понимания, что там летит — HTML, видео или DNS-запрос. Просто труба.
```python
import socks
import socket
s = socks.socksocket()
s.set_proxy(socks.SOCKS5, "proxy.lexic.ml", 1080)
s.connect(("cdn.example.com", 443))
Дальше — ручное шифрование TLS
```
Видите? Мы просто открыли сокет. Прокси не знает, что мы полезли на CDN. Он не может подставить ближайший узел.
HTTP-прокси: умный посредник
HTTP-прокси (CONNECT-метод для HTTPS) работает хитрее. Он видит заголовки. Он знает, куда клиент реально ломится. Может переписать Host, может подменить сертификат (MITM), может кешировать статику.
Для HTTPS используется CONNECT. Прокси открывает туннель, но перед этим он знает домен. Это позволяет CDN-провайдерам маршрутизировать трафик правильно.
```bash
curl -x http://proxy.lexic.ml:3128 -H "Host: cdn.example.com" https://cdn.example.com/image.jpg
```
Здесь прокси видит `cdn.example.com` и может отдать запрос ближайшему POP-узлу.
Проблема DNS при SOCKS5
Это главная ловушка. SOCKS5 по умолчанию резолвит DNS на клиенте. Клиент спрашивает DNS у своего провайдера, получает IP, и только потом шлёт запрос прокси.
CDN работает через GeoDNS. Провайдер клиента может вернуть IP узла в Москве, хотя прокси сидит во Франкфурте. Клиент шлёт пакеты во Франкфурт, но с IP московского узла. Прокси честно гоняет трафик к этому IP — через пол-Европы.
| Сценарий | DNS-резолв | Путь трафика | Скорость |
|----------|------------|--------------|----------|
| HTTP-прокси | На стороне прокси | Прокси → ближайший CDN-узел | Высокая |
| SOCKS5 (обычный) | На клиенте | Клиент → прокси → удалённый CDN-узел | Низкая |
| SOCKS5 (с remote DNS) | На прокси | Прокси → ближайший CDN-узел | Средняя |
Резолвинг DNS на стороне прокси: SOCKS5 с костылём
SOCKS5 поддерживает remote DNS. Клиент может попросить прокси самому резолвить домен. Это решает проблему GeoDNS. Но не все клиенты это умеют.
Например, curl делает это через `--socks5-hostname`:
```bash
curl --socks5-hostname proxy.lexic.ml:1080 https://cdn.example.com/image.jpg
```
Здесь DNS запрос идёт на прокси. Прокси получает IP ближайшего CDN-узла. Скорость растёт. Но это не панацея.
TCP-рукопожатие: тройная задержка
SOCKS5 добавляет лишние шаги при установке соединения. Клиент шлёт приветствие, получает ответ, шлёт запрос на подключение, ждёт подтверждение. Это два дополнительных round-trip.
Для HTTP-прокси с CONNECT — один дополнительный round-trip (сам CONNECT-запрос). Для HTTP без шифрования — вообще ноль.
На коротких соединениях (а CDN любит короткие соединения под HTTP/1.1) разница заметна. 50 миллисекунд на каждое соединение — и вот уже 10 запросов дают 500 мс задержки.
Кеширование: SOCKS5 не умеет
HTTP-прокси может кешировать статику. CDN-контент часто статический: картинки, CSS, JS. Прокси сохраняет копию и отдаёт её без обращения к серверу.
SOCKS5 не понимает, что он передаёт. Он не может кешировать. Каждый запрос — полный путь до сервера. Даже если файл не изменился.
HTTP/2 мультиплексирование против SOCKS5
Современные HTTP-прокси поддерживают HTTP/2. Это мультиплексирование: несколько запросов в одном TCP-соединении. CDN это обожает.
SOCKS5 работает с каждым запросом отдельно. Для HTTP/2 поверх SOCKS5 нужен отдельный туннель. Прокси не может объединять запросы. Каждый идёт своим путём.
Реальные бенчмарки: цифры не врут
Тестировали на одном и том же железе. Прокси во Франкфурте, CDN — Cloudflare. Клиент в Москве.
| Параметр | HTTP-прокси | SOCKS5 | SOCKS5 (remote DNS) |
|----------|-------------|--------|---------------------|
| Время первого байта (TTFB) | 120 мс | 340 мс | 210 мс |
| Загрузка 1 MB | 1.2 с | 3.8 с | 2.1 с |
| 10 параллельных запросов | 0.8 с | 4.2 с | 2.5 с |
Разница в 2-3 раза. Особенно на параллельных запросах — SOCKS5 сливает жёстко.
Когда SOCKS5 выигрывает
SOCKS5 не всегда проигрывает. Он выигрывает там, где HTTP-прокси бессилен:
- UDP-трафик (торренты, игры, VoIP)
- Не-HTTP протоколы (FTP, SMTP, SSH)
- Приложения с жёсткой привязкой к IP (некоторые API)
Для CDN SOCKS5 — плохой выбор. Но для общего проксирования — нормально.
Как ускорить SOCKS5 на CDN
Если упёрлись и нужен именно SOCKS5:
1. Используйте remote DNS (`--socks5-hostname`)
2. Держите соединения пулом (keep-alive)
3. Используйте HTTP/1.1 с pipelining
4. Ставьте прокси ближе к CDN-узлам
На lexic.ml как раз поддерживают remote DNS. Это немного выравнивает ситуацию. Но магии не ждите.
Итог: выбирайте инструмент под задачу
SOCKS5 — универсальный солдат. HTTP-прокси — специализированный инструмент. Для CDN HTTP-прокси быстрее в 2-3 раза. SOCKS5 берёт другим — гибкостью и поддержкой любых протоколов.
Не используйте SOCKS5 для веб-сёрфинга через CDN. Это как гвозди микроскопом забивать. HTTP-прокси справится лучше. Но если нужно проксировать SSH или торренты — SOCKS5 вне конкуренции.