Was passiert, wenn 2 Hosts gleichzeitig eine Verbindung in einem 3-Wege-Handshake herstellen?

0

Angenommen, zwei Hosts, A und B, versuchen beide, eine Verbindung miteinander herzustellen, aber die SYN von A gelangt zu B, bevor die SYN von B zu A gelangt.

Meine Antwort ist, dass A SYN ACK gesendet und die SYN von B ignoriert hat. Bin ich richtig?

orange
quelle
1
Nein. Zwei Verbindungen werden hergestellt, und es liegt an Ihrer App, dies zu erkennen und zu entscheiden, ob eine Verbindung getrennt werden muss.
Sven
@Sven Also gibt es kein Protokoll, das von RFC angegeben wird?
orange
5
Was? Denken Sie darüber nach: Host A versucht, SSH an Host B zu senden und umgekehrt. Warum sollte eine der Verbindungen nicht hergestellt werden? Sie sind völlig unabhängig.
Sven
SvW ist korrekt, die Verbindungen sind unabhängig. Solange nichts den Verbindungsaufbau behindert, ist beides der Fall. Die Bestellung ist aufgrund der angegebenen Informationen unbestimmt. Die Reihenfolge ist auch weitgehend irrelevant, es sei denn, die Anwendungen, die die Verbindungen an jedem Ende initiieren und empfangen, interagieren auf eine Weise, die eine gewisse Relevanz für die Verbindungsreihenfolge hätte.
Chris S
1
@psusi - nein, irgendwie nein. So kann ich eine SSH-Sitzung von Komp. A nach Komp. B und dann von Komp. B nach Komp. A aufbauen. Beide können sich über Port 22 befinden. Beachten Sie, dass Port 22 der DESTINATION-Port ist. Die SOURCE-Ports auf beiden Seiten unterscheiden sich - es handelt sich also weiterhin um zwei autonome Verbindungen, die dieselben Zielports verwenden, und es treten keine Konflikte auf. Ich kann sogar zwei SSH-Verbindungen von Comp A nach Comp B herstellen, wobei beide Port 22 als DESTINATION-Port verwenden, und es wird weiterhin einwandfrei funktionieren, aber beide Verbindungen werden weiterhin unterschiedliche SOURCE-Ports haben.
MaQleod

Antworten:

1

Es würden zwei Verbindungen hergestellt. TCP ist in dieser Weise nicht zustandsbewusst - keine Verbindung hätte ein Konzept für die andere Verbindung.

Zum Beispiel:

Connection 1:
192.168.1.5 sends SYN to 192.168.1.6 on port 80.

Connection 2:
192.168.1.6 sends SYN to 192.168.1.5 on port 80.

Damit dies fortgesetzt werden kann, benötigen beide einen Überwachungsdienst auf Port 80, sodass jeder einen Überwachungsdienst auf TCP für Port 80 hat und dieser Dienst die SYN empfängt und mit einem SYN-ACK antwortet:

Connection 1:
192.167.1.6 responds with SYN-ACK to 192.168.1.5 on port 80

Connection 2:
192.167.1.5 responds with SYN-ACK to 192.168.1.6 on port 80

Denken Sie daran, dass diese Abhördienste auf entgegengesetzten Computern ausgeführt werden. Es ist nicht zu erkennen, dass der andere Computer ebenfalls eine SYN-Bestätigung erhalten hat. Sie sollten daher keine SYN-Bestätigung senden.

Wie das TCP-Protokoll vorschreibt, antwortet die Ursprungsseite, sobald sie die SYN-ACK empfängt, wie folgt:

Connection 1:
192.168.1.5 sends ACK to 192.168.1.6 on port 80.

Connection 2:
192.168.1.6 sends ACK to 192.168.1.5 on port 80.

Sie haben jetzt zwei unabhängige Verbindungen mit abgeschlossenen TCP-Handshakes. Wie in den Kommentaren von SvW erwähnt: Wenn dies eine schlechte Sache ist, muss die jeweilige Anwendung die Verbindungen initiieren, um festzustellen, ob dieser Zustand vorliegt, und um herauszufinden, welche Verbindung abgebrochen werden muss - dieser Teil ist nicht die Aufgabe von TCP.

MaQleod
quelle
2

Denken Sie daran, dass ein TCP-Socket ein Quadruplet srcHost: srcPort: dstHost: dstPort ist und dass ein Host einen bestimmten Port überwachen muss, damit eine Verbindung hergestellt werden kann.

Für die erste Verbindung lautet der Socket A: portA: B: portB (B hört auf portB):

  • im SYN_SENT-Zustand auf A
  • im Zustand SYN_RECEIVED auf B

Und für die zweite Verbindung A: portA ': B: portB' (A hört auf portA ')

  • in SYN_SENT auf B
  • im Zustand LISTEN auf A
Xavier Lucas
quelle
Hat es Ihnen etwas ausgemacht, die vollständige Antwort auf meine Frage zu posten? Wie ich verstehe, gibt es 2 Verbindungen richtig? In welcher Reihenfolge kommen die Nachrichten an? Vielen Dank! :)
orange
1
Dies ist eigentlich die vollständige Antwort auf Ihre Frage. Die beiden Verbindungen haben nichts miteinander zu tun, denn wenn Sie ein SYN-Paket senden, muss sich die andere Seite im Status LISTEN befinden, damit die Verbindung hergestellt werden kann. Ports sind also notwendigerweise unterschiedlich.
Xavier Lucas
1

Unter der Annahme, dass beide Hosts dasselbe Portpaar verwenden, wird eine Verbindung hergestellt. In der Praxis ist dies nicht der Fall, da Hosts beim Herstellen einer Verbindung einen zufälligen lokalen Port und einen bekannten Remote-Port verwenden, sodass nicht beide Hosts dasselbe Portpaar verwenden würden. Selbst wenn dies der Fall wäre, müsste das Timing genau richtig sein, damit sich die SYNs im Flug überholen. Wenn ein Host die SYN erhält, bevor er seine eigene sendet, antwortet er mit einer RST.

psusi
quelle