network

[network] 혼자 공부하는 네트워크 04-3 TCP의 오류, 흐름, 혼잡 제어

hail2y 2025. 1. 6. 23:54

전송 계층의 TCP 프로토콜의 핵심은 다음과 같다. 

TCP의 기능

  • 재전송을 기반으로 다양한 오류를 제어
  • 흐름 제어를 통해 처리할 수 있을 만큼의 데이터 송수신혼잡 제어를 통해 네트워크가 혼잡한 정도에 따라 전송량 조

① 오류 제어

'전송 계층의 TCP, UDP 세그먼트에는 체크섬 필드가 있는데 이것만으로 충분하지 않을까?' 라는 질문에 '그렇지 않다'로 답할 수 있다. 체크섬 필드는 데이터가 훼손되었는지의 여부만 나타내기 때문이다. 패킷이 유실되었거나, 또는 잘못 전송되었거나, 순서에 어긋나게 전송되는 것은 체크섬 필드만으로 오류를 검출하기 어렵다. 

 

그러면 TCP는 언제 오류가 난 것을 알아채고 재전송할까?

  • 중복된 ACK 세그먼트를 수신했을 때
  • 타임아웃이 발생했을 때 (이게 더 나쁘다)

https://www.youtube.com/watch?v=zEZbCULOQdY&list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&index=35

 

이렇게 오류가 검출되면 TCP는 신뢰성 높은 통신을 위해 패킷 재전송 절차를 거치게 되는데, 재전송 기법은 크게 세 가지 방식이 있다.

 

재전송 기법: ARQ(Automatic Repeat Request, 자동 재전송 요구)

  • 수신 호스트의 답변(ACK)과 타임아웃을 토대로 문제를 진단하고,
  • 문제가 생긴 메시지를 재전송함으로써 신뢰성을 확보하는 방식

ARQ의 대표적인 세 가지 방식

  • Stop-and-wait ARQ: 패킷을 하나씩 전송하고 확인하는 방식
  • Go-back-N ARQ: 문제가 생긴 메시지부터 다시 전송하는 방식
  • Selective Repeat ARQ: 문제가 생긴 메시지만 다시 전송하는 방식

-1.  Stop-and-wait ARQ

  • 제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않는 방식
  • 송신하고, 확인받고, 송신하고, 확인받고...
  • 장점: 단순하지만 높은 신뢰성 보장
  • 단점: 네트워크의 이용 효율이 낮아지고 성능이 저하됨

송신 호스트는 확인 응답을 받기 전까지 더 많은 세그먼트를 보내지 못 하고, 수신 호스트는 더 많은 세그먼트를 받고 싶어도 하나씩만 확인 응답을 보낼 수 있다. 

Stop-and-wait ARQ의 문제 해결 방법

  • 각 세그먼트에 대한 ACK 세그먼트가 도착하기 전이더라고 여러 세그먼트를 보낼 수 있어야 한다.
  • 파이프라이닝: 연속해서 메시지를 전송할 수 있는 기술

-2. Go-back-N ARQ (파이프라이닝)

  • 순서 번호 n번에 대한 ACK 세그먼트는 'n번만의' 확인 응답이 아닌 'n번까지의 누적 확인 응답'
  • 누적 확인 응답(CACK, Cumulative Acknowledgment)

cf. 빠른 재전송 (fast retransmit)

  • 재전송 타이머가 만료되기 전이라도 세 번의 동일한 ACK 세그먼트를 받았다면 곧바로 재전송
  • 타이머가 끝날 때까지 기다리는 시간을 줄일 수 있음

오늘날의 호스트는 빠른 재전송을 지원하는 경우가 많다.

-3. Selective Repeat ARQ (파이프라이닝)

  • 선택적으로 재전송 - 각각의 패킷들에 대해 ACK 세그먼트를 보내는 방식
  • Selective Repeat ARQ의 ACK 세그먼트는 개별 확인 응답

오늘날 대부분의 호스트는 Selective Repeat ARQ를 지원한다. Selective Repeat ARQ를 사용하지 않는 경우 Go-back-N ARQ로 동작한다. 

② 흐름 제어

