Perda de pacote durante handshake de 3 vias
Pergunta
Preciso realizar um handshake de 3 vias de parada e espera entre aplicativos cliente e servidor escritos em c ++ (com winsock 2) para uma atribuição. O cliente envia um SYN. O servidor incrementa o número de sequência do cliente e envia um SYN-ACK. O cliente incrementa o número de sequência do servidor e envia um ACK.
Para simular a perda de pacotes, o cliente e o servidor são conectados a um programa roteador intermediário que ocasionalmente não encaminha pacotes, causando perda. Como devo estruturar minhas declarações sendto (), select (), recvfrom () para contabilizar a possível perda de pacotes?
Por exemplo, se o SYN for perdido e o cliente expirar, reenvie-o. Se o SYN-ACK for perdido, o cliente expira e reenvia o SYN. Não tenho ideia do que fazer se o ACK for perdido.
Editar: basicamente funciona assim no meu cliente:
- Envie SYN.
- Loop enquanto a instrução select () falha e reenviar SYN
- Receba SYN-ACK
- Enviar ACK
- Loop para possivelmente receber novamente SYN-ACK se ACK foi perdido.
Como sei quando parar o loop?
Solução
select
pode ser usado para verificar quando um soquete pode ser lido sem bloqueio.
Para verificar a qual pacote enviado o ACK pertence, você verifica o número de sequência.
Se você não receber um ACK dentro do tempo limite, basta reenviar o último pacote.Não importa o tipo de pacote enviado, se você não receber um ACK, deve reenviá-lo.