Что означает HTTP-ошибка 104 (Connection Reset by Peer)?

«Что означает HTTP-ошибка 104 (Connection Reset by Peer)?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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) или уведомления пользователя

Стратегии устранения и обработки:

  1. На стороне клиента:
    • Реализовать механизм повторных попыток (retry logic) с экспоненциальной задержкой.
    • Добавить корректную обработку таймаутов.
    • Логировать такие ошибки для последующего анализа.
  2. На стороне сервера:
    • Проверить логи сервера на наличие аварийных завершений или исключений.
    • Проанализировать нагрузку и при необходимости масштабировать ресурсы.
    • Убедиться в корректности обработки входящих соединений и graceful shutdown.