TCP 시퀀스 번호

TCP 시퀀스 번호

동일한 시퀀스 번호의 두 세그먼트가 목적지에 도착하면 어떤 세그먼트가 승인되는지 알고 싶습니다.

예를 들어:

클라이언트는 서버에 패킷을 보내고 승인을 기다립니다. 그러나 타임라인 내에서 ack(일부 네트워크 문제로 인해 이 세그먼트가 서버에 도달하는 데 시간이 걸림)를 수신하지 못하여 동일한 세그먼트를 다시 보내기 시작합니다. 이제 서버 측에서 두 패킷이 동시에 도달하면 어떻게 될까요?

답변1

하나의 패킷이 중복으로 표시되어 폐기됩니다. 동일하기 때문에 어느 쪽인지는 중요하지 않습니다. 보다https://stackoverflow.com/questions/12871760/packet-loss-and-packet-duplication

답변2

두 세그먼트가 동시에 도착한다는 전제는 의미가 없습니다. 하나는 항상 다른 것보다 먼저 도착합니다. 그러나 다음 데이터가 도착하기 전에 해당 데이터가 애플리케이션에 전달되지 않았을 수 있습니다.

에 따르면RFC 793첫 번째 세그먼트의 데이터가 사용됩니다.

세그먼트는 순서대로 처리됩니다. 도착 시 초기 테스트는 오래된 중복 항목을 삭제하는 데 사용되지만 추가 처리는 SEG.SEQ 순서로 수행됩니다. 세그먼트의 내용이 이전 부분과 새 부분 사이의 경계에 걸쳐 있는 경우 새 부분만 처리해야 합니다.

즉, 실제로 구현이 다르게 동작하는 것을 상상하는 것은 어렵지 않습니다. 특히 부분적으로 겹치는 세그먼트는 매우 흥미로울 수 있습니다.

답변3

기본적으로 먼저 처리된 항목이 허용되고 후속 중복 항목은 삭제됩니다.

에서https://www.rfc-editor.org/rfc/rfc793.txt

...먼저 시퀀스 번호를 확인하세요.

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

관련 정보