Назад | Перейти на главную страницу

Ошибка AJAX POST - клиент отправляет ответ RST… почему?

Проблема

У нас есть веб-приложение, которым пользуются многие тысячи пользователей. Однако со второй половины января 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, чтобы заставить клиента сбросить соединение, или это что-то неправильно настроено на стороне клиента?