Проблема с передачей пакетов в Spring, HTTP
Мне и моей команде очень трудно решить странную ошибку.
Наша установка: Spring Boot API за некоторым сетевым оборудованием (жестким и программным), включая Squid Proxy
Эта проблема:
На некоторые входящие запросы, которые переносят данные (POST
а также PUT
) Spring вызывает следующее исключение:
org.springframework.http.converter.HttpMessageNotReadableException: ошибка ввода-вывода при чтении входного сообщения; вложенное исключение: java.io.IOException: java.util.concurrent.TimeoutException: истекло время ожидания простоя: 30000/30000 мс
Это заставляет нас чувствовать, что сервер ожидает окончания сообщения, но что-то на нижних сетевых уровнях препятствует его извлечению, а затем "тайм-ауту простоя"
Что мы знаем до сих пор:
HTTP-запрос проходит с того же компьютера через мобильное соединение LTE (200 OK), но не проходит через WiFi или проводное корпоративное соединение.
Игра с MTU на сетевом оборудовании влияет на поведение. Так же как и Connection
HTTP заголовок. Но так как мы не понимаем, что происходит "под капотом", мы не знаем, как правильно их настроить, и мы не нашли удовлетворительной конфигурации.
По конкретному запросу проблема возникает с одинаковым количеством байтов каждый раз (около 10 КБ /463 КБ)
Анализируя трафик с помощью Wireshark, мы заметили, что отправляются полные данные, что максимальный размер каждого TCP-пакета составляет 1460, что, вероятно, меньше, чем MTU каждого сетевого оборудования, и что последний проходящий байт не расположен в край пакета, но в середине пакета.