win size = 4라고 해보자
sender는 뭉탱이로 패킷 0,1,2,3을 보냈다.
receiver는 0이 와서 ACK, 그 다음 1이 와서 ACK,
근데 2가 오는 도중 손실됬다.
그 후 3이 오긴 했으나 Receiver는 2를 기다리므로 쌩깐다.
이제 Sender 입장이다.
ACK0,ACK1이 왔으니 패킷 4,5를 보냈다.
응답은 ACK1이 왔다. '아 2가 중간에 유실됬구나'
패킷 2에 대한 타이머가 울린다. 다시 2부터 win size만큼 보낸다.
여기서 왜 Go-Back-N인지 알 수 있다.
win size N만큼 돌아와서 다시 거기부터 쭉 보내야 하기 때문이다.
딱 봐도 짜친다. 하나 잘못 보냈다고 다시 뭉탱이로 보내야 한다니.
이번엔 수신측에서도 순서대로 안 왔을 경우 임시 저장을 위한 버퍼가 있다.
뭐가 안왔는지 판별해야 되니까. 이번엔 수신측의 부담이 좀 커진다.
여기서 2번이 안왔고, 3번이 왔다.
이 때 Receiver는 3번을 버퍼에 저장하고,
Sender가 2번 타임아웃을 해서 다시 보내기 까지 기다리기 위해 3번을 버퍼에 저장한다.
2번이 오기전에 4,5번이 왔다. 이것도 버퍼에 저장한다.
2가 왔다. 버퍼에 2,3,4,5 순서 맞춰서 한꺼번에 앱 레이어에 던진다.