Número de sequência TCP

Número de sequência TCP

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...

informação relacionada