728x90
이번 포스트에서는 TCP의 혼잡 제어에 대해 다루겠다.
먼저 TCP의 재전송에 대해 간단히 정리하고 넘어가겠다,
TCP의 재전송 시나리오 :
- 호스트 A가 시퀀스 넘버 92, 100이라는 세그먼트를 호스트 B로 전송한다.
- 호스트 B는 해당 세그먼트에 대한 ACK 세그먼트 100, 120을 보냈으나 타임아웃 되기 전에 도착하지 못했다.
- 타임아웃이 가장 오래된 세그먼트에 걸려 있기 때문에 호스트 A는 시퀀스 넘버 92에 대한 세그먼트를 재전송한다.
- 호스트 B는 Seq 92를 이미 받았으므로 ACK 120을 재전송한다.
- 호스트 A는 ACK 120을 받고 Seq 120번부터 전송한다.
혼잡 제어(Congestion Control)란?
: 라우터가 버퍼 오버플로우가 발생하지 않게끔 윈도우 사이즈를 조절하는 기법이다. 윈도우 사이즈가 커질수록 전송 속도가 빨리지지만 그만큼 버퍼 오버플로우가 발생할 확률도 높아진다.
혼잡 제어 개요 :
- cwnd: 현재 시점에서 ACK 없이 한 번에 보낼 수 있는 바이트 수 (네트워크의 형태에 맞춰서 변동, 초기 사이즈는 1 MSS = 1500 Byte)
- 윈도우 사이즈가 점점 커진다.
- 패킷 loss (버퍼 오버플로우) 발생
- 윈도우 사이즈가 초기 상태(1 MSS)로 돌아간다.
- 이상 동작 반복
혼잡 제어는 크게 3가지 구간으로 구성되어 있다.
- Slow start
- Congestion avoidance
- Fast recovery
TCP 혼잡 제어 윈도우 사이즈 증가 과정 :
- 처음에는 작게 시작하다가 기하급수적으로 윈도우 사이즈를 늘린다. (Slow start)
- 기하급수적으로 늘리다 보니 무제한으로 늘리는 것이 다소 비현실적이다.
- TCP 혼잡 제어에서 slow start threshold(ssthresh)를 설정한다.
- 기하급수적으로 상승했다가 ssthresh에 도달하면 linearly 형태로 증가한다 (cwnd분의 1 씩 증가) (Congestion avoidance).
- 예시) MSS = 1500Byte인 패킷을 cwnd가 10인 경우 10분의 1씩 증가한다. 즉 150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500
SSThresh 변동 과정 :
- Slow start 단계 또는 Congestion avoidance 단계에서 패킷 loss가 발생한다.
- ssthresh를 패킷 loss 발생 시점의 윈도우 사이즈의 2분의 1로 변경한다.
전체적인 시나리오 :
- cwnd가 기하급수적으로 증가한다.
- ssthresh를 지나면 linearly 형태로 증가한다.
- 12에서 패킷 loss가 발생한다.
- cwnd가 다시 1로 돌아가며 ssthresh가 패킷 loss 발생시점 cwnd의 2분의 1, 즉 12의 2분의 1인 6으로 변경된다.
- cwnd가 기하급수적으로 증가한다.
- ssthresh를 지나면 linearly 형태로 증가한다.
- 이상 동작 반복
패킷 loss를 감지하는 방법 (번외)
(1) Timeout
(2) 3-dup Ack
2번 같은 경우에는 어쨌든 뒤에 오는 Ack은 여전히 받을 수 있지만, 1번 같은 경우에는 Ack이 아예 오지 않는 상태라 Timeout이 좀 더 심각한 상황이라고 할 수 있다.
Fast Recovery
타이아웃을 발생한 경우:
- ssthresh cwnd의 2분의 1로 줄임
- cwnd를 1MSS로 설정
- SS 단계 실행 (기하급수)
3 dup ACKS 발생한 경우:
- ssthresh cwnd의 2분의 1로 줄임
- cwnd를 ssthresh로 설정
- CS 단계 실행 (선형)
Fase Recovery 상세 동작 과정 :
- 3 dup Ack 발생하면 일단 윈도우 사이즈 + 3
- 그 뒤부터 윈도우 사이즈 1 씩 증가
- 새로운 ACK이 발생하는 경우 윈도우 사이즈를 ssthresh로 설정하여 FR 단계 탈출
'Networking' 카테고리의 다른 글
연결 관리 및 흐름 제어 (TCP) (0) | 2022.06.14 |
---|---|
TCP (0) | 2022.06.11 |
Go-Back-N & Selective Repeat (0) | 2022.06.04 |
Reliable Data Transfer (RDT) (0) | 2022.05.26 |
Transport Layer (전송 계층) (0) | 2022.05.06 |