일상 메모장

TCP timer (Retransmission timer) 본문

Kernel TCP IP

TCP timer (Retransmission timer)

핸드오버 2019. 12. 26. 09:03

안녕하세요.

 

오늘 포스팅할 내용은 kernel의 TCP 내부에서 사용되는 timer들 중 Retransmission timer에  대해서 알아보려고 합니다.

 

  • Retransmission timer
    • TCP 는 신뢰성 있는 전송을 하기 위해 내가 보낸 데이터에 대해서 ACK sequence를 받지 못했다면,
      일정 시간이 지난 후 해당 패킷을 재전송하게 됩니다. 이때 사용하는 Timer가 Retransmission timer입니다.
    • SYN packet을 보낸 것에 대해서 SYN+ACK를 받지 못했을 때 재전송 time과, connection 이후 데이터를 재전송할 때 time 값은 다르게 사용됩니다.
    • SYN 일 경우
      • RTO는 Retransmission timeout 이 발생하는 시간을 의미하는데, 이 값은 기본적으로 RTT(Round Trip Time)에 의해서 계산됩니다. RTT는 TCP option field 중 timestamp 옵션으로 측정되어지는데 패킷을 주고받으면서 두 종단 간의 RTT를 계속해서 측정하게 됩니다.
        하지만, SYN 패킷의 경우는 가장 처음 connection을 하기 위한 패킷이기 때문에 이전에 데이터를 주고
        받으면서 측정한 RTT가 없기 때문에 기본값인 1초를 사용하게 됩니다.
      • syn_backoff
        • SYN 패킷을 보내고 RTO시간이 지나면 재전송이 일어나고, 이 이후에도 계속해서 SYN+ACK를 받지 못하면 다시 Retransmission 이 발생할 텐데 이때 계산되는 배수를 backoff라고 부릅니다.
          linux의 경우 syn_backoff의 값은 [1,1,1,1,1,2,4,...] 로 되어있고 이 의미는 아래와 같습니다.
          Init RTO(초기 RTO값 1초) * syn_backoff[count of retransmission]
          예를 들어 SYN을 보내고 계속해서 SYN+ACK를 받지 못하면 아래 같은 시간 간격으로 재전송되겠죠
          SYN -> 1초 -> SYN -> 1초 -> SYN -> 1초 -> SYN -> 1초 -> SYN -> 1초 -> SYN -> 2초 -> SYN -> 4초 -> SYN - 8초 ...
    • Connection 이후 패킷일 경우
      • 위에 SYN 일 경우 RTO는 1초를 기본값으로 사용했었는데, connection 이후는 종단 간 RTT가 측정된 상태이기 때문에, 이 값을 기반으로 RTO값을 계산합니다.
        계산식은 대략적으로 srtt * backoff[count of retrasmission] + rexmit_slop 값으로 측정이 되는데,
        간단하게 srtt -> 8번 rtt 의 평균 (RTT는 네트워크 상황에 따라 지속적으로 바뀌기 때문에 평균값으로)
        backoff[재전송횟수] 그리고 rexmit_slop 를 더한값인데 rexmit_slop는 측정된 RTT 간의 편차라고 생각하시면 됩니다.
      • backoff
        • 위의 syn_backoff 는 [1,1,1,1,1,2,4,...] 배열에 이런 값으로 들어가 있는데,
          backoff 는 [1,2,4,8,...] 배수로 증가합니다. 이걸 일반적으로 binary backoff 라고 부릅니다.
        • 그래서 보낸 데이터에 대한 ACK를 받지 못하면 재전송이 일어나는데, 예를 들어 현재 RTT를 기반으로 계산된 RTO가 1초라고 가정하면, 아래와 같은 시간 간격으로 재전송이 될 것입니다.
        • 재전송 -> 1초 -> 재전송 -> 2초 -> 재전송 -> 4초 -> 재전송 8초 -> ...

위의 내용에서 느끼셨겠지만, TCP는 매우 보수적인(모든 네트워크 환경에서 안정적으로 동작해야 하는 만큼) 프로토콜이기 때문에, 패킷을 잃어버리면 TCP 속도가 매우 느려지게 됩니다.

이 글로 어떤 시간 간격을 기준으로 패킷이 재전송되는지 이해가 되셨으면 좋겠습니다.

 

다음에는 Persist timer, Keepalive timer, Delayed ack timer, 2 msl timer, Probe timer 등 TCP 내부에서 사용되는

Timer 들에 대해서 포스팅하도록 하겠습니다.

 

감사합니다.