Telegram - один из самых популярных мессенджеров, и многие пользователи macOS и других ОС заметили что в последнее время загрузка фото и видео работает медленнее. Причина часто кроется не в скорости интернета, а в особенностях работы TCP-соединений с серверами Telegram.
Изучая эту проблему, я обнаружил интересный подход: перенаправление трафика через WebSocket Secure (WSS) соединения может значительно ускорить загрузку медиафайлов и работу телеграма. WebSocket работает поверх TLS и имеет оптимизации для долгоживущих соединений, что особенно важно для мессенджеров.
Однако готового решения для macOS не существовало. Так родилась идея создать нативное приложение, которое будет работать в фоне, не отвлекать меня и при этом эффективно ускорять Telegram.
Почему это работает?
Стандартный TCP-трафик Telegram может подвергаться:
Throttling'у со стороны провайдеров (намеренное замедление)
Потере пакетов на длинных маршрутах
Высокой задержке из-за алгоритмов контроля перегрузки
WebSocket поверх TLS (WSS) использует порт 443 - тот же, что и HTTPS-трафик. Это дает несколько преимуществ:
Обход throttling'а - провайдеры реже ограничивают HTTPS-трафик
Мультиплексирование - несколько соединений в одном TCP-потоке
Меньше накладных расходов на установку соединения
Как это работает
Принцип работы основан на перехвате SOCKS5-трафика от Telegram Desktop и его перенаправлении через WebSocket-соединения.
Локальный SOCKS5-сервер поднимается на
127.0.0.1:1080Анализ трафика - прокси перехватывает подключения к IP-адресам Telegram
Определение DC - из MTProto obfuscation init-пакета извлекается ID дата-центра
WebSocket-соединение - устанавливается TLS-соединение к соответствующему DC через домены
kws{N}.web.telegram.orgFallback-механизм - если WebSocket недоступен (302 redirect), происходит автоматическое переключение на прямое TCP-соединение
Архитектура приложения
Проект состоит из двух основных компонентов:
1. Ядро прокси
Реализует SOCKS5-сервер, WebSocket-клиент и всю логику маршрутизации. Главные особенности ядра:
Асинхронность - на базе asyncio для максимальной производительности
Пул соединений - переиспользование WebSocket-соединений для ускорения
Автоматическое определение DC - без необходимости ручной настройки
2. GUI-обертка
Обеспечивает нативную интеграцию с macOS:
Иконка в системном трее
Управление прокси - запуск, остановка, перезапуск
Настройки - изменение порта, добавление DC-серверов
Ключевые решения
Пул WebSocket-соединений
Для ускорения повторных подключений реализован пул с предварительным прогревом:
class _WsPool:
def __init__(self):
self._idle: Dict[Tuple[int, bool], list] = {}
self._refilling: Set[Tuple[int, bool]] = set()
async def warmup(self, dc_opt):
# Предварительное подключение ко всем DC
for dc, target_ip in dc_opt.items():
for is_media in (False, True):
self._schedule_refill((dc, is_media), target_ip)
Это позволяет сократить задержку при первом подключении к дата-центру.
Автоматическое определение DC
Прокси анализирует первые 64 байта MTProto-соединения и извлекает ID дата-центра. Это критически важно для правильной маршрутизации, так как разные DC могут находиться в разных географических регионах.
Fallback на TCP
Если WebSocket по какой-то причине недоступен, прокси автоматически переключается на прямое TCP-соединение. Это гарантирует работоспособность даже при проблемах с WebSocket-инфраструктурой Telegram.
Почему это удобно?
Никаких терминалов - установка как обычной программы, Никаких настроек - все работает сразу после установки, Бесплатно - полностью открытый исходный код
Заключение
Надеюсь, мой опыт будет полезен другим разработчикам, а само приложение - пользователям macOS, которые хотят ускорить работу Telegram.
Ссылки: