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

ale*_*440 9 java tcp haproxy

我使用HAProxy每10秒发送一次健康检查.

它按以下方式进行:

HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server  : [RST, ACK]
Run Code Online (Sandbox Code Playgroud)

我的TCP服务器是用以下方式用java编写的:

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

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

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

所以我有两个问题:

  1. 这种行为是可配置的吗?

  2. 如果我不想在运行监听器之前等待第一位或消息,我怎样才能在Windows 2012上检测到来自HAProxy的连接?

编辑:

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

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

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

Hen*_*oni 0

请参阅套接字 API Accept() 函数如何工作?

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

问题是 HAproxy 符合 TCP :)

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