Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 푸라닭
- 냉동만두 추천
- 대구동성로맛집
- 황리단길디저트
- 서현역맛집
- 경주맛집
- 수지 술집
- CU 편의점 추천
- 황리단길기념품
- 교촌치킨 신메뉴
- 편의점 신제품
- CU편의점
- 오뚜기 라면
- 편의점 추천
- CU편의점 추천
- 편스토랑
- 수원 맛집
- 서현 맛집
- 용인맛집
- 황리단길맛집
- 분당 맛집
- 동성로맛집
- 마켓컬리 추천
- BBQ 신메뉴
- 서현역중식
- 분당맛집
- 순천디저트
- 치킨 신메뉴
- 순천맛집
- cu 편의점
Archives
- Today
- Total
일상 메모장
TCP timer (Retransmission timer) 본문
안녕하세요.
오늘 포스팅할 내용은 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초 ...
- SYN 패킷을 보내고 RTO시간이 지나면 재전송이 일어나고, 이 이후에도 계속해서 SYN+ACK를 받지 못하면 다시 Retransmission 이 발생할 텐데 이때 계산되는 배수를 backoff라고 부릅니다.
- RTO는 Retransmission timeout 이 발생하는 시간을 의미하는데, 이 값은 기본적으로 RTT(Round Trip Time)에 의해서 계산됩니다. RTT는 TCP option field 중 timestamp 옵션으로 측정되어지는데 패킷을 주고받으면서 두 종단 간의 RTT를 계속해서 측정하게 됩니다.
- 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초 -> ...
- 위의 syn_backoff 는 [1,1,1,1,1,2,4,...] 배열에 이런 값으로 들어가 있는데,
- 위에 SYN 일 경우 RTO는 1초를 기본값으로 사용했었는데, connection 이후는 종단 간 RTT가 측정된 상태이기 때문에, 이 값을 기반으로 RTO값을 계산합니다.
- TCP 는 신뢰성 있는 전송을 하기 위해 내가 보낸 데이터에 대해서 ACK sequence를 받지 못했다면,
위의 내용에서 느끼셨겠지만, TCP는 매우 보수적인(모든 네트워크 환경에서 안정적으로 동작해야 하는 만큼) 프로토콜이기 때문에, 패킷을 잃어버리면 TCP 속도가 매우 느려지게 됩니다.
이 글로 어떤 시간 간격을 기준으로 패킷이 재전송되는지 이해가 되셨으면 좋겠습니다.
다음에는 Persist timer, Keepalive timer, Delayed ack timer, 2 msl timer, Probe timer 등 TCP 내부에서 사용되는
Timer 들에 대해서 포스팅하도록 하겠습니다.
감사합니다.
'Kernel TCP IP' 카테고리의 다른 글
TCP header (+ TCP 옵션) (0) | 2019.12.31 |
---|---|
sk_buff 에서 Mac header, IP v4 and v6 header, TCP header 파싱 (0) | 2019.12.28 |
TCP timers (Persistent, Keep alive, Time wait) (0) | 2019.12.27 |
TCP sliding window 개념 (0) | 2019.12.21 |
struct sk_buff 관련 함수 (1) | 2019.12.20 |