Worth spreading

TCP의 fast retransmit 본문

Computer science/Computer Network(컴퓨터 통신)

TCP의 fast retransmit

annual 2017. 4. 4. 19:47


code : 


Event : ACK received, with ACK field value of y

       if (y > SendBase) {

           SendBase = y

 

           If (there are currently any not yet acknowledged segments)

               Start timer

       }

       else { /*a duplicate ACK for already ACKed segment */

           increment number of duplicate ACKs received for y

          

           if (number of duplicate ACKs received for y == 3)

           /* TCP fast retransmit */

               resend segment with sequence number y

       }

  break;


- 송신자가 수신자로부터 ACK를 받았을 때의 상황이다

첫 번째 if문은 송신자가 방금 수신한 ACK가 가장 오랫동안 ACK를 받지 못한 값보다 더 나중에 전송된 값인지를 확인하는 문장이다. 만약 그렇다면 수신자는 방금 ACK를 보낸 값 이전의 데이터들은 전부 정상적으로 받았다는 의미이다. 

그렇게 되면 송신자는 다시 if문을 통해 아직 ACK를 받지 못한 값이 남아있는지를 확인하고 만약 그렇다면 그 값들 중 가장 오래된 값을 기준으로 타이머를 실행시킨다.

다음 else문을 살펴보자.

여기서 if문이 실행되지 않고 else문으로 넘어왔다는 것은 방금 받은 ACK의 값이 ACK를 받지 못한 가장 오래된 값과 같다는 뜻이다. 또한 ACK를 받지 못한 값이 전송 중에 문제가 생겼을 수도 있다고 해석할 수 있다. 하지만 이런 상황이 의심된다고 해서 곧바로 재전송을 하는 것은 불필요한 재전송으로 인한 패널티를 생각했을 때 합리적이지 않다. 

따라서 이 프로그램에서는 같은 순서번호의 ACK를 세 번 받게 되면 타임아웃이 일어나지 않았더라도 해당 값을 재전송하도록 했다. else문 안의 if문은 duplicate ACK의 값이 3인지를 검사해서 재전송을 진행하는 문장이다. 

위의 그림으로 예들 들어보자. 수신자가 보낸 두번째 ACK가 5인 것을 보았을 때 패킷4까지는 정상적으로 수신했다는 것을 알 수 있다. 하지만 ACK 5를 보낸 수신자가 그 뒤에도 세 번의 ACK 5를 보내자 송신자는 Fast retransmit 을 수행해서 패킷5를 다시 보낸다.

TCP가 fast retransmit을 제공하는 이유는 타이머의 타임아웃 기간이 상대적으로 길기 때문이다. 만약 그 긴 시간을 기다리며 RTT를 측정하게 되면 RTT의 신뢰도가 떨어지게 된다. 따라서 TCP는 패킷의 손실을 조기에 파악하기 위해 fast retransmit을 제공한다.

Comments