Ответ
HTTP-ошибка 104 (Connection Reset by Peer) — это сетевая ошибка, означающая, что удаленная сторона (пир) принудительно разорвала установленное TCP-соединение. На уровне сокетов это соответствует сигналу ECONNRESET.
Основные причины:
- Серверная сторона: Сервер аварийно завершил работу, перегружен или в его коде возникло необработанное исключение, приводящее к закрытию сокета.
- Сетевые проблемы: Обрыв соединения на уровне сети или оборудования (фаервол, балансировщик нагрузки).
- Нарушение протокола: Клиент отправил данные в неожидаемом формате или нарушил таймауты.
- Перезапуск сервиса: Серверное приложение было перезапущено во время активного соединения.
Пример обработки в Python с использованием библиотеки requests:
import requests
from requests.exceptions import ConnectionError
try:
response = requests.get('https://api.example.com/data', timeout=5)
response.raise_for_status() # Вызовет исключение для статусов 4xx/5xx
data = response.json()
except ConnectionError as e:
# Ошибка 104 часто попадает сюда
print(f"Соединение разорвано сервером: {e}")
# Логика повторной попытки (retry) или уведомления пользователя
Стратегии устранения и обработки:
- На стороне клиента:
- Реализовать механизм повторных попыток (retry logic) с экспоненциальной задержкой.
- Добавить корректную обработку таймаутов.
- Логировать такие ошибки для последующего анализа.
- На стороне сервера:
- Проверить логи сервера на наличие аварийных завершений или исключений.
- Проанализировать нагрузку и при необходимости масштабировать ресурсы.
- Убедиться в корректности обработки входящих соединений и graceful shutdown.