Divide el apretón de manos en lo que realmente está haciendo.
En TCP, las dos partes realizan un seguimiento de lo que han enviado utilizando un número de secuencia. Efectivamente, termina siendo un recuento de bytes en ejecución de todo lo que se envió. La parte receptora puede usar el número de secuencia del hablante opuesto para reconocer lo que ha recibido.
Pero el número de secuencia no comienza en 0. Comienza en el ISN (Número de secuencia inicial), que es un valor elegido al azar. Y dado que TCP es una comunicación bidireccional, ambas partes pueden "hablar" y, por lo tanto, ambas deben generar aleatoriamente un ISN como su Número de secuencia inicial. Lo que a su vez significa que ambas partes deben notificar a la otra parte de su ISN inicial.
Entonces terminas con esta secuencia de eventos para comenzar una conversación TCP entre Alice y Bob:
Alice ---> Bob SYNchronize with my Initial Sequence Number of X
Alice <--- Bob I received your syn, I ACKnowledge that I am ready for [X+1]
Alice <--- Bob SYNchronize with my Initial Sequence Number of Y
Alice ---> Bob I received your syn, I ACKnowledge that I am ready for [Y+1]
Observe que están ocurriendo cuatro eventos:
- Alice elige un ISN y lo SINCRONIZA con Bob.
- Bob AC conoce al ISN.
- Bob elige un ISN y lo SINCRONIZA con Alice.
- Alice AC conoce al ISN.
Sin embargo, en realidad, los dos eventos intermedios (# 2 y # 3) ocurren en el mismo paquete. Lo que hace que un paquete sea un SYN
o ACK
simplemente un indicador binario activado o desactivado dentro de cada encabezado TCP , por lo que no hay nada que impida que ambos indicadores se habiliten en el mismo paquete. Entonces el apretón de manos de tres vías termina siendo:
Bob <--- Alice SYN
Bob ---> Alice SYN ACK
Bob <--- Alice ACK
Observe las dos instancias de "SYN" y "ACK", una de cada una, en ambas direcciones.
Entonces, para volver a su pregunta, ¿por qué no usar un apretón de manos de dos vías? La respuesta corta es porque un apretón de manos de dos vías solo permitiría que una parte establezca un ISN y la otra parte lo reconozca. Lo que significa que solo una parte puede enviar datos.
Pero TCP es un protocolo de comunicación bidireccional, lo que significa que cualquiera de los extremos debería poder enviar datos de manera confiable. Ambas partes deben establecer un ISN, y ambas partes deben reconocer el ISN de la otra.
En efecto, lo que tiene es exactamente su descripción del apretón de manos de dos vías, pero en cada dirección . Por lo tanto, se producen cuatro eventos. Y nuevamente, las dos banderas del medio ocurren en el mismo paquete. Como tales tres paquetes están involucrados en un proceso de inicio de conexión TCP completo.