Есть следующий вопрос. Существует приложение написанное с помощью java/jsp. Т.е работа как я понимаю идет на уровне http протокола.
(Просто я еще не спец в этом, только начала разбираться с приложением, технологией и задачей)
Существует следующая ситуация. Стороннее приложение, которое взаимодействует с моим, как я понимаю в какой то момент шлет TCP RST, но перед этим запросило нас выполнить определенное действие. Суть в том что стороннее приложение считает что послав TCP RST оно отменяет выполнение действия, но наше приложение работает с данными полученными по http протоколу и не может отслеживать tcp сессии(как я понимаю это вообще ложится на плечи вэб сервера). Вопрос в следующем, могу ли я как то в своем приложение обработать эту ситуацию и отменить действие по TCP RST событию?
Надеюсь изложил более менее понятно Пока как смог, т.к. сам только начал погуржаться в эту тему.
Спасибо.
Здравствуйте, rnn, Вы писали:
rnn>Существует следующая ситуация. Стороннее приложение, которое взаимодействует с моим, как я понимаю в какой то момент шлет TCP RST, но перед этим запросило нас выполнить определенное действие.
Мнэээ... вообще-то в протоколе TCP не предполагается посылки RST для существующего корректного соединения. RST посылается или при явной ошибке параметров, или для несуществующего соединения, или как грубое средство его порвать всякими промежуточными агентами (файрволлами, экранами, NATами и прочими). Нормальное закрытие соединения на передачу это посылка FIN, которая должна быть хорошо заметна, а закрытие на приём — это присылка ACK с нулевым окном. Думаю, тут у вас не ваш удалённый собеседник шлёт RST, а кто-то левый. Или же IP стек сделан с нарушением базовых принципов, такое редко, но бывает. Или же там не RST, но вы почему-то думаете, что RST.
rnn> Суть в том что стороннее приложение считает что послав TCP RST оно отменяет выполнение действия, но наше приложение работает с данными полученными по http протоколу и не может отслеживать tcp сессии(как я понимаю это вообще ложится на плечи вэб сервера). Вопрос в следующем, могу ли я как то в своем приложение обработать эту ситуацию и отменить действие по TCP RST событию?
Очевидно, если об этом не сообщили, то не можете. А как именно веб-сервер может сообщить об этом, пока идёт обработка запроса, зависит от этого сервера.
The God is real, unless declared integer.
Re[2]: как обработать TCP RST на уровне приложения
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, rnn, Вы писали:
rnn>>Существует следующая ситуация. Стороннее приложение, которое взаимодействует с моим, как я понимаю в какой то момент шлет TCP RST, но перед этим запросило нас выполнить определенное действие.
N>Мнэээ... вообще-то в протоколе TCP не предполагается посылки RST для существующего корректного соединения. RST посылается или при явной ошибке параметров, или для несуществующего соединения, или как грубое средство его порвать всякими промежуточными агентами (файрволлами, экранами, NATами и прочими). Нормальное закрытие соединения на передачу это посылка FIN, которая должна быть хорошо заметна, а закрытие на приём — это присылка ACK с нулевым окном. Думаю, тут у вас не ваш удалённый собеседник шлёт RST, а кто-то левый. Или же IP стек сделан с нарушением базовых принципов, такое редко, но бывает. Или же там не RST, но вы почему-то думаете, что RST.
Спасибо. На счет корректности завершения сессии и т.д. я прочитал. Но по логам явно видно, что идет RST, а уж почему оно идет, пока информации нет и на сколько это корректно тоже непонятно.
rnn>> Суть в том что стороннее приложение считает что послав TCP RST оно отменяет выполнение действия, но наше приложение работает с данными полученными по http протоколу и не может отслеживать tcp сессии(как я понимаю это вообще ложится на плечи вэб сервера). Вопрос в следующем, могу ли я как то в своем приложение обработать эту ситуацию и отменить действие по TCP RST событию?
N>Очевидно, если об этом не сообщили, то не можете. А как именно веб-сервер может сообщить об этом, пока идёт обработка запроса, зависит от этого сервера.
Т.е. получается мне надо читать доки по конкретному вэб серверу, который я использую и пытаться понять как он об этом сообщает? Какой то общей ситуации нет?
И еще, я так понимаю при передачи данных, происходит установления множества сессий, т.е. она не поддерживается на протяжение всего времени передачи данных по HTTP. Если так, то отследить для какой конкретно сессии пришел RST будет трудно. Я к тому что, мне же все это нужно соотнести с моими данными, полученными по HTTP и отменить их.
Re[3]: как обработать TCP RST на уровне приложения
Здравствуйте, rnn, Вы писали:
rnn>>> Суть в том что стороннее приложение считает что послав TCP RST оно отменяет выполнение действия, но наше приложение работает с данными полученными по http протоколу и не может отслеживать tcp сессии(как я понимаю это вообще ложится на плечи вэб сервера). Вопрос в следующем, могу ли я как то в своем приложение обработать эту ситуацию и отменить действие по TCP RST событию?
N>>Очевидно, если об этом не сообщили, то не можете. А как именно веб-сервер может сообщить об этом, пока идёт обработка запроса, зависит от этого сервера.
rnn>Т.е. получается мне надо читать доки по конкретному вэб серверу, который я использую и пытаться понять как он об этом сообщает? Какой то общей ситуации нет?
Да, нету. Сервера слишком разнообразны, чтобы был общий механизм.
rnn>И еще, я так понимаю при передачи данных, происходит установления множества сессий, т.е. она не поддерживается на протяжение всего времени передачи данных по HTTP.
Если страница состоит из множества объектов, то это вероятно. Но так же и вероятно, что TCP сессия будет одна. Типичный браузер сейчас старается сохранять сессии на некоторое время и переиспользовать их.
rnn> Если так, то отследить для какой конкретно сессии пришел RST будет трудно.
Если сервер вообще в состоянии отменить запрос до получения ответа со стороны обрабатывающего его кода, то он и даст достаточную идентификацию этого запроса.
The God is real, unless declared integer.
Re[4]: как обработать TCP RST на уровне приложения