패킷 재정렬과 혼동

Aug 15 2020

저는 TCP 프로토콜 "선택적 반복"에 대한 교과서를 읽고있었습니다.

송신자와 수신자 사이의 채널 내에서 패킷을 재정렬 할 수 없다고 가정했습니다. 이것은 일반적으로 송신자와 수신자가 단일 물리적 와이어로 연결되어있을 때 합리적인 가정입니다. 그러나 둘을 연결하는 "채널"이 네트워크 인 경우 패킷 재정렬이 발생할 수 있습니다. 실제로 취해진 접근 방식은 전송자가 시퀀스 번호 x를 사용하여 이전에 전송 된 패킷이 더 이상 네트워크에 없다는 것을 "확신"할 때까지 시퀀스 번호가 재사용되지 않도록하는 것입니다. 이는 패킷이 고정 된 최대 시간보다 더 오랫동안 네트워크에서 "살아있을"수 없다고 가정하여 수행됩니다.

나는 혼란스럽고 아래에 두 가지 질문이 있습니다.

Q1- 무엇이 "채널은 본질적으로 패킷을 버퍼링하고 미래의 어느 시점에서든 이러한 패킷을 자발적으로 방출하는 것으로 생각할 수 있습니다." 평균? 왜 오래된 패킷을 버퍼링해야합니까? 수신자가 무시하는 것이 더 낫지 않습니까?

Q2- 창 크기가 2이고 사용 가능한 시퀀스 번호가 0,1,2,3이라고 가정 해 보겠습니다. 발신자는 먼저 패킷 0, 패킷 1을 보내고, 패킷 0은 어떻게 든 쳐서 도착하는데 많은 시간이 걸리므로 시간 초과가 발생하여 발신자는 패킷 0을 다시 보내야하지만 이번에는 패킷 0 (신규)이 정시에 도착합니다. 그런 다음 발신자는 수신자가 수신 한 패킷 2, 패킷 3을 보냅니다. 그리고 송신자는 패킷 0 (신규), 패킷 1 (신규)을 보내려고하는데 기존 패킷 0이 지금 수신자에게 도착하므로 수신은이 패킷이 이전 패킷인지 새로운 패킷인지 알 수 없습니다. 그렇다면 "패킷이 고정 된 최대 시간보다 더 오래 네트워크에서"살아있을 "수 없다고 가정"하면 어떻게이 문제를 해결할 수 있습니까? 패킷 헤더에 전송 된 시간이 포함되어 있다는 의미입니까?

답변

2 Zac67 Aug 16 2020 at 07:31

"채널은 본질적으로 패킷을 버퍼링하고 미래의 어느 시점에서든 이러한 패킷을 자발적으로 방출하는 것으로 생각할 수 있습니다." 평균? 왜 오래된 패킷을 버퍼링해야합니까? 수신자가 무시하는 것이 더 낫지 않습니까?

이것이 패킷 스위칭의 필수 부분 인 큐잉 및 버퍼링의 특성입니다. 수신 된 패킷은 수신시 큐 / 버퍼링되고 전달되면 큐에서 삭제됩니다. 그렇지 않으면 패킷이 수신 될 때마다 송신 링크가 항상 비어 있어야하므로 버퍼링이 필요합니다. 이는 패킷 교환 네트워크에서는 불가능하며 회로 교환 네트워크에서만 가능합니다.

창 크기가 2이고 사용 가능한 시퀀스 번호가 0,1,2,3이라고 가정합니다.

창은 패킷 / 데이터 그램이 아니라 바이트 수를 계산 합니다 . 또한 시퀀스 번호는 32 비트 필드가 오버플로 될 때만 반복됩니다. 이는 4GiB의 데이터 이후에만 발생합니다. 그러나이 제한은 모호성을 피하기 위해 "비행 중"데이터가 4Gib를 초과 할 수 없음을 의미합니다. 가능한 가장 큰 창은 1GiB에 가깝기 때문에 문제가되지 않습니다.

단순 누적 ACK를 사용하면 이전 세그먼트가 여전히 누락 된 경우 수신기가 이후 세그먼트를 선택적으로 ACK 할 수 없습니다. ACK는 모든 이전 데이터가 수신되었음을 의미합니다 .

예를 들어, 세그먼트 크기가 1,000이고 창 크기가 10,000 인 경우 발신자는 데이터 그램 D00-D09 (시퀀스 0-9,999)를 보냅니다. D00 및 D02-D09가 수신되었지만 D01이 손실되었습니다. 수신자는 여전히 1,000 (다음 예상 데이터 시퀀스)을 ACK하여 발신자가 D0을 창 밖으로 이동하고 1,000-10,999로 이동 한 다음 D10을 전송하도록합니다.

한편 수신기는 문제가 있다고 결정 했으므로 다시 1,000 을 ACK 하여 신호를 보냅니다. 발신자는 이중 ACK를 수신하고 D01 (거부 모드) 또는 D01 (공격 모드)부터 시작하는 모든 데이터를 다시 보냅니다. 수신자는 이미 D10 (10,000-10,999)을 얻었으므로 11,000을 ACK하고 보낸 사람의 창을 11,000-20,999로 이동합니다 (공격 모드의 경우 여전히 미해결 재전송을 중단 함).

(나는 프로세스를 다소 단순화했으며 실제로는 더 많은 병렬 중첩이 있으며 물론 전송과 수신 사이의 지연이 있습니다.)

편집 : Jeff가 올바르게 지적했듯이 (thx!), 선택적 승인 (SACK)에 대한 지원은 오늘날 거의 주어졌습니다. 이 옵션을 사용하면 수신자는 즉시 2,000-9,999 (D02-D09에서)를 SACK 할 수 있으므로 발신자는 재전송을 시작하지 않습니다. 또한 11,000-20,999보다 일찍 전송을 시작할 수 있습니다.