Мой сервер веб-служб иногда не принимает правильные HTTP-запросы и возвращает «500 - Internal Server Error». С помощью tcpdump
и Wireshark на сервере, я обнаружил, что HTTP-запросы разбиты на 2 TCP-пакета, и иногда сервер пытается обработать запрос до того, как может прийти второй пакет.
Этот захват Wirehark был взят на стороне сервера.
Итак, я вижу следующее:
54.659
71.168
99.869
(то есть через 45 секунд после первого)99.865
, время ожидания сервера истекло, и он попытался обработать неполный запрос (что дает ошибку 500)Я не знаю, где теперь искать. Я бы сказал, что это проблема сети, но у меня есть несколько TCP-потоков, в которых сервер пытается обработать запрос за несколько миллисекунд, прежде чем он будет полностью получен. С другой стороны, пакеты TCP, доставка которых занимает более 45 секунд, означает, что сеть действительно плохая.
У вас есть какие-нибудь указания, как расследовать больше?
Повторная передача может быть ключом к разгадке. Клиент не получил ACK, который сервер отправил для этого пакета. Серверы также получили два SYN с одного и того же исходного порта в самом начале дампа.
Оба IP-адреса здесь локальные, так что я предполагаю, что это не идет через Интернет. У вас есть доступ к клиенту?
Попробуйте выполнить одну и ту же трассировку пакетов одновременно на клиенте и сервере. Я ожидаю, что вы увидите большие расхождения между тем, что отправлено, и тем, что получено.
Затем проследите кабели. У вас такая большая задержка и потеря пакетов, что я бы искал воздушный зазор, через который электроны прыгают, когда напряжение поднимается достаточно высоко, или оголенный кабель Cat-5 с ржавыми соединениями и каплями воды.
Заменяйте сетевые компоненты (устройства, порты и кабели), пока проблема не исчезнет.
Я не знаю где искать сейчас
Никуда. Шутки в сторону.
Бывает.
шляпа через 45 секунд после первой
Это ОГРОМНО. Шутки в сторону. Задержка интернета из Европы в США составляет около 150 мс. Вы в 30 раз больше - это капля без повторной отправки. К сожалению, если вы не контролируете ОБЕИХ СТОРОНЫ (!), Вы не можете контролировать поведение клиента. Такие вещи случаются.
Если это ваша локальная сеть - она серьезно хреновая. Это Интернет, так оно и есть. Главный вопрос в том, насколько это плохо - если это «несколько тысяч подключений», это может быть серьезной сетевой проблемой на другом конце. Если такое случается почти со всеми, это ближе к вам (подключение, дата-центр и т. Д.). Вчера, например, у нас здесь была такая ситуация - какая-то дурацкая *** DDOS одна из моих ссылок. СЕРЬЕЗНАЯ перегрузка может привести к тому, что пакеты станут почти невозможными. Но если это не ты - ничего не поделаешь.
Это как если бы кто-то слишком поздно пришел на встречу и сказал вам, что у него серьезная пробка. вы не можете этого знать, если только на вашей улице не будет пробки. Интернет иногда бывает довольно дрянным.
Вы пытались указать кэшируемость своих ответов, чтобы запретить кеширование промежуточными устройствами?
Cache-Control: без кеша
или
Cache-Control: частный
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9