TCP의 특징인 오류, 흐름, 혼잡 제어는 어떻게 동작할까?
TCP의 오류 제어, 흐름 제어, 혼잡 제어
--
TCP의 중간 과정인 데이터 송수신 과정에서
발생하는 오류 제어, 흐름 제어, 혼잡 제어는
모두 TCP의 신뢰성을 보장하기 위한 기능이다.
TCP는 재전송을 기반으로 다양한 오류를 제어하고,
흐름 제어를 통해 처리할 수 있는 만큼의 데이터만을 주고받으며,
혼잡 제어를 통해 네트워크가 혼잡한 정도에 따라 전송량을 조절하여
데이터를 안전하게 송수신할 수 있도록 한다.
--
오류 제어 (재전송 기법)
--
신뢰성을 보장하기 위해서는 "오류"를 제어할 수 있어야 하는데
이를 위해 TCP는 잘못된 서그먼트를 재전송하는 방법을 사용한다.
TCP 세그먼트에는 오류 검출을 위한 "체크섬" 필드가 존재하지만,
이것만으로 신뢰성을 보장하기는 부족하다.
"체크섬"은 세그먼트의 훼손 여부만 나타낼 뿐이고,
"체크섬" 값이 잘못되었을 때 호스트는 해당 패킷을 읽지 않고 그냥 폐기하기 때문이다.
즉, "체크섬"을 이용해도 송신 측 호스트가 세그먼트 전송 과정에 문제 여부를 인지할 수 없다.
오류 검출 & 재전송
TCP가 신뢰성을 제대로 보장하기 위해서는
- 송신 측 호스트가 송신한 세그먼트에 문제가 발생했음을 인지
- 오류를 감지하면 해당 세그먼트를 재전송
TCP가 오류를 검출하고 해당 세그먼트를 재전송하는 상황
- 중복된 ACK 세그먼트를 수신
- 타임아웃 발생
송신 측 호스트가 중복된 ACK 세그먼트를 수신한 경우
송신 측 호스트는
세그먼트를 전송했지만 중간에 누락되어 수신 측 호스트에 전달이 되지 않은 상황에서
수신 측 호스트는
일정시간(RTT) 동안 수신이 없으니 다시 재요청을 보낸다.
RTT (Round Trip Time)은
메시지를 전송한 뒤에 해당 메시지에 대한 응답을 받는 데까지 걸리는 시간을 의미한다.
타임아웃이 발생한 경우
TCP 세그먼트를 송신하는 호스트는 모두 "재전송 타이머 (Retransmission Timer)"라는 값을 유지한다.
세그먼트를 전송할 때마다 재전송 타이머를 새로 시작하게 되는데
해당 재전송 타이머가 끝나는 것을 타임아웃이라고 부른다.
즉, 송신 측 호스트가 전달한 세그먼트에 대한 타임아웃이 발생할 때까지 해당 응답을 받지 못하면
세그먼트가 상태 호스트에게 정상적으로 도착하지 않았다고 간주하여 다시 재전송을 한다.
TCP의 재전송 기법으로
수신 호스트의 답변(ACK)과 타임아웃 발생을 기반으로 문제를 진단하고,
문제가 생긴 메시지를 재전송하여 신뢰성을 확보하는 방식인
"ARQ (자동 재전송 요구, Automatic Repeat Request)"가 있는데 여러 종류가 존재한다.
- Stop-and-Wait ARQ
- Go-Back-N ARQ
- Selective Repeat ARQ
해당 방법은
메시지를 제대로 전달했음을 확인하기 전까지는 새로운(다음) 메시지를 전달하지 않는 방식이다.
즉, 메시지를 송신하면 해당 응답을 받아야 다음 메시지를 송신하는 것을 반복하는 방법이다.
Stop-and-Wait ARQ방식은
단순하고, 높은 신뢰성을 보장하는 방식이지만,
전송에 대한 응답을 받아야 다음 전송을 진행하는 방식으로
송신 측 호스트는 응답을 받기 전까지는 다음 전송을 할 수 없다.
수신 측 호스트는 훨씬 많은 데이터를 한 번에 받을 수 있음에도 한 번에 하나씩만 확인 응답을 해야 해서
네트워크의 이용 효율이 낮아지고, 성능 저하로 이어질 수 있으므로,
요즘 잘 사용하지 않는 방식이다.
해당 방법은
Stop-and-Wait ARQ의 문제를 해결하기 위해
각 요청에 대한 응답을 받기 전에 다른 요청들도 보낼 수 있는 방식이다.
즉, "파이프라이닝" 기술을 사용한 방법이다.
파이프라이닝 (Pipelining)은
연속해서 메시지를 전송할 수 있는 기술을 의미한다.
파이프라이닝 방식을 활용하여 여러 세그먼트를 전송하고,
도중에 잘못 전송된 세그먼트가 발생하면 해당 세그먼트부터 다시 재전송한다.
이때 잘못 전송된 세그먼트 이후로 온 세그먼트는 올바르게 수신해도 전부 폐기한다.
즉 위 그림처럼
n+1번 세그먼트가 정상적으로 전송되지 않았으니 이후에 전달받은 n+2번 세그먼트를 폐기하여
n+1번부터 다시 재전송받는 방식이 된다.
해당 방법은
Go-Back-N ARQ처럼 "파이프라이닝"을 사용한 방식이지만
Go-Back-N ARQ에서 송신 과정에서 하나의 세그먼트에만 문제가 생겨도 그 후의 모든 세그먼트를
다시 재전송해야 하는 단점을 보완한 방법으로,
수신 측 호스트는 제대로 전송받은 패킷들은 모두 ACK 세그먼트를 보내는 방식이다.
그래서 각 세그먼트를 개별적으로 확인하고 응답하는 방식이다.
즉, 잘못 보낸 세그먼트만 재전송하는 방법이다.
요즘 TCP 통신에서는 대부분 Selective Repeat ARQ를 지원하여 해당 방식으로 동작하지만
만약 Selective Repeat ARQ를 사용하지 않을 경우 Go-Back-N ARQ 방식으로 동작된다.
--
흐름 제어 (슬라이딩 윈도우)
--
파이프라이닝 기반의
Go-Back-N ARQ와 Selective Repeat ARQ가 정상적으로 동작하려면
반드시 "흐름 제어"를 고려해야 한다.
(호스트가 한 번에 받아서 처리할 수 있는 세그먼트의 양이 제한되어 있기 때문이다.)
즉, TCP의 흐름제어는
송신 호스트가 수신 호스트의 처리 속도를 고려하여 송수신 속도를 균일하게 유지하는 것이다.
그리고 오늘날의 TCP는 흐름제어로 "슬라이딩 윈도우 (Sliding Window)"를 사용한다.
슬라이딩 윈도우 (Sliding Window)
여기서 윈도우(Window)는
송신 호스트가 파이프라이닝할 수 있는 최대량을 의미한다.
즉, 보낼 수 있는 세그먼트의 최대 양을 의미하고
해당 윈도우 크기만큼은 확인 응답을 받지 않아도 한 번에 전송이 가능하다는 의미다.
위 그림처럼 1, 2, 3, 4 세그먼트를 전달한 상태에서
1세그먼트에 대한 응답을 받으면 해당 1세그먼트는 정상적으로 전달이 된 것이므로
윈도우를 한 칸 뒤로 옮긴다.
즉, 다음 세그먼트인 5세그먼트를 전달하게 된다.
그래서 해당 방식을 "슬라이드 윈도우"라고 부른다.
수신 측 호스트의 수신 윈도우 크기를 송신측 호스트가 알아야
수신측 호스트가 해당 크기에 알맞게 세그먼트들을 한 번에 보낼 수 있다.
TCP 세그먼트의 구조를 보면 "윈도우"라는 필드가 존재한다.
수신 측 호스트는 TCP 헤더(윈도우 필드)를 통해 자신이 받을 수 있는 데이터의 양을 담아 전달하고
송신 측 호스트는 해당 필드의 정보를 기반으로 전달 양과 처리 속도를 맞춰 전송하는 것이다.
사실 위 그림과 달리 한 번에 4개의 세그먼트를 전송하지만
이해하기 편하게 분리하여 표현했다.
--
혼잡 제어
--
여기서 말하는 혼잡은
많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황이다.
즉, 이러한 혼잡을 제어하기 위한 기능이 "혼잡 제어"다.
송신측 호스트가 혼잡 제어를 사용하게 되면
네트워크의 혼잡도를 판단하고 현재 혼잡한 정도에 따라 유동적으로 전송량을 조절하며 전송하게 된다.
이때 혼잡 없이 전송할 수 있는 데이터양을 "혼잡 윈도우 (Congestion Window)"라고 부른다.
즉, "혼잡 없이 전송할 수 있을 것 같은 데이터의 양"을 의미한다.
송신 측 호스트는
수신 측 호스트가 수신 윈도우 크기를 TCP 헤더로 알려주기 때문에 그대로 전송하면 되지만
수신 측 호스트는
송신 측 호스트가 어느 정도의 세그먼트를 전송해야 혼잡을 방지할 수 있는지 직접 계산해야 한다.
--
'CS > 네트워크' 카테고리의 다른 글
[응용 계층] HTTP (0) | 2024.11.24 |
---|---|
[응용 계층] DNS (0) | 2024.11.23 |
[전송 계층] TCP와 UDP (0) | 2024.11.21 |
[전송 계층] 전송 계층 (0) | 2024.11.20 |
[네트워크 계층] 라우팅 (0) | 2024.11.19 |