개요

Go-Back-N 은 자동화된 신뢰도 있는 패킷의 전송을 위한 프로토콜 로써, 파이프 라인을 형성하는 일련의 패킷을 ACK 응답이 없어도 지속적으로 보내는 방식이다. N개의 슬라이딩 윈도우를 만들어서 패킷을 보내게 된다. 이는 N개의 패킷을 ACK 응답이 없어도 보낼 수 있게 해준다.

설명

수신자는 다음 현재 받는 올바른 패킷에 대한 ACK 응답만 보내게 된다. 또한 수신자는 순서가 올바르지 않은 패킷이나 손상된 패킷은 단순히 폐기하고 올바르게 수신번호를 맞추면서 도착한 패킷에 대한 응답만 보낸다. 송신자는 마지막 ACK응답부터 현재 보내는 패킷까지의 길이가 Nbit 가 되도록 계속해서 패킷을 보내게 된다.

GBN은 Stop-and-wait보다 더욱 시간적인 측면과 속도적인 측면에서 효과적인데, 그 이유는 보내는 패킷의 길이가 늘어나기 때문에 한번에 많은 정보 를 전송할 수 있는데서 기인한다. 다른 말로는, 보낸 패킷을 기다리는 시간을 보내는데 사용하기 때문에 남는 시간을 보다 효율적으로 사용한다는 것이다. 하지만 단순히 하나의 패킷의 실수로 전체 윈도우를 다시보내는 불상사가 발생하기 때문에 SR방식보다는 효율이 떨어진다.

의사코드

N  = window size
Rn = request number
Sn = sequence number
Sb = sequence base
Sm = sequence max

수신자:
Rn = 0
while:
if 받은 패킷이 = Rn 이고 에러가 없으면
        패킷을 승인하고 윗단계로 전송한다. 
        Rn = Rn + 1
Else
        패킷을 거절하고
NAK응답을 보내거나 아무것도 하지 않는다.
        
송신자:
Sb = 0
Sm = N + 1
while:
1. if Rn > Sb //현재 ACK패킷이 도착하면 그 후의 윈도우 크기만큼 패킷들을 보낸다. 
        Sm = (Sm - Sb) + Rn  
        Sb = Rn
2. if 패킷이 전송중이 아니라면, 
        Sb <= Sn <= Sm인 Sn인 패킷들을 보낸다. 

윈도우 크기의 선택 (N)

윈도우 크기를 정하는 전략은

  1. 수신자의 버퍼크기를 고려해야 한다. (TCP의 rwnd를 통해서 구현)
  2. N은 순서번호보다는 작아야 한다.
  3. 1과 2에서 정한 숫자중 제일 큰 숫자를 선택한다.