Explicação do aperto de mão de três via TCP/IP

Este artigo discute o processo de aperto de mão de três vias do Protocolo de Controle de Transmissão (TCP) entre um cliente e um servidor ao iniciar ou encerrar uma conexão TCP.

Aplica-se a: Windows Server 2012 R2
Número de KB original: 172983

Resumo

Este artigo destina-se a públicos familiarizados com o Protocolo de Controle de Transmissão/Protocolo de Internet (TCP/IP). Ele discute o processo do aperto de mão de três vias TCP entre um cliente e um servidor ao iniciar ou encerrar uma conexão TCP.

Mais informações

O nível TCP do protocolo de transporte TCP/IP é orientado para conexão. Orientado para a conexão significa que, antes que qualquer dado possa ser transmitido, uma conexão confiável deve ser obtida e reconhecida. Transmissões de dados de nível TCP, estabelecimento de conexão e terminação de conexão mantêm parâmetros de controle específicos que regem todo o processo. Os bits de controle são listados da seguinte maneira:

URG: campo Ponteiro Urgente significativo
ACK: Campo de reconhecimento significativo
PSH: Função Push
RST: Redefinir a conexão
SYN: sincronizar números de sequência
FIN: Não há mais dados do remetente

Há dois cenários em que um aperto de mão de três vias ocorrerá:

  • Estabelecer uma conexão (uma abertura ativa)

  • Terminando uma conexão (um fechamento ativo)

As informações de exemplo a seguir foram obtidas de uma captura do Monitor de Rede. O Monitor de Rede é um analisador de protocolo que pode ser obtido do Microsoft Systems Management Server.

Estabelecer uma conexão

A sequência a seguir mostra o processo de uma conexão TCP sendo estabelecida:

Quadro 1:

Como você vê no primeiro quadro, o cliente, NTW3, envia um segmento SYN (TCP ....S.). É uma solicitação para o servidor sincronizar os números da sequência. Ele especifica seu número de sequência inicial (ISN). O ISN é incrementado por 1 (8221821+1=8221822) e é enviado para o servidor. Para iniciar uma conexão, o cliente e o servidor devem sincronizar os números de sequência um do outro. Há também uma opção para que o MSS (Tamanho Máximo do Segmento) seja definido, que é definido pelo comprimento (len: 4). Essa opção comunica o MSS que o remetente deseja receber. O campo Reconhecimento (ack: 0) está definido como zero porque é a primeira parte do aperto de mão de três vias.


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

Quadro 2:

Como você vê no segundo quadro, o servidor, BDC3, envia um segmento ACK e SYN (TCP .A..S.). Neste segmento, o servidor está reconhecendo a solicitação do cliente para sincronização. Enquanto isso, o servidor também está enviando sua solicitação ao cliente para sincronização de seus números de sequência. Há uma grande diferença neste segmento. O servidor transmite um número de reconhecimento (8221823) para o cliente. O reconhecimento é apenas uma prova para o cliente de que o ACK é específico para o SYN iniciado pelo cliente. O processo de reconhecimento da solicitação do cliente permite que o servidor incremente o número de sequência do cliente por um e o usa como seu número de reconhecimento.


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

Quadro 3:

Como você vê no terceiro quadro, o cliente envia um segmento ACK (TCP .A....). Neste segmento, o cliente está reconhecendo a solicitação do servidor para sincronização. O cliente usa o mesmo algoritmo que o servidor implementado no fornecimento de um número de reconhecimento. O reconhecimento do cliente da solicitação de sincronização do servidor conclui o processo de estabelecimento de uma conexão confiável e o aperto de mão de três vias.


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

Terminando uma conexão

Embora o aperto de mão de três vias exija apenas três pacotes para serem transmitidos por nossa mídia em rede, o término dessa conexão confiável precisa transmitir quatro pacotes. Como uma conexão TCP é totalmente duplex (os dados podem fluir em cada direção independentemente da outra), cada direção deve ser encerrada independentemente.

Quadro 4:

Nesta sessão de quadros, você verá o cliente enviando um FIN acompanhado de um ACK (TCP .A...F). Esse segmento tem duas funções básicas. Primeiro, quando o parâmetro FIN for definido, ele informará ao servidor que ele não tem mais dados a serem enviados. Em segundo lugar, o ACK é essencial para identificar a conexão específica que eles estabeleceram.


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

Quadro 5:

Neste quadro, você não vê nada especial, exceto para o servidor que reconhece a FIN que foi transmitida do cliente.


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

Quadro 6:

Depois de receber o FIN do computador cliente, o servidor será ACK. Embora o TCP tenha estabelecido conexões entre os dois computadores, as conexões ainda são independentes umas das outras. Portanto, o servidor também deve transmitir uma FIN (TCP .A...F) para o cliente.


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

Quadro 7:

O cliente responde no mesmo formato que o servidor, acKing do FIN do servidor e incrementando o número da sequência em 1.


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

O cliente ACKing da notificação FIN do servidor identifica um fechamento gracioso de uma conexão TCP.

Referências

Obtenha RFC 793.

Os RFCs podem ser obtidos pela Internet da seguinte maneira:

Cópias em papel de todos os RFCs estão disponíveis na NIC, individualmente ou em uma assinatura (para obter mais informações).NIC@NIC.DDN.MIL As cópias online estão disponíveis por meio de FTP ou Kermit de NIC.DDN.MIL como rfc/rfc####.txt ou rfc/rfc####.PS (##### é o número RFC sem zeros principais).