[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Странное поведение TCP



Добрый день, коллеги. Вопрос не совсем по Debian, но связан в
некоторой степени с администрированием.

Есть некоторый сервер, к которому выполняется TCP-подключение.
1) Во-время установления соединения происходит стандартный TCP-шный
handshake (SYN, SYN-ACK, ACK).

2) Затем, согласно протокола приложения, клиент посылает первый пакет
и ждет ответа от сервера.

3) Так вот, иногда бывает так, что сервер внезапно на первые
присланные данные отвечает RST. Причем отвечает не сразу, а через
время, которое на десятки миллисекунд превышает RTT. И всё бы хорошо,
но у данного RST-пакета SEQ=0, а после SYN-ACK, он должен быть равен
1. Из-за этого, клиентский Linux игнорирует данный RST пакет и
продолжает думать, что соединение живо.

4) То есть программно сокет не слетает с read()'а с ошибкой Connection
reset by peer, а продолжает ожидать прихода данных. При этом, что
самое смешное, после RST от сервера приходит ACK на данные клиента. То
есть клиентский TCP даже не пытается перепослать начальный пакет.

5) Удалённая же сторона считает, что она соединение закрыла: если
отправить ещё что-нибудь, то приходит правильный RST.

У меня есть очень сильное подозрение, что во всём виновато какое-то
"расширение" TCP типа SYN-cookies, а может быть там стоит какой-то
дурацкий SYN-прокси. В общем коллеги, вопрос: кто-нибудь знает для
каких ситуаций такое поведение TCP типично?

--
With best regards
  Max Dmitrichenko

Reply to: