본문 바로가기
CS/컴퓨터네트워크

[하향식 접근 8판] Chapter 3 트랜스포트 계층 (3.4.3 GBN, 3.4.4 SR)

by dingwoon 2024. 11. 8.

※"컴퓨터 네트워킹 하향식 접근 8판" 책을 간단하게 정리한 내용의 글입니다.※

전송 후 대기(stop-and-wait)인 rdt1.0~3.0과 달리 파이프라이닝 방식은 수신자의 ACK를 받지 않아도 다음 데이터를 전송하는 방식이다.
여기서는 파이프라인 오류 회복의 두 가지 기본적인 접근 방법으로 GBN(Go-Back-N, N부터 반복)SR(Selective Repeat, 선택적 반복)이 있다.

3.4.3 GBN

GBN은 송신자는 확인응답을 기다리지 않고 여러 패킷을 전송할 수 있다. 하지만 파이프라인에서 확인응답이 안 된 패킷의 최대 허용 수 N보다 크지 말아야 한다.


위의 그림을 보면 확인 응답이 끝난 패킷, 송신 됐지만 확인 응답이 되지 않은 패킷, 상위 계층에서 데이터가 오면 바로 전송될 수 있는 패킷, 파이프라인에서 확인 응답이 안 된 패킷의 확인 응답이 도착할 때까지 사용될 수 없는 패킷, 이렇게 총 4가지로 패킷을 나눌 수 있다.

확인 응답이 되지 안 된 패킷의 최대 허용 수는 N개이다. 이 N을 윈도 크기(window size)라고 하고, 이 윈도(window)는 오른쪽으로 이동(slide)된다. 그래서 GBN 프로토콜은 슬라이딩 윈도 프로토콜(sliding-sindow protocol)이라고 부른다. (이를 N으로 제한하는 이유는 이후 3.5절과 3.7절에서 배운다.)

패킷의 순서 번호는 패킷 헤더안에 있는 고정된 길이 필드로 나타낸다. 해당 필드가 k비트이면 순서 번호의 범위는 [0, 2k - 1]가 된다. 순서 번호 연산은 모듈로 2k 연산을 이용하고, 2k - 1 다음은 0이 된다.

  • GBN에서 송신자의 행동

    • 상위로부터 호출 시
      rdt_send()가 상위로부터 호출됐을때, 송신자는 윈도가 가득 찼으면 데이터를 버퍼링하거나 상위 계층으로 데이터를 반환한다. 가득차지 않았다면 즉시 패킷이 생성되고 송신된다.
    • ACK 수신 시
      GBN에서 ACK는 누적 확인응답이다. 순서 번호 n에 대한 ACK이면, 순서 번호 n과 그 이전의 순서 번호를 가진 모든 패킷에 대한 확인 응답인 것이다.
    • 타임아웃 발생 시
      타임아웃 발생 시에 송신자는 송신했지만 확인 응답을 받지 못한 모든 패킷을 재전송한다. GBN은 누적 확인응답이기 때문에 송신했지만 확인 응답을 받지 못한 첫 번째 패킷보다 앞쪽의 모든 패킷은 확인 응답을 받은 것이고, 그 뒤쪽의 패킷은 확인 응답을 받지 못한 것이다.
  • GBN에서 수신자의 행동
    마지막으로 올바르게 수신해서 상위 계층으로 데이터를 전달한 패킷의 순서 번호가 n - 1이라면, 순서 번호 n인 패킷이 올바르게 수신된 경우에만 순서 번호 n에 대한 ACK를 반환하고 상위 계층에 데이터를 전달한다. 그 외의 경우는 패킷을 버리고 가장 마지막으로 제대로 수신되고 상위 계층으로 데이터를 전달한 패킷의 순서 번호에 대한 ACK를 반환한다.

    즉, 어떤 패킷의 데이터가 상위 계층에 전달됐다면, 그 이전의 모든 순서 번호의 패킷은 정상적으로 수신되어서 상위 계층으로 전달된 것이다.
    수신자는 이렇게 함으로써 순서가 잘못된 패킷을 버퍼링 할 필요 없이 다음 순서 패킷의 순서 번호만 알면 된다.

