파이프라이닝을 사용시

한 주기는 반복되는 그림이 무엇인지를 보면알 수 있다.
위 예시에서는 주기가 rtt + 전송시간이다.
이용률을 계산시 분모는 같지만 분자가 더 큰 것을 알 수 있다.
이렇게 파이프라이닝은 놀고 있는 시간을 줄여 성능을 높일 수 있다.

패킷 1번까지는 잘 받고 2번이 로스가 난 경우이다.
왼쪽 2개를 잘 받았으니 윈도우가 오른쪽으로 두칸 이동했다.
패킷 3은 제대로 갔어도 수신자가 기다리는 패킷은 2번이다 따라서 버리고 1번까지 잘 받았다고 애크 1을 보낸다.
전송자는 윈도우 공간이 남으니 패킷 4, 5도 보낸다. 이때 타이머는 제일 오래된 응답을 못 받은 패킷인 2번에 걸려있다.
타임 아웃이 발생하면서 제일 오래된 응답을 못 받은 패킷인 2번부터 모두 재전송한다.
수신자는 2번 패킷을 받고 2번까지 잘 받았으니 애크 2를 보내고 3번을 기다린다.
수신자는 3번 패킷을 받고 3번까지 잘 받았으니 애크 3를 보내고 4번을 기다린다.
수신자는 4번 패킷을 받고 4번까지 잘 받았으니 애크 4를 보내고 5번을 기다린다.
수신자는 5번 패킷을 받고 5번까지 잘 받았으니 애크 5를 보내고 6번을 기다린다.

패킷 2가 로스가 나면 수신자는 계속 패킷 2를 기대하고 있다.
따라서 3, 4, 5는 버퍼링을 한다.
이후 전송자의 패킷 2가 타임아웃이 발생해 재전송되면 수신자는 이를 받고 응용에 버퍼에 있는 패킷과 함께 보내서 2, 3, 4, 5를 올려 보낸다.
이후 애크2를 보내고 수신자의 윈도우는 6으로 이동한다.
전송자는 애크 2를 받아 윈도우 내 모든 패킷이 응답을 받았으므로 윈도우를 6으로 옮긴다.

셀렉티브 리핏에서 총 시퀀스 번호 수가 윈도우 크기보다 충분히 크지 못하면 다음과 같은 문제가 발생한다.
첫번째 상황은
처음에 보낸 0번 패킷은 응답을 잘 받았고 두번째로 보낸 0번 패킷이 응답을 받아야 하는 상황이다. 수신자의 윈도우에 0이 있으므로 수신자는 0번 패킷이 재전송 된건지는 알 수 없지만 받았으니 애크0을 줄 것이고 문제가 없이 잘 돌아간다.
두번째 상황은
처음에 보낸 0번 패킷이 애크를 못 받았다. 하지만 수신자의 윈도우는 패킷을 받아 오른쪽으로 이동한 상태이다. 사실 수신자의 윈도우에 있는 0은 두번째 0이므로 재전송된 패킷 0을 받으면 안 된다. 그러나 수신자는 패킷이 재전송된 것인지 알 수 없기 때문에 받아들이고 문제가 있음에도 정상 상황과 똑같이 작동을 한다.
이를 위해 시퀀스 번호를 윈도우 크기보다 충분히 크게 하고 셀렉티브 리피트에서는 앞뒤 n을 모두 보기 때문에 2^k >>>> 2*n이어야 한다.