netcat не отправляет окончательный FIN для закрытия соединения

Я играю с самодельным tcp-сервером nodejs и тестирую его поведение с помощью netcat под Linux. После установления соединения сервер отправляет строку «Test» по линии и закрывает сокет. Я ожидаю, что netcat закроет соединение на своей стороне, отправив соответствующие TCP-пакеты, но это не так! Вот что я делаю:

nc -v localhost 9000

После этого весь разговор выглядит так:

netcat --> server (SYN)
netcat <-- server (SYN, ACK)
netcat --> server (ACK)
netcat <-- server (PSH, ACK)
netcat --> server (ACK)
netcat <-- server (FIN, ACK)
netcat --> server (ACK)

В этот момент я бы ожидал, что netcat отправит FIN, но этого никогда не происходит. Соединение зависает в FIN-WAIT-2 с одной стороны и CLOSE-WAIT с другой.

Если я попробую то же самое с telnet:

telnet localhost 9000

он ведет себя так, как ожидалось, и разрывает соединение после получения строки «Тест».

Вопрос в том, почему netcat ведет себя иначе?


person Dima Slivin    schedule 14.01.2015    source источник


Ответы (1)


netcat был разработан для работы до тех пор, пока обе стороны не закроют соединение. У вас осталась одна сторона открытой.

Когда сервер закрывает соединение с FIN, соединение остается в полуоткрытом состоянии, когда вы можете отправлять данные, а сервер может их получать. Соединение останется в этом состоянии, пока вы не закроете стандартный ввод netcat (нажмите Ctrl-D), что заставит его отправить пакет FIN на сервер.

person Joni    schedule 14.01.2015
comment
Что ж, тогда это может быть довольно новая функция в netcat. Я почти уверен, что помню время, когда он ДЕЙСТВИТЕЛЬНО закрыл соединение. Я использовал его для выполнения ручных HTTP-запросов GET, и он вышел после получения HTML-кода страницы. - person Dima Slivin; 14.01.2015
comment
Кажется, я неправильно запомнил: во всех тестах я могу думать, что моя копия netcat отключается, когда удаленная сторона отправляет FIN. Какой netcat вы используете, есть несколько реализаций? - person Joni; 14.01.2015
comment
Netcat версии 6.45, Fedora 20. Запуск из Konsole в KDE. Но вы были правы — соединение не закрывалось и после выполнения HTTP-запроса GET — я только что попробовал nc www.google.com 80. - person Dima Slivin; 14.01.2015
comment
@DmitryS., @Joni, я могу подтвердить: с nc в Fedora 25 соединение остается полуоткрытым. Это замена Netcat от Nmap (nmap-ncat-2:7.40-1.fc25). Кстати, socat (как и в socat stdin TCP4:example.org:80) по умолчанию закрывает соединение, когда сервер отправляет FIN. - person maxschlepzig; 01.02.2017