Проблема
У нас есть веб-приложение, которым пользуются многие тысячи пользователей. Однако со второй половины января 2020 года небольшая часть клиентов (но все же значительное число) сообщили о подобной проблеме.
Веб-метод (ASP.NET MVC) не требует аутентификации пользователя и не требует HTTPS.
Анализ на КЛИЕНТЕ
Используя вкладку «Сеть» Google Chrome, мы записали данные в виде файла HAR. Для заблокированных запросов мы видим:
"timings": {
"blocked": 0.06441399999312125,
"dns": -1,
"ssl": -1,
"connect": -1,
"send": 0,
"wait": 0,
"receive": 0,
"_blocked_queueing": -1
},
Я интерпретирую это как указание на то, что это должно было дождаться завершения других вызовов AJAX (он был заблокирован), но он так и не дошел до отправки запроса.
Анализ на веб-сервере
Мы установили WireShark на веб-сервер и захватили трафик во время записи файла HAR.
Клиент (источник) описывается как Cisco.
Для неудавшегося запроса мы видим следующие кадры:
1. Client->Server: 18497 -> 80 [SYN, ECN, CWR]
2. Server->Client: 80 -> 18479 [SYN, ACK, ECN]
3. Client->Server: 18497 -> 80 [ACK]
4. Client->Server: 18497 -> 80 [RST, PSH, ACK]
Первые три кадра кажутся очень похожими на успешные сообщения, но здесь мы получаем, что клиент возвращает [RST, PSH, ACK], а успешные - нет.
Я посмотрел 2. (Сервер-> Клиент), и для успешных и неудачных случаев они кажутся очень похожими, хотя я признаюсь, что я разработчик программного обеспечения .NET и не очень хорошо знаком с уровнем TCP .. .
Исследуя [RST, PSH, ACK] от клиента, я действительно вижу следующее в разделе «Флаг»:
[Expert Info (Warning/Sequence): Connection reset (RST)]
[Connection reset (RST)]
[Severity level: Warning]
[Group: Sequence]
.... .... ..0. = Syn: Not set
.... .... ...0 = Fin: Not set
[TCP Flags: .......APR..]
Я понятия не имею, что вызывает уничтожение этого запроса: это что-то, что мы делаем неправильно на нашем сервере / LoadBalancer / Firewall, чтобы заставить клиента сбросить соединение, или это что-то неправильно настроено на стороне клиента?