TCP套接字accept()在Windows Server 2012上的[SYN]上返回

时间:2015-06-15 11:06:29

标签: java tcp haproxy

我使用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的连接?

  3. 修改

    是否可以连接到Windows上的ATM TCP / IP?

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

      

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

1 个答案:

答案 0 :(得分:1)

请参阅How does the socket API accept() function work?

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

问题是HAproxy符合TCP标准:)

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