【问题标题】:netcat doesn't send final FIN to close the connectionnetcat 不发送最终 FIN 来关闭连接
【发布时间】:2015-03-12 22:07:45
【问题描述】:

我正在使用自制的nodejs tcp服务器并在Linux下使用netcat测试它的行为。建立连接后,服务器将“测试”字符串向下发送并关闭套接字。我希望 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 的行为会有所不同?

【问题讨论】:

    标签: node.js sockets tcp netcat


    【解决方案1】:

    netcat 设计为在双方都关闭连接之前工作。您仍然有一侧打开。

    当服务器使用 FIN 关闭连接时,连接保持半打开状态,您可以发送数据,服务器可以接收数据。连接将保持这种状态,直到您关闭 netcat 的标准输入(键入 Ctrl-D),这使它向服务器发送一个 FIN 数据包。

    【讨论】:

    • 嗯,这可能是 netcat 中一个相当新的功能。我很确定我记得它确实关闭连接的时间。我用它手动发出http GET请求,收到页面html后确实退出了。
    • 我想我记错了:在所有测试中,我都能想到当远程端发送 FIN 时我的 netcat 副本关闭。你用的是哪个netcat,有几种实现方式?
    • Netcat 6.45 版,Fedora 20。在 KDE 中从 Konsole 启动。但你是对的——在完成 http GET 请求后它也没有关闭连接——我刚刚尝试了 nc www.google.com 80。
    • @DmitryS.,@Joni,我可以确认:在 Fedora 25 上使用nc,连接保持半开状态。这是 Nmap 的 Netcat 替代品 (nmap-ncat-2:7.40-1.fc25)。顺便说一句,默认情况下,socat(如socat stdin TCP4:example.org:80)会在服务器发送 FIN 时关闭连接。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多