[network] 혼자 공부하는 네트워크 04-3 TCP의 오류, 흐름, 혼잡 제어
전송 계층의 TCP 프로토콜의 핵심은 다음과 같다.
TCP의 기능
- 재전송을 기반으로 다양한 오류를 제어
- 흐름 제어를 통해 처리할 수 있을 만큼의 데이터 송수신혼잡 제어를 통해 네트워크가 혼잡한 정도에 따라 전송량 조
① 오류 제어
'전송 계층의 TCP, UDP 세그먼트에는 체크섬 필드가 있는데 이것만으로 충분하지 않을까?' 라는 질문에 '그렇지 않다'로 답할 수 있다. 체크섬 필드는 데이터가 훼손되었는지의 여부만 나타내기 때문이다. 패킷이 유실되었거나, 또는 잘못 전송되었거나, 순서에 어긋나게 전송되는 것은 체크섬 필드만으로 오류를 검출하기 어렵다.
그러면 TCP는 언제 오류가 난 것을 알아채고 재전송할까?
- 중복된 ACK 세그먼트를 수신했을 때
- 타임아웃이 발생했을 때 (이게 더 나쁘다)
이렇게 오류가 검출되면 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) - 송신 호스트가 파이프라이닝할 수 있는 최대량
- 즉, 윈도우의 크기만큼 확인 응답을 받지 않고도 한 번에 전송 가능한 양
③ 혼잡 제어
- 혼잡(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배씩 지수적으로 증가: 초기 전송 속도 빠른 확보
빠른 회복(fast recovery) 알고리즘
- 세 번의 중복된 ACK 세그먼트 수신: 빠른 재전송 + 빠른 회복 알고리즘
- 빠른 전송률 회복을 위해 느린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘
- 단, 빠른 회복 도중이라도 타임아웃이 발생하면 다시 느린 시작을 수행