Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 6. 15. 00:21
혼잡 제어 (TCP) Networking
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가지 구간으로 구성되어 있다.

  1. Slow start
  2. Congestion avoidance
  3. Fast recovery

TCP 혼잡 제어 윈도우 사이즈 증가 과정 :

Slow start

  • 처음에는 작게 시작하다가 기하급수적으로 윈도우 사이즈를 늘린다. (Slow start)
  • 기하급수적으로 늘리다 보니 무제한으로 늘리는 것이 다소 비현실적이다.
  • TCP 혼잡 제어에서 slow start threshold(ssthresh)를 설정한다.

Congestion avoidance

  • 기하급수적으로 상승했다가 ssthresh에 도달하면 linearly 형태로 증가한다 (cwnd분의 1 씩 증가) (Congestion avoidance).
  • 예시) MSS = 1500Byte인 패킷을 cwnd가 10인 경우 10분의 1씩 증가한다. 즉 150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500 

SSThresh 변동 과정 : 

  1. Slow start 단계 또는 Congestion avoidance 단계에서 패킷 loss가 발생한다.
  2. 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 단계 실행 (기하급수)

Time out

3 dup ACKS 발생한 경우:

  • ssthresh cwnd의 2분의 1로 줄임
  • cwnd를 ssthresh로 설정
  • CS 단계 실행 (선형)

3 dupACK

Fase Recovery 상세 동작 과정 :

  1. 3 dup Ack 발생하면 일단 윈도우 사이즈 + 3
  2. 그 뒤부터 윈도우 사이즈 1 씩 증가
  3. 새로운 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
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!