Ich benutze HAProxy, die alle 10 Sekunden einen Gesundheitscheck sendet.TCP-Socket accept() gibt auf [SYN] auf Windows-Server 2012 zurück
Es geht in der folgenden Art und Weise:
HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server : [RST, ACK]
Mein TCP-Server in Java in der folgenden Art und Weise geschrieben:
while (true){
Socket socket = kaServerSocket.accept();
MyListener listener = new MyListener(socket);
listener.start(); //costly operation
}
unter Windows 7, accept()
kehrt nicht nach diesem Austausch (es kehrt nach dem regulären syn-> ack-> syn-Handshake zurück, und das brauche ich.
Wenn die Anwendung jedoch auf Windows Server 2012 ausgeführt wird, gibt accept()
Funktion auf dem ersten [SYN]
zurück, der von HAProxy gesendet wird, und führt die kostspielige Operation aus.
So habe ich 2 Fragen:
Ist das Verhalten konfigurierbar?
Wenn ich nicht auf das erste Bit oder die Nachricht warten möchte, bevor ich den Listener ausführen, wie kann ich die Verbindung von HAProxy auf Windows 2012 erkennen?
EDIT:
es kann mit dem ATM-TCP/IP unter Windows angeschlossen werden?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
Wenn die Funktion übernehmen verwenden, erkennen, dass die Funktion zurückkehren kann vor Verbindungsaufbau über den gesamten Abstand zwischen Sender und Empfänger durchquert hat. Dies liegt daran, dass die Accept-Funktion zurückkehrt, sobald sie eine CONNECT ACK-Nachricht erhält. In ATM wird eine CONNECT ACK-Nachricht vom nächsten Switch im Pfad zurückgegeben, sobald eine CONNECT-Nachricht verarbeitet wird (anstatt dass CONNECT ACK von dem Endknoten gesendet wird, für den die Verbindung letztendlich eingerichtet ist). Als solche sollten Anwendungen erkennen, dass, wenn die Daten unmittelbar nach dem Empfang einer CONNECT ACK-Nachricht gesendet werden, ein Datenverlust möglich ist, da die Verbindung möglicherweise nicht vollständig zwischen Sender und Empfänger hergestellt wurde.
Ja, wir haben eine Umgehung des Wartens auf das erste Bit implementiert.Aber wir sind immer noch nicht glücklich, denn a) wir wissen nicht, ob der TCP-Client (der von uns nicht implementiert wird) versuchen wird, eine Verbindung herzustellen und still zu warten, bevor er etwas sendet. Und b) hey, es funktioniert auf Windows 7! Auf win7 hatten wir eine perfekte Möglichkeit, zwischen dem stillen Client zu unterscheiden, der einen normalen Dreifach-Handshake aussandte, und dann verstummten und HAproxy, der den ersten syn-ack-Trick sendete, nur um zu überprüfen, ob der Port offen ist. Das ist ein nettes Feature, das wir gerne nutzen würden. – alex440