我使用HAProxy进行负载均衡,每10秒发送一次健康检查。
它的方式如下:
在Windows 7上,
它的方式如下:
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函数时,请注意该函数可能在连接建立穿过发送方和接收方之间的整个距离之前返回。这是因为accept函数在接收到CONNECT ACK消息后立即返回;在ATM中,下一个交换机在处理CONNECT消息后会立即返回CONNECT ACK消息(而不是最终建立连接的终节点发送CONNECT ACK)。因此,应用程序应意识到,如果在接收CONNECT ACK消息后立即发送数据,则可能会丢失数据,因为连接可能尚未在发送方和接收方之间完全建立。