Erläuterung des Drei-Wege-Handshakes über TCP/IP

In diesem Artikel wird der dreiseitige TCP-Handshakeprozess (Transmission Control Protocol) zwischen einem Client und einem Server beim Starten oder Beenden einer TCP-Verbindung erläutert.

Gilt für: Windows Server 2012 R2
Ursprüngliche KB-Nummer: 172983

Zusammenfassung

Dieser Artikel richtet sich an Zielgruppen, die mit TCP/IP (Transmission Control Protocol/Internet Protocol) vertraut sind. Es wird der Prozess des TCP-Drei-Wege-Handshakes zwischen einem Client und server beim Starten oder Beenden einer TCP-Verbindung erläutert.

Weitere Informationen

Die TCP-Ebene des TCP/IP-Transportprotokolls ist verbindungsorientiert. Verbindungsorientiert bedeutet, dass vor der Übertragung von Daten eine zuverlässige Verbindung hergestellt und bestätigt werden muss. Datenübertragungen auf TCP-Ebene, Verbindungsaufbau und Verbindungsbeendigung behalten bestimmte Steuerungsparameter bei, die den gesamten Prozess steuern. Die Steuerbits werden wie folgt aufgelistet:

URG: Dringendes Zeigerfeld signifikant
ACK: Bestätigungsfeld signifikant
PSH: Push-Funktion
RST: Zurücksetzen der Verbindung
SYN: Synchronisieren von Sequenznummern
FIN: Keine Weiteren Daten vom Absender

Es gibt zwei Szenarien, in denen ein Drei-Wege-Handshake stattfindet:

  • Herstellen einer Verbindung (aktiv geöffnet)

  • Beenden einer Verbindung (aktives Schließen)

Die folgenden Beispielinformationen wurden aus einer Netzwerkmonitorerfassung abgerufen. Network Monitor ist ein Protokollanalysetool, das von Microsoft Systems Management Server abgerufen werden kann.

Herstellen einer Verbindung

Die folgende Sequenz zeigt den Prozess, bei dem eine TCP-Verbindung hergestellt wird:

Frame 1:

Wie Sie im ersten Frame sehen, sendet der Client NTW3 ein SYN-Segment (TCP ....S.). Es handelt sich um eine Anforderung an den Server, die Sequenznummern zu synchronisieren. Es gibt seine anfängliche Sequenznummer (ISN) an. Die ISN wird um 1 erhöht (8221821+1=8221822) und an den Server gesendet. Um eine Verbindung zu starten, müssen Client und Server die Sequenznummern der jeweils anderen Synchronisieren. Es gibt auch eine Option zum Festlegen der maximalen Segmentgröße (Maximum Segment Size, MSS), die durch die Länge (len: 4) definiert wird. Diese Option kommuniziert den MSS, den der Absender empfangen möchte. Das Bestätigungsfeld (ack: 0) ist auf 0 festgelegt, da es der erste Teil des Drei-Wege-Handshakes ist.


1 2.0785 NTW3 --> BDC3 TCP ....S., len: 4, seq: 8221822-8221825, ack: 0,
win: 8192, src: 1037 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: ....S., len: 4, seq: 8221822-8221825, ack: 0, win: 8192, src: 1037
dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221822 (0x7D747E)
 TCP: Acknowledgement Number = 0 (0x0)
 TCP: Data Offset = 24 (0x18)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x02 : ....S.

TCP: ..0..... = No urgent data
 TCP: ...0.... = Acknowledgement field not significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......1. = Synchronize sequence numbers
 TCP: .......0 = No Fin

TCP: Window = 8192 (0x2000)
 TCP: Checksum = 0xF213
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Options

TCP: Option Kind (Maximum Segment Size) = 2 (0x2)
 TCP: Option Length = 4 (0x4)
 TCP: Option Value = 1460 (0x5B4)

TCP: Frame Padding

