2015-06-15 2 views
9

Я использую 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 вопроса:

  1. Является ли это поведение настраивается?

  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, возможна потеря данных , поскольку соединение может быть установлено не всем способом между отправителем и получателем.

ответ

1

См How does the socket API accept() function work?

От http://soft.vub.ac.be/~tvcutsem/distsys/sockets.pdf Похоже, это ожидаемое поведение, как HAproxy открывает сокет к клиенту для того, чтобы направлять его на другой машине.

Проблема заключается в том, что HAproxy является TCP совместимый :)

Обходной должно быть, чтобы начать делать свою логику после того, как какая-то логика с сервера была подтверждена (например, небольшое сообщение было отправлено и ACK был получил, хотя гнездо).

+0

Да, мы применили обходное решение для ожидания первого бит.Но мы все еще не счастливы, потому что а) мы не знаем, будет ли клиент TCP (который не реализован нами) будет пытаться подключиться и ждать молча перед отправкой чего-либо. И б) эй, он работает на окнах 7! На win7 у нас был отличный способ разделить тихий клиент, который отправил нормальное тройное рукопожатие, а затем замолчал, и HAproxy, который отправил syn-ack-rst трюк только для проверки порта, открыт. Это хорошая функция, которую мы хотели бы использовать. – alex440

Смежные вопросы