Почему Telegram на macOS стал медленнее и как это исправить
Telegram — один из самых популярных мессенджеров, но пользователи macOS всё чаще жалуются на медленную загрузку фото и видео. Причина не всегда кроется в скорости интернета. Зачастую проблема — в особенностях TCP-соединений с серверами Telegram.
Неочевидное решение: WebSocket Secure
Исследуя эту проблему, я обнаружил, что перенаправление трафика через WebSocket Secure (WSS) позволяет значительно ускорить работу мессенджера. WebSocket работает поверх TLS и оптимизирован для долгоживущих соединений — именно то, что нужно для мессенджера.
Проблема была в отсутствии готового решения для macOS. Так появилась идея создать нативное приложение, которое работает в фоне, не отвлекает пользователя и эффективно ускоряет Telegram.
Почему это работает
Стандартный TCP-трафик Telegram подвержен:
- Throttling’у — провайдеры намеренно замедляют «неприоритетный» трафик
- Потере пакетов на длинных маршрутах
- Высокой задержке из-за алгоритмов контроля перегрузки
WebSocket поверх TLS (WSS) использует порт 443 — тот же, что и HTTPS. Это даёт ключевые преимущества:
- Обход throttling’а — провайдеры реже ограничивают HTTPS-трафик
- Мультиплексирование — несколько соединений в одном TCP-потоке
- Меньше накладных расходов на установку соединения
Как это работает
Приложение действует как прозрачный прокси:
- Локальный SOCKS5-сервер поднимается на
127.0.0.1:1080 - Анализ трафика — прокси перехватывает подключения к IP-адресам Telegram
- Определение DC — из MTProto obfuscation init-пакета извлекается ID дата-центра
- WebSocket-соединение — устанавливается TLS-соединение к соответствующему DC через домены
kws{N}.web.telegram.org - Fallback-механизм — если WebSocket недоступен (например, 302 redirect), происходит автоматическое переключение на прямое TCP-соединение
Архитектура приложения
Проект состоит из двух компонентов:
1. Ядро прокси
- Асинхронность — на базе
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 былую скорость.
ссылка на git hab https://github.com/Maxim-szh/tg-ws-proxy-mac