00000: 02 60 8C 9E 18 8B 02 60 8C 3B 85 C1 08 00 45 00 .`.....`.;....E.
00010: 00 2C 0D 01 40 00 80 06 E1 4B 83 6B 02 D6 83 6B .,..@....K.k...k
00020: 02 D3 04 0D 00 8B 00 7D 74 7E 00 00 00 00 60 02 .......}t~....`.
00030: 20 00 F2 13 00 00 02 04 05 B4 20 20 .........

Frame 2:

Wie Sie im zweiten Frame sehen, sendet der Server BDC3 ein ACK- und SYN-Segment (TCP .A..S.). In diesem Segment bestätigt der Server die Anforderung des Clients für die Synchronisierung. In der Zwischenzeit sendet der Server auch seine Anforderung zur Synchronisierung seiner Sequenznummern an den Client. Es gibt einen großen Unterschied in diesem Segment. Der Server überträgt eine Bestätigungsnummer (8221823) an den Client. Die Bestätigung ist nur der Beweis für den Client, dass der ACK spezifisch für das VOM Client initiierte SYN ist. Der Prozess der Bestätigung der Clientanforderung ermöglicht es dem Server, die Sequenznummer des Clients um eins zu erhöhen und als Bestätigungsnummer zu verwenden.


2 2.0786 BDC3 --> NTW3 TCP .A..S., len: 4, seq: 1109645-1109648, ack:
8221823, win: 8760, src: 139 (NBT Session) dst: 1037 BDC3 --> NTW3 IP

TCP: .A..S., len: 4, seq: 1109645-1109648, ack: 8221823, win: 8760,
src: 139 (NBT Session) dst: 1037

TCP: Source Port = NETBIOS Session Service
 TCP: Destination Port = 0x040D
 TCP: Sequence Number = 1109645 (0x10EE8D)
 TCP: Acknowledgement Number = 8221823 (0x7D747F)
 TCP: Data Offset = 24 (0x18)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x12 : .A..S.

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......1. = Synchronize sequence numbers
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x012D
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Options

TCP: Option Kind (Maximum Segment Size) = 2 (0x2)
 TCP: Option Length = 4 (0x4)
 TCP: Option Value = 1460 (0x5B4)

TCP: Frame Padding

00000: 02 60 8C 3B 85 C1 02 60 8C 9E 18 8B 08 00 45 00 .`.;...`......E.
00010: 00 2C 5B 00 40 00 80 06 93 4C 83 6B 02 D3 83 6B .,[.@....L.k...k
00020: 02 D6 00 8B 04 0D 00 10 EE 8D 00 7D 74 7F 60 12 ...........}t`.
00030: 22 38 01 2D 00 00 02 04 05 B4 20 20 "8.-......

Frame 3:

Wie Sie im dritten Frame sehen, sendet der Client ein ACK-Segment (TCP .A....). In diesem Segment bestätigt der Client die Anforderung vom Server für die Synchronisierung. Der Client verwendet denselben Algorithmus, den der Server bei der Bereitstellung einer Bestätigungsnummer implementiert hat. Die Bestätigung der Serveranforderung für die Synchronisierung durch den Client schließt den Prozess zum Herstellen einer zuverlässigen Verbindung und des Drei-Wege-Handshakes ab.


3 2.787 NTW3 --> BDC3 TCP .A...., len: 0, seq: 8221823-8221823, ack:
1109646, win: 8760, src: 1037 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: .A...., len: 0, seq: 8221823-8221823, ack: 1109646, win: 8760,
src: 1037 dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221823 (0x7D747F)
 TCP: Acknowledgement Number = 1109646 (0x10EE8E)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x18EA
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 02 60 8C 9E 18 8B 02 60 8C 3B 85 C1 08 00 45 00 .`.....`.;....E.
00010: 00 28 0E 01 40 00 80 06 E0 4F 83 6B 02 D6 83 6B .(..@....O.k...k
00020: 02 D3 04 0D 00 8B 00 7D 74 7F 00 10 EE 8E 50 10 .......}t....P.
00030: 22 38 18 EA 00 00 20 20 20 20 20 20 "8....

Beenden einer Verbindung

Obwohl der Drei-Wege-Handshake erfordert, dass nur drei Pakete über unsere Netzwerkmedien übertragen werden, muss die Beendigung dieser zuverlässigen Verbindung vier Pakete übertragen. Da eine TCP-Verbindung vollduplex ist (Daten können in jede Richtung unabhängig von der anderen fließen), muss jede Richtung unabhängig voneinander beendet werden.

Frame 4:

In dieser Sitzung von Frames sehen Sie, wie der Client ein FIN sendet, das von einem ACK (TCP .A...F) begleitet wird. Dieses Segment verfügt über zwei grundlegende Funktionen. Wenn der FIN-Parameter festgelegt ist, wird der Server zunächst darüber informiert, dass keine weiteren Daten zum Senden vorhanden sind. Zweitens ist die ACK für die Identifizierung der spezifischen Verbindung, die sie hergestellt haben, von entscheidender Bedeutung.


4 16.0279 NTW3 --> BDC3 TCP .A...F, len: 0, seq: 8221823-8221823,
ack:3462835714, win: 8760, src: 2337 dst: 139 (NBT Session) NTW3 --> BDC3
IP

TCP: .A...F, len: 0, seq: 8221823-8221823, ack: 1109646, win: 8760, src:
1037 dst: 139 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 8221823 (0x7D747F)
 TCP: Acknowledgement Number = 1109646 (0x10EE8E)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x11 : .A...F

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......1 = No more data from sender

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x236C
 TCP: Urgent Pointer = 0 (0x0)

