TCP의 신뢰도를 확보하기 위해서는 RTT, RTO 등 과 같은 시간제한 변수들을 설정해서 관리하는 Timer들이 있다. 총 4가지의 Timer가 존재하는데 그 중 RTT와 RTO와 관련된 Timer는 Retransmission Timer이다.
Retransmission Timer는 송신자가 데이터를 전송하였을 때 ACK를 받지 못하고 Time Out 되어 제대로 전송이 안됐다고 판단할 때까지의 시간을 재서 Retransmission을 하기 위한 Timer이다. 이 때 RTT와 RTO가 쓰인다.
RTT는 Round-Trip-Time으로 데이터가 전송된 후 ACK를 받을 때까지의 시간을 의미한다. RTO는 데이터 전송 후 ACK를 받지 못하였을 때 다시 데이터를 전송하기까지 정한 시간이다.
RTT와 RTO를 정하는 식들은 서로 이어져 있다고 볼 수 있다. 특히 최근의 RTO는 SRTT나 RTTVAR등과 같은 변수로 결정된다. 따라서 각자 서술하는 것보다 서로 연관 지어서 설명하는 것을 원칙으로 한다. 먼저 RTT sample을 얻는 방법에 대한 알고리즘은 Karn’s Algorithm에서 확인할 수 있다.
자세한 사항은 RFC6928, RFC2988을 보면 나와있으니 참고하자.
Karn’s Algorithm
1. 계속 진행되던 transmission에서 RTO를 넘어서 재 전송된 ACK를 통해 측정된 RTT는 무시한다.
2. 계산된 RTT는 무시되고 RTO는 이전 RTO의 2배로 설정한다. (Exponential Backoff)
Karn’s Algorithm에서 하나의 옵션으로는 timestamp를 같이 전송하게 하는 방법이 있는데, 이 방법을 설정하게 되면 retransmission시의 시작 패킷에 대한 모호함을 줄일 수 있으므로 계산된 RTT를 사용한다. 즉 모든 ACK에 RTT가 계산된다.
Current RTO Computation (Jacobson Algorithm)
현재의 RTO를 측정하기 위해서는 먼저 TCP sender는 두 가지 state variable을 인식하고 있어야 하는데, 하나는 SRTT(smoothed round-trip time), 다른 하나는 RTTVAR (round-trip time variation)이다. 추가적으로 clock granularity를 G초 라고 가정해서 계산을 한다. (RFC 6298)
1. RTT가 측정되기 전까지는 RTO는 1초이다.
2. 최초로 측정된 RTT를 R이라고하면 다음과 같다. (K = 4)
SRTT <- R
RTTVAR <- R/2
RTO <- SRTT + max (G, K*RTTVAR)
3. 연속된 RTT 측정을 R’라고 하면 다음과 같이 변수가 변한다. (alpha = 1/8, beta = 1/4 by JK88)
RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R’|
SRTT <- (1 - alpha) * SRTT + alpha * R’
RTO <- SRTT + max (G, K*RTTVAR)
4. 계산된 RTO가 1초보다 작다면 1초로 올림 한다.