O que acontece quando 2 hosts simultâneos estabelecem uma conexão em um handshake de 3 vias

-1

Digamos que dois hosts, A e B, tentam iniciar uma conexão entre si, mas o SYN de A chega a B antes que o SYN de B chegue em A.

Minha resposta é que A enviaria SYN ACK e ignoraria o SYN de B. Estou correto?

    
por orange 01.01.2015 / 16:07

3 respostas

1

Duas conexões seriam feitas. O TCP não está ciente do estado dessa maneira - nenhuma conexão teria qualquer conceito da outra conexão.

Por exemplo:

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.

Para que isso continue, ambos precisariam de um serviço de escuta na porta 80, então cada um teria algo escutando no TCP para a porta 80 e esse serviço receberia o SYN e responderia com um SYN-ACK:

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

Tenha em mente que esses serviços de escuta estão em máquinas opostas - não há como saber que o outro também recebeu um SYN, então não há razão para eles não enviarem um SYN-ACK.

Como o protocolo TCP determina, uma vez que o lado de origem recebe o SYN-ACK, ele responderá:

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.

Agora você tem duas conexões independentes com handshakes TCP completos. Como mencionado nos comentários de SvW: se isso é ruim, cabe a qualquer aplicativo iniciar as conexões para determinar se esse estado estava presente e descobrir qual conexão quebrar - essa parte não é o trabalho do TCP.

    
por 01.01.2015 / 22:20
2

Lembre-se de que um soquete TCP é um srcHost quádruplo: srcPort: dstHost: dstPort e que para uma conexão ser estabelecida, um host deve escutar em uma porta específica.

Portanto, para a primeira conexão, o soquete A: portA: B: portB será (B ouve na portB):

  • no estado SYN_SENT em A
  • no estado SYN_RECEIVED em B

E para a segunda conexão, A: portA ': B: portB' (escuta no portA ')

  • em SYN_SENT em B
  • no estado LISTEN em A
por 01.01.2015 / 17:17
1

Supondo que ambos os hosts usem o mesmo par de portas, uma conexão seria estabelecida. Na prática, isso não acontece, porque quando os hosts estabelecem uma conexão, eles usam uma porta local aleatória e uma porta remota bem conhecida, portanto, os dois hosts não usam o mesmo par de portas. Então, mesmo se o fizessem, o momento teria que ser o certo, de modo que os SYNs passassem um no outro em vôo. Se um host obtiver o SYN antes de enviar o seu próprio, ele responderá com um RST.

    
por 02.01.2015 / 04:29