00000: 00 20 AF 47 93 58 00 A0 C9 22 F5 39 08 00 45 00 . .G.X...".9..E.
00010: 00 28 9B F5 40 00 80 06 21 4A C0 5E DE 7B C0 5E .(..@...!J.^.{.^
00020: DE 57 09 21 05 48 0B 20 96 AC CE 66 AE 02 50 11 .W.!.H. ...f..P.
00030: 22 38 23 6C 00 00 "8#l..

Frame 5:

In diesem Rahmen sehen Sie nichts Besonderes außer dem Server, der die vom Client übertragene FIN bestätigt.


5 16.0281 BDC3 --> NTW3 TCP .A...., len: 0, seq: 1109646-1109646,
ack: 8221824, win:28672, src: 139 dst: 2337 (NBT Session) BDC3 --> NTW3
IP

TCP: .A...., len: 0, seq: 1109646-1109646, ack: 8221824, win:28672, src:
139 dst: 2337 (NBT Session)

TCP: Source Port = 0x040D
 TCP: Destination Port = NETBIOS Session Service
 TCP: Sequence Number = 1109646 (0x10EE8E)
 TCP: Acknowledgement Number = 8221824 (0x7D7480)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 28672 (0x7000)
 TCP: Checksum = 0xD5A3
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 00 A0 C9 22 F5 39 08 00 02 03 BA 84 08 00 45 00 ...".9........E.
00010: 00 28 D2 82 00 00 3F 06 6B BD C0 5E DE 57 C0 5E .(....?.k..^.W.^
00020: DE 7B 05 48 09 21 CE 66 AE 02 0B 20 96 AD 50 10 .{.H.!.f... ..P.
00030: 70 00 D5 A3 00 00 90 00 01 00 86 00 p...........

Frame 6:

Nachdem der Fin vom Clientcomputer empfangen wurde, wird der Server ACK. Obwohl TCP Verbindungen zwischen den beiden Computern hergestellt hat, sind die Verbindungen immer noch unabhängig voneinander. Der Server muss also auch eine FIN (TCP .A...F) an den Client übertragen.


6 17.0085 BDC3 --> NTW3 TCP .A...F, len: 0, seq: 1109646-1109646, ack:
8221824, win:28672, src: 139 dst: 2337 (NBT Session) BDC3 --> NTW3 IP

TCP: .A...F, len: 0, seq: 1109646-1109646, ack: 8221824, win:28672, src:
139 dst: 2337 (NBT Session)

TCP: Source Port = 0x0548
 TCP: Destination Port = 0x0921
 TCP: Sequence Number = 1109646 (0x10EE8E)
 TCP: Acknowledgement Number = 8221824 (0x7D7480)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x11 : .A...F

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......1 = No more data from sender

TCP: Window = 28672 (0x7000)
 TCP: Checksum = 0xD5A2
 TCP: Urgent Pointer = 0 (0x0)
 TCP: Frame Padding

00000: 00 A0 C9 22 F5 39 08 00 02 03 BA 84 08 00 45 00 ...".9........E.
00010: 00 28 D2 94 00 00 3F 06 6B AB C0 5E DE 57 C0 5E .(....?.k..^.W.^
00020: DE 7B 05 48 09 21 CE 66 AE 02 0B 20 96 AD 50 11 .{.H.!.f... ..P.
00030: 70 00 D5 A2 00 00 02 04 05 B4 86 00 p...........

Frame 7:

Der Client antwortet im gleichen Format wie der Server, indem er die FIN des Servers ackkingt und die Sequenznummer um 1 erhöht.


7 17.0085 NTW3 --> BDC3 TCP .A...., len: 0, seq: 8221824-8221824, ack:
1109647, win: 8760, src: 2337 dst: 139 (NBT Session) NTW3 --> BDC3 IP

TCP: .A...., len: 0, seq: 8221824-8221824, ack: 1109647, win: 8760, src:
2337 dst: 139 (NBT Session)

TCP: Source Port = 0x0921
 TCP: Destination Port = 0x0548
 TCP: Sequence Number = 8221824 (0x7D7480)
 TCP: Acknowledgement Number = 1109647 (0x10EE8F)
 TCP: Data Offset = 20 (0x14)
 TCP: Reserved = 0 (0x0000)
 TCP: Flags = 0x10 : .A....

TCP: ..0..... = No urgent data
 TCP: ...1.... = Acknowledgement field significant
 TCP: ....0... = No Push function
 TCP: .....0.. = No Reset
 TCP: ......0. = No Synchronize
 TCP: .......0 = No Fin

TCP: Window = 8760 (0x2238)
 TCP: Checksum = 0x236B
 TCP: Urgent Pointer = 0 (0x0)

00000: 00 20 AF 47 93 58 00 A0 C9 22 F5 39 08 00 45 00 . .G.X...".9..E.
00010: 00 28 BA F5 40 00 80 06 02 4A C0 5E DE 7B C0 5E .(..@....J.^.{.^
00020: DE 57 09 21 05 48 0B 20 96 AD CE 66 AE 03 50 10 .W.!.H. ...f..P.
00030: 22 38 23 6B 00 00 "8#k..

Die Client-ACKing der FIN-Benachrichtigung vom Server identifiziert eine ordnungsgemäße Schließung einer TCP-Verbindung.

References

Abrufen von RFC 793.

RFCs können wie folgt über das Internet bezogen werden:

Papierkopien aller RFCs sind bei der NIC erhältlich, entweder einzeln oder auf Abonnementbasis (für weitere Informationen wenden Sie sich an NIC@NIC.DDN.MIL). Onlinekopien sind über FTP oder Kermit aus NIC.DDN.MIL als rfc/rfc####.txt oder rfc/rfc####.PS verfügbar (#### ist die RFC-Nummer ohne führende Nullen).