Странный сброс TCP (RST) на некоторых HTTP-запросах

У нас есть приложение, написанное на Delphi, которое использует Delphi On Rails, действует как сервер и общается с клиентами, используя HTTP, JSON и веб-сокеты. В последнее время мы столкнулись с некоторыми проблемами, и их трудно отладить и найти источник проблемы.

Используя Wireshark для анализа трафика, мы могли видеть следующее поведение: есть запрос от клиента (HTTP GET для файла). Обычно мы обрабатываем этот запрос и отправляем код состояния HTTP, файл (если не кэширован) и т. Д. Однако у нас есть воспроизводимая проблема, когда есть только запрос от клиента, TCP SYN с сервера, но после этого Сервер отправляет пакет RST, и связь TCP прекращается.

Странно то, что мы можем воспроизвести проблему довольно хорошо (хотя файлы, в которых пакет RST нарушает связь, различаются), и таинственным образом исчезает в одном из следующих случаев:

  • В среде отладки (Delphi IDE) отключение madExcept
  • В среде выпуска не исправление исполняемого файла с помощью madExceptPatch
  • Сделайте акцент на другом окне, отличном от основного окна приложения.

Поскольку у нас были некоторые проблемы с Delphi On Rails, и мы должны были внести в него небольшие изменения, чтобы избежать нарушений доступа и отладки исключений, я подозреваю, что DOR является виновником, а какое-то странное повреждение памяти или неотслеживаемое исключение - ошибкой, но это по-прежнему сбивает с толку, особенно тот факт, что проблема исчезнет, ​​если мы изменим фокус.

Мой главный вопрос не в том, как решить эту проблему, а в том, как ее отладить и где искать проблемы. Источник сброса TCP также озадачивает меня, так как мы не сталкиваемся с обычными процедурами, обрабатывающими запросы в этом случае, и кажется, что DOR или что-то еще (приложение, Winsock, OS) сбрасывает соединение по ошибке.

Для полноты, как это может быть связано, вот проблемы, о которых я сообщил в проекте Delphi On Rails, и ветка форума, где я спросил автора madExcept об этой проблеме: проблема № 6, проблема № 7, проблема № 8, запись на форуме.

1 ответ

Решение

В качестве теста мы проверили некоторые более старые источники DOR из системы контроля версий, где не было известно ни о каких проблемах с подключением, и это работает, не показывая ни одной из вышеуказанных проблем.

Поэтому мы решили решить проблему наоборот: откатить исходный код DOR (около 20 файлов) до последней стабильной версии и "обновлять" его по частям, пока ошибка не возникнет снова. Если это произойдет, мы можем

  1. Вернитесь к последней рабочей версии быстро
  2. Надеемся, что мы будем достаточно близки к исходным источникам DOR, чтобы мы могли реагировать на обновления библиотеки.
  3. Проанализируйте возникшую ошибку и сообщите подробный вопрос (и, возможно, даже решение) проекту DOR.

РЕДАКТИРОВАТЬ: Теперь мы можем обновить все, кроме одного файла обратно в старое состояние без проблем с подключением. Файл, который создает проблемы, - это dorSynchronizer.pas, точнее, именно r179 этого файла вызвал проблемы - потоки были изменены с Windows API на Delphi TThread. Мы рассмотрим это дальше и, возможно, добавим проблему в проект DOR в ближайшие дни.

EDIT2: оказалось, что DOR использует устаревшие процедуры TThread.Suspend и TThread.Resume, которые могут вызывать неопределенное поведение. Я сообщил о проблеме в проект DOR.

Другие вопросы по тегам