이런 이벤트 기반 프로그래밍(event-based programming)에서 다양한 프로시저들은 프로토콜 스택에서 다른 프로시저에 의해 야기되거나 인터럽트의 결과로 요청될 것이다. 송신자에서는 (1) rdt_send()를 호출하기 위한 상위 계층 개체로부터의 호출, (2) 타이머 인터럽트, (3) 패킷이 도착했을 때 rdt_rcv()를 호출하기 위한 하위 계층으로부터의 호출이다.

3.4.4 SR

SR(Selective Repeat, 선택적 반복)은 이름에서 알 수 있듯이 모두 재전송하지 않는다. SR은 수신자가 오류가 발생한 패킷을 수신했다고 의심되는 패킷에 대해서만 다시 전송해서 불필요한 재전송을 피한다.


GBN과 마찬가지로 SR에서도 window size N은 파이프라인에서 아직 확인응답이 안 된 패킷 수를 제한하는 데 사용된다. 하지만 GBN과 달리 SR은 윈도(window)안에 ACK를 받은 패킷이 있을 수 있다.
수신 측에서는 이전 순서 번호에서 정상적인 패킷을 수신하지 못했어도 이후에 정상적으로 도착한 패킷을 버퍼에 저장한다.
그리고 이전 순서 번호가 정상적으로 수신됐을 때, 해당 패킷에 대해 ACK를 보내고 그 패킷의 데이터와 버퍼에 저장된 패킷 데이터들을 상위 계층으로 전달한다.

SR 프로토콜 뿐만 아니라 다른 많은 프로토콜에서 송신자와 수신자의 수신 상태에 대한 관점이 항상 같지 않다. 송신자와 수신자의 윈도는 다를 수 있다는 말이다.
그렇기 때문에 SR에서 수신자가 이미 받고 ACK응답도 보낸 패킷을 다시 수신하더라도 다시 해당 패킷에 대한 ACK를 반환해줘야 한다. 그렇지 않으면 송신자는 해당 패킷을 계속 다시 보낼 것이다.

윈도우 사이즈


위 그림은 패킷 헤더의 순서 번호 필드 비트가 2여서 순서 번호 0, 1, 2, 3이고, 윈도 사이즈가 3인 경우에 일어날 수 있는 경우를 나타낸 것이다.
(a)에서 0, 1, 2 패킷에 대한 ACK가 모두 손실되고 그다음 0번 패킷이 재전송되어 수신 측에 도착한다.
(b)의 경우에서는 새로운 0번 패킷이 수신 측에 도착한다.
수신자는 송신자의 행동을 볼 수 없으므로 수신자 입장에서는 (a)의 경우와 (b)의 경우가 같은 것이다. 수신자는 (a)의 경우와 (b)의 경우를 구별할 수 없다. 0번 패킷이 재전송된 패킷인지 새로운 패킷인지 알 수 없다.
그래서 윈도 크기는 SR 프로토콜에 대한 순서 번호 공간의 크기의 절반보다 작거나 같아야 한다.

실제 네트워크는 하나의 선으로 연결되 것이 아니기 때문에 패킷의 순서가 바뀔 수 있고, 패킷들이 임의로 온다고 간주할 수 있다. 그렇기 때문에 송신자는 동일한 패킷의 순서 번호가 네트워크 상에 존재하지 않을 때 해당 순서 번호를 다시 사용해야 한다. 그래서 실제로는 TCP에서 각 패킷은 대략 3분의 최대 패킷 수명을 가지고 있다고 가정하고 네트워크 상에 동일한 순서 번호를 가진 패킷이 없다고 확신할 때까지 순서 번호를 재사용하지 않는다.