【问题标题】:Tcp Socket ClosedTcp 套接字关闭
【发布时间】:2011-01-26 14:15:08
【问题描述】:

我一直认为,如果不实现心跳,就无法知道 TCP 连接的一侧是否意外死亡。如果进程只是在一侧被杀死并且没有正常退出,则套接字无法发送 FIN 或让另一侧知道它已关闭。

(请参阅此处的一些 cmets,例如 http://www.perlmonks.org/?node_id=566568

但是我连接的一个股票订单服务器有一个新的“取消所有订单断开连接功能”,如果客户端断开连接,它会取消实时订单。即使我最终终止进程,它也可以工作,而且我的应用程序绝对没有心跳。

那么它如何能够检测到我何时终止了该进程?我的应用在 Windows Server 2003 上运行,订单服务器在 Suse Linux Enterprise Server 10 上。Windows 是否检测到与套接字关联的进程不再活动并发送 FIN?

【问题讨论】:

    标签: tcp sockets


    【解决方案1】:

    当进程退出时——无论出于何种原因——操作系统将关闭它打开的 TCP 连接。

    还有许多其他方式可以使 TCP 连接失效而未被检测到

    • 有人拔出中间的网线。
    • 另一端的计算机被核爆了。
    • 中间的 nat 网关静默断开连接
    • 另一端的操作系统严重崩溃。
    • FIN 数据包丢失。

    虽然启用了 tcp keepalive,但您最终会检测到它 - 至少在几个小时内。

    【讨论】:

    • 顺便说一句,您能否详细说明“FIN 数据包如何丢失”?
    • @Pacerier 好吧,IP 不可靠,数据包丢失或损坏的方式有很多种。如果 FIN 数据包(以及随后的 FIN 重传或 RST 数据包)丢失,该数据包应该告诉对等方应该关闭连接,但对等方将永远不会知道这个事实。也许对等方期望接收到更多永远不会发生的数据。
    • 是的,我的意思是“数据包丢失或损坏的方式数量”?
    • @Pacerier 如果数据包经过的以太网交换机缓冲区空间不足,则会丢弃数据包。与路由器相同。即使对于发送和接收主机也是如此,当没有更多的缓冲区空间时,它们会丢弃数据包。数据包当然也会在传输过程中损坏,电缆不完善,传输干扰,导致误码。
    • @nos 关于 FIN 数据包丢失。如果发送的 FIN 包丢失了 ACK 将不会被接收到,然后 FIN 将被重新发送,所以这将被检测到?
    【解决方案2】:

    据我所知,操作系统检测到进程终止并关闭进程正在使用的所有文件描述符/套接字/句柄。因此,“杀死”应用程序和“优雅终止”之间没有区别。当然,内核本身必须正在运行(= pc 已打开,已连接...)。但它在操作系统上发送 FIN 等的工作...... 此外,如果主机变得无法访问/关闭、断开连接......)中间网关(或客户端本身)可能会检测到事件(例如,运营商丢失、DHCP 租约未更新......)并回复发送到的数据包因 ICMP 错误(主机/网络无法访问)而死掉的主机。这会导致对等方的 TCP 连接断开,但只有当客户端有一些数据包要发送到主机时才会发生。

    【讨论】:

      【解决方案3】:

      它可能正在使用 TCP Keep Alive 来检查死节点:

      http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

      【讨论】:

        猜你喜欢
        • 2015-12-07
        • 2015-09-04
        • 2012-02-10
        • 2011-08-08
        • 2013-04-29
        • 2011-08-07
        • 2015-10-16
        • 2015-03-29
        • 1970-01-01
        相关资源
        最近更新 更多