Um handshake triplo é necessário porque os números de seqüência não são vinculados a um relógio global na rede e os protocolos TCP podem ter mecanismos diferentes para captar o ISN (Initial Sequence Number).
O receptor do primeiro SYN não tem meios para saber se este é um segmento antigo atrasado, a menos que tenha registrado o último número de seqüência usado na conexão. Nem sempre é possível lembrar esse número. Assim, o receptor deve pedir ao remetente que verifique esse SYN.
O host (A) inicia uma conexão enviando um pacote SYN para o host (B) indicando que o seu ISN = X: A —> B SYN, seq de A = X
B recebe o pacote, grava que a seq de A = X, responde com um ACK de X + 1, e indica que seu ISN = Y. O ACK de X + 1 significa que o host B já recebeu todos os bytes até ao byte X e que o próximo byte esperado é o X + 1: B —> A ACK, seq de A = X, SYN seq de B = Y, ACK = X + 1
A recebe o pacote de B, fica sabendo que a sequência de B = Y, e responde com um ACK de Y + 1, que finaliza o processo de estabelecimento da conexão: A —> B ACK, seq de B = Y, ACK = Y + 1
fonte: https://pt.wikipedia.org/wiki/Handshake