파이프라이닝 Go-back-N ARQ와 Sel ective Repeat ARQ가 정상 동작하려면 수신 호스트가 한 번에 얼마나 받아 처리할 수 있는지 반드시 고려해야 한다. 호스트가 한 번에 받아서 처리할 수 있는 세그먼트의 양에는 한계가 있기 때문이다. 

 

흐름 제어는 다음과 같다. 

  • 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 유지하는 기능 (Stop-and-wait는 하나 보내고 확인하는 방식이기 때문에 흐름 제어가 필요하지 않다)
  • 파이프라이닝 기반 Go-back-N ARQ와 Selective Repeat ARQ는 흐름 제어가 필요하다.

슬라이딩 윈도우(sliding window): TCP 흐름 제어 기법

  • 윈도우(window) - 송신 호스트가 파이프라이닝할 수 있는 최대량
  • 즉, 윈도우의 크기만큼 확인 응답을 받지 않고도 한 번에 전송 가능한 양

https://www.youtube.com/watch?v=zEZbCULOQdY&list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&index=35

③ 혼잡 제어

  • 혼잡(congestion)은 많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 말한다.
  • 송신 호스트가 혼잡한 정도에 맞춰 유동적으로 전송량을 조절하는 기능
  • 흐름 제어의 주체가 수신 호스트라면 혼잡 제어의 주체는 송신 호스트
  • 혼잡 윈도우(congestion window): 혼잡 없이 전송할 수 있을 법한 데이터양
    • 혼잡 윈도우가 크다는 것은? 한 번에 전송할 수 있는 세그먼트의 수가 많다는 것
    • 혼잡 위도우가 작다는 것은? 네트워크가 혼잡해 한 번에 전송할 수 있는 세그먼트의 수가 적다는 것
  • 수신 윈도우는 수신 호스트가 헤더로 알려주고,
  • 혼잡 윈도우는 송신 호스트가 알아서 직접 계산해서 알아내야 한다

위의 내용을 토대로 비교해 보면 다음과 같다.

흐름 제어  혼잡 제어
수신 호스트의 처리 속도를 고려해 송수신 속도를 조절 송신 호스트가 혼잡한 정도에 따라 전송량 조절
수신 호스트 주체 송신 호스트 주체
수신 윈도우를 수신 호스트가 알려줌 혼잡 윈도우를 송신 호스트가 직접 계산함

 

그렇다면 혼잡 윈도우를 어떻게 계산할까? - TCP의 혼잡 제어 알고리즘으로 결정한다!

 

TCP의 혼잡 제어 알고리즘

  • 혼잡 제어를 수행하는 일련의 방법
  • 가장 기본적인 알고리즘은 AIMD(Additive Increase/Multiplicative Decrease)
    • 합으로 증가, 곱으로 감소
    • 혼잡이 감지되지 않는다면 혼잡 윈도우를 RTT(Round Trip Time)마다 1씩 선형적으로 증가
    • 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복한다

cf. RTT(Round Trip Time) - 메시지를 전송한 뒤 그에 대한 답변을 받는 데까지 걸리는 시간

 

TCP가 혼잡을 감지하는 때도 오류를 검출하는 때와 같다.

  • 중복된 ACK 세그먼트를 수신했을 때
  • 타임아웃이 발생했을 때 (이게 더 나쁘다)

느린 시작(slow start) 알고리즘

  • 혼잡 윈도우를 1부터 시작해 문제 없이 수신된 ACK 세그먼트 하나당 1씩 증가시키는 방식
  • 혼잡 윈도우는 RTT마다 2배씩 지수적으로 증가: 초기 전송 속도 빠른 확보

https://www.youtube.com/watch?v=zEZbCULOQdY&list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&index=35

 

빠른 회복(fast recovery) 알고리즘

  • 세 번의 중복된 ACK 세그먼트 수신: 빠른 재전송 + 빠른 회복 알고리즘
  • 빠른 전송률 회복을 위해 느린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘
  • 단, 빠른 회복 도중이라도 타임아웃이 발생하면 다시 느린 시작을 수행

https://www.youtube.com/watch?v=zEZbCULOQdY&list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&index=35