【问题标题】:TCP socket accept() returns on [SYN] on windows server 2012TCP 套接字接受()在 Windows Server 2012 上的 [SYN] 上返回
【发布时间】:2015-08-30 20:32:43
【问题描述】:

我使用 HAProxy,它每 10 秒发送一次健康检查。

它采用以下方式:

HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server  : [RST, ACK]

我的TCP服务器是用java写的,方式如下:

while (true){
    Socket socket = kaServerSocket.accept();
    MyListener listener = new MyListener(socket);
    listener.start(); //costly operation
}

在 Windows 7 上,accept() 在此交换后不会返回(它在常规 syn->ack->syn 握手后返回),这就是我所需要的。

但是,当应用程序在 Windows server 2012 上运行时,accept() 函数会返回从 HAProxy 发送的第一个 [SYN],并执行代价高昂的操作。

所以我有两个问题:

  1. 此行为是否可配置?

  2. 如果我不想在运行侦听器之前等待第一个比特或消息,如何在 windows 2012 上检测到来自 HAProxy 的连接?

编辑:

它可以连接到 Windows 上的 ATM TCP/IP 吗?

https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx

在使用accept函数时,意识到函数可能会返回 在连接建立遍历整个距离之前 发送者和接收者之间。这是因为接受函数 收到 CONNECT ACK 消息后立即返回;在 ATM 中,一个 路径中的下一个交换机尽快返回 CONNECT ACK 消息 处理 CONNECT 消息时(而不是 CONNECT ACK 被 由最终连接到的端节点发送 已确立的)。因此,应用程序应该意识到,如果数据是 在收到 CONNECT ACK 消息后立即发送,数据丢失 是可能的,因为连接可能尚未全部建立 发送者和接收者之间的方式。

【问题讨论】:

    标签: java tcp haproxy


    【解决方案1】:

    How does the socket API accept() function work?

    来自http://soft.vub.ac.be/~tvcutsem/distsys/sockets.pdf 这似乎是预期的行为,因为 HAproxy 正在向客户端打开套接字以便将其路由到另一台机器。

    问题在于 HAproxy 是 TCP 兼容的 :)

    一种解决方法应该是在验证来自服务器的某些逻辑之后开始执行您的逻辑(例如,发送了一条小消息并通过套接字接收到一个 ACK​​)。

    【讨论】:

    • 是的,我们实现了等待第一位的解决方法。但是我们仍然不高兴,因为 a) 我们不知道 TCP 客户端(我们没有实现)是否会尝试连接并在发送内容之前静默等待。 b) 嘿,它适用于 Windows 7!在 win7 上,我们有一个完美的方法来区分发送正常三次握手然后静音的静默客户端和发送 syn-ack-rst 技巧只是为了检查端口是否打开的 HAproxy。这是我们想利用的一个很好的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多