동일한 시퀀스 번호의 두 세그먼트가 목적지에 도착하면 어떤 세그먼트가 승인되는지 알고 싶습니다.
예를 들어:
클라이언트는 서버에 패킷을 보내고 승인을 기다립니다. 그러나 타임라인 내에서 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...