Я использую HAProxy, который отправляет проверку работоспособности каждые 10 секунд.TCP socket accept() возвращается в [SYN] на сервере Windows 2012
Он идет следующим образом:
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
}
На окнах 7, accept()
не возвращается после этого обмена (его возвращается после обычного syn-> ack-> syn handshake), и это то, что мне нужно.
Однако, когда приложение запущено на сервере Windows 2012, функция возвращает [SYN]
, которая отправляется из HAProxy и выполняет дорогостоящую операцию.
Так что у меня 2 вопроса:
Является ли это поведение настраивается?
Если я не хочу ждать первого бита или сообщения, прежде чем запускать прослушиватель, как я могу определить, что соединение связано с HAProxy на окнах 2012?
EDIT:
Может это быть связано с ATM TCP/IP на Windows?
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, возможна потеря данных , поскольку соединение может быть установлено не всем способом между отправителем и получателем.
Да, мы применили обходное решение для ожидания первого бит.Но мы все еще не счастливы, потому что а) мы не знаем, будет ли клиент TCP (который не реализован нами) будет пытаться подключиться и ждать молча перед отправкой чего-либо. И б) эй, он работает на окнах 7! На win7 у нас был отличный способ разделить тихий клиент, который отправил нормальное тройное рукопожатие, а затем замолчал, и HAproxy, который отправил syn-ack-rst трюк только для проверки порта, открыт. Это хорошая функция, которую мы хотели бы использовать. – alex440