Gostaria de saber se dois segmentos do mesmo número de sequência chegarem ao destino, qual segmento será aceito?
Por exemplo:
Um cliente envia um pacote para um servidor e aguarda uma confirmação. Mas ele não recebeu o ack (devido a algum problema de rede, esse segmento demora para chegar ao servidor) dentro da linha do tempo, então começa a enviar o mesmo segmento novamente. Agora, no lado do servidor, o que acontece se os dois pacotes chegarem ao mesmo tempo.
Responder1
Um pacote é marcado como duplicado e descartado. Como são idênticos, não importa qual seja. Verhttps://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication
Responder2
A premissa de que ambos os segmentos chegam ao mesmo tempo não faz sentido. Um sempre chegará antes do outro. Mas esses dados podem não ter sido entregues ao aplicativo antes da chegada do próximo.
De acordo comRFC 793os dados do primeiro segmento serão usados.
Os segmentos são processados em sequência. Os testes iniciais na chegada são usados para descartar duplicatas antigas, mas o processamento posterior é feito na ordem SEG.SEQ. Se o conteúdo de um segmento ultrapassar a fronteira entre o antigo e o novo, apenas as novas partes deverão ser processadas.
Dito isto, não é difícil imaginar implementações na realidade se comportando de maneira diferente. Em particular, segmentos parcialmente sobrepostos podem ser bastante interessantes.
Responder3
Basicamente, o que for processado primeiro será aceito, as duplicatas subsequentes serão descartadas.
Dehttps://www.rfc-editor.org/rfc/rfc793.txt
... primeiro verifique o número de sequência
SYN-RECEIVED STATE
ESTABLISHED STATE
FIN-WAIT-1 STATE
FIN-WAIT-2 STATE
CLOSE-WAIT STATE
CLOSING STATE
LAST-ACK STATE
TIME-WAIT STATE
Segments are processed in sequence. Initial tests on arrival
are used to discard old duplicates, but further processing is
done in SEG.SEQ order. If a segment's contents straddle the
boundary between old and new, only the new parts should be
processed.
There are four cases for the acceptability test for an incoming
segment:
Segment Receive Test
Length Window
------- ------- -------------------------------------------
0 0 SEG.SEQ = RCV.NXT
0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
>0 0 not acceptable
>0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND
or RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
If the RCV.WND is zero, no segments will be acceptable, but
special allowance should be made to accept valid ACKs, URGs and
RSTs.
If an incoming segment is not acceptable, an acknowledgment
should be sent in reply (unless the RST bit is set, if so drop
the segment and return):
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK>
After sending the acknowledgment, drop the unacceptable segment
and return...