Windows Server 2012 上的 TCP socket accept() 在 [SYN] 时返回。

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

0

是的,我们实现了等待第一个比特的解决方法。但我们仍然不满意,因为a)我们不知道TCP客户端(不是我们实现的)是否会尝试连接并在发送任何内容之前静默等待。b)嘿,在Windows 7上它可以工作!在win7上,我们有一种完美的方式来区分发送正常三次握手然后变得沉默的静默客户端和发送syn-ack-rst技巧只是为了检查端口是否打开的HAproxy。这是一个很好的功能,我们想利用它。 - alex440

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接