Странный сброс 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 файлов) до последней стабильной версии и "обновлять" его по частям, пока ошибка не возникнет снова. Если это произойдет, мы можем
- Вернитесь к последней рабочей версии быстро
- Надеемся, что мы будем достаточно близки к исходным источникам DOR, чтобы мы могли реагировать на обновления библиотеки.
- Проанализируйте возникшую ошибку и сообщите подробный вопрос (и, возможно, даже решение) проекту DOR.
РЕДАКТИРОВАТЬ: Теперь мы можем обновить все, кроме одного файла обратно в старое состояние без проблем с подключением. Файл, который создает проблемы, - это dorSynchronizer.pas, точнее, именно r179 этого файла вызвал проблемы - потоки были изменены с Windows API на Delphi TThread. Мы рассмотрим это дальше и, возможно, добавим проблему в проект DOR в ближайшие дни.
EDIT2: оказалось, что DOR использует устаревшие процедуры TThread.Suspend и TThread.Resume, которые могут вызывать неопределенное поведение. Я сообщил о проблеме в проект DOR.