Есть ли шанс, что данные старого TCP-соединения проникнут в новое TCP-соединение на том же порту?

Я устанавливаю параметр SO_REUSEADDR для сокетов. Предположим, сокет закрыт с одного конца.

И дескриптор сокета был переназначен другому процессу.

Есть ли шанс, что данные из старого TCP-соединения проникнут в новое TCP-соединение?

Кто-нибудь наблюдал, как старые данные проникают в новое TCP-соединение, особенно в Solaris?


person Chandu    schedule 19.02.2013    source источник


Ответы (2)


No.

Если вы повторно используете локальный порт, но либо удаленный хост, либо порт меняются при последующем подключении, то это невозможно.

В случае повторного подключения к тому же удаленному IP/порту с того же локального IP/порта, также известном как TIME-WAIT Assasination, существуют некоторые правила, которым должен следовать стек TCP. В основном - начиная с более высокого порядкового номера, чем предыдущее соединение. Вы можете прочитать мелкий шрифт в RFC 1337. Но вот лучшая ссылка и цитата, в которой показано, как корректируется порядковый номер при последующих подключениях.

http://blogs.technet.com/b/networking/archive/2010/08/11/how-tcp-time-wait-assassination-works.aspx

В ситуации, когда сокет на стороне сервера переходит в состояние TIME-WAIT, а клиент повторно подключается к серверу в течение 2MSL (время TIME-WAIT по умолчанию), могут произойти две вещи:

  1. Сервер не будет отвечать на пакеты SYN от клиента, поскольку сокет находится в состоянии TIME-WAIT.

  2. Сервер может принять SYN от клиента и изменить состояние сокета с TIME-WAIT на ESTABLISHED. Это известно как убийство TIME-WAIT или воплощение предыдущей связи.

Ключом к приведенному выше сценарию «2» является то, что ISN (начальный порядковый номер) отправленного SYN должен быть выше самого высокого порядкового номера, использованного в предыдущем сеансе. Если ISN не соответствует ожидаемому, сервер не ответит на SYN, и сокет будет ждать 2MSL, прежде чем снова станет доступным для использования.

person selbie    schedule 19.02.2013
comment
Таким образом, во втором случае, упомянутом выше, существует отдаленная возможность того, что данные старого соединения проникнут в новое соединение, если порядковый номер старого соединения больше, чем порядковый номер нового соединения. - person Chandu; 11.03.2013
comment
Если кратко, то вам не о чем беспокоиться. Но любой протокол, который вы построили поверх TCP, должен быть достаточно надежным, чтобы обрабатывать неверные данные от клиента, который ведет себя неправильно. То есть, если вы действительно думаете, что это возможно, то кодируйте с осторожностью. Во втором случае выше, сокет будет закрыт. И даже если уровень TCP вернет соединение в состояние ESTABLISHED, оно будет передано приложению как новый сокет, возвращенный из accept(). - person selbie; 11.03.2013

Вот для чего нужно состояние TIME_WAIT. Он длится в два раза больше максимального времени жизни сегмента, так что срок действия любых данных, отправленных на старое соединение, истекает до того, как может быть сформировано новое соединение между теми же парами IP:порт.

person user207421    schedule 19.02.2013