Uitleg van de handshake in drie richtingen via TCP/IP

In dit artikel wordt het TCP-handshake-proces (Transmission Control Protocol) in drie richtingen besproken tussen een client en server bij het starten of beëindigen van een TCP-verbinding.

Van toepassing op: Windows Server 2012 R2
Origineel KB-nummer: 172983

Samenvatting

Dit artikel is bedoeld voor doelgroepen die bekend zijn met Transmission Control Protocol/Internet Protocol (TCP/IP). Het bespreekt het proces van de TCP-handshake in drie richtingen tussen een client en server bij het starten of beëindigen van een TCP-verbinding.

Meer informatie

Het TCP-niveau van het TCP/IP-transportprotocol is verbindingsgeoriënteerd. Verbindingsgeoriënteerd betekent dat, voordat gegevens kunnen worden verzonden, een betrouwbare verbinding moet worden verkregen en bevestigd. Gegevensoverdrachten op TCP-niveau, het tot stand brengen van de verbinding en het beëindigen van de verbinding behouden specifieke controleparameters die het hele proces bepalen. De besturingselementbits worden als volgt weergegeven:

URG: veld urgente aanwijzer significant
ACK: Bevestigingsveld significant
PSH: Push-functie
RST: de verbinding opnieuw instellen
SYN: volgnummers synchroniseren
FIN: Geen gegevens van afzender meer

Er zijn twee scenario's waarin een handshake in drie richtingen plaatsvindt:

  • Een verbinding tot stand brengen (een actieve open)

  • Een verbinding beëindigen (een actieve afsluiting)

De volgende voorbeeldinformatie is verkregen uit een network monitor-opname. Netwerkmonitor is een protocolanalyse die kan worden verkregen van Microsoft Systems Management Server.

Een verbinding tot stand brengen

In de volgende volgorde ziet u het proces van een TCP-verbinding die tot stand wordt gebracht:

Frame 1:

Zoals u in het eerste frame ziet, verzendt de client, NTW3, een SYN-segment (TCP ....S.). Het is een verzoek aan de server om de volgnummers te synchroniseren. Hiermee wordt het eerste volgnummer (ISN) opgegeven. De ISN wordt verhoogd met 1 (8221821+1=8221822) en wordt verzonden naar de server. Om een verbinding te starten, moeten de client en server elkaars volgnummers synchroniseren. Er is ook een optie om de maximale segmentgrootte (MSS) in te stellen, die wordt gedefinieerd door de lengte (lengte: 4). Met deze optie communiceert u de MSS die de afzender wil ontvangen. Het veld Bevestiging (ack: 0) is ingesteld op nul omdat dit het eerste deel van de handshake in drie richtingen is.


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:

Zoals u in het tweede frame ziet, verzendt de server, BDC3, een ACK- en SYN-segment (TCP .A..S.). In dit segment erkent de server de aanvraag van de client voor synchronisatie. Ondertussen verzendt de server ook de aanvraag naar de client voor synchronisatie van de volgnummers. Er is één belangrijk verschil in dit segment. De server verzendt een bevestigingsnummer (8221823) naar de client. De bevestiging is slechts een bewijs voor de client dat de ACK specifiek is voor de SYN die de client heeft geïnitieerd. Tijdens het bevestigen van de aanvraag van de client kan de server het volgnummer van de client met één verhogen en dit als bevestigingsnummer gebruiken.


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:

Zoals u in het derde frame ziet, verzendt de client een ACK-segment (TCP .A....). In dit segment erkent de client de aanvraag van de server voor synchronisatie. De client gebruikt hetzelfde algoritme dat de server heeft geïmplementeerd bij het verstrekken van een bevestigingsnummer. De bevestiging van de aanvraag van de server voor synchronisatie door de client voltooit het proces van het tot stand brengen van een betrouwbare verbinding en de handshake in drie richtingen.


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....

Een verbinding beëindigen

Hoewel voor de handshake in drie richtingen slechts drie pakketten via onze netwerkmedia moeten worden verzonden, moet de beëindiging van deze betrouwbare verbinding vier pakketten verzenden. Omdat een TCP-verbinding full-duplex is (gegevens kunnen in elke richting onafhankelijk van elkaar stromen), moet elke richting onafhankelijk worden beëindigd.

Frame 4:

In deze sessie met frames ziet u dat de client een FIN verzendt die vergezeld gaat van een ACK (TCP .A...F). Dit segment heeft twee basisfuncties. Ten eerste, wanneer de FIN-parameter is ingesteld, wordt de server geïnformeerd dat deze geen gegevens meer heeft om te verzenden. Ten tweede is de ACK essentieel bij het identificeren van de specifieke verbinding die ze tot stand hebben gebracht.


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 dit frame ziet u niets bijzonders, behalve dat de server de FIN erkent die is verzonden vanaf de client.


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:

Na ontvangst van de FIN van de clientcomputer, zal de server ACK. Hoewel TCP verbindingen tot stand heeft gebracht tussen de twee computers, zijn de verbindingen nog steeds onafhankelijk van elkaar. De server moet dus ook een FIN (TCP .A...F) verzenden naar de client.


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:

De client reageert in dezelfde indeling als de server, door de FIN van de server te acken en het volgnummer met 1 te verhogen.


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..

De client die de FIN-melding van de server ackingt, identificeert een probleemloos sluiten van een TCP-verbinding.

Verwijzingen

VERKRIJG RFC 793.

RFC's kunnen als volgt via internet worden verkregen:

Papieren kopieën van alle RFC's zijn beschikbaar via de NIC, afzonderlijk of op abonnementsbasis (neem voor meer informatie contact op met NIC@NIC.DDN.MIL). Onlinekopieën zijn beschikbaar via FTP of Kermit van NIC.DDN.MIL als rfc/rfc#####.txt of rfc/rfc####.PS (#### is het RFC-getal zonder voorloopnullen).