신비한 개발사전
TCP의 패킷 전송 제어 수단 본문
TCP의 재전송 타이머와 빠른 재전송
TCP는 재전송(retransmission) 타이머를 사용해 손실된 데이터를 재전송할 수 있다. 재전송 타이머는 송신하는 쪽이 패킷을 전송할 때마다 가동되는데, 일정 시간(RTO—retransmission timeout) 내에 ACK 응답이 오지 않으면 패킷이 손실됐다고 가정해 재전송을 진행하게 된다.
* RTO는 패킷이 왕복하는 데 걸리는 시간 등을 활용해 계산하는 값이라서 고정된 값이 아니다.
타이머를 기반으로 패킷을 재전송하면 타이머의 대기 시간(RTO)에 따라 손실된 패킷의 재전송에 지연이 발생할 수 있다. 이 점을 보완하기 위해 타이머가 다 되기 전에 패킷을 재전송하는 빠른 재전송(fast retransmit)도 사용하는데, 빠른 재전송은 수신 측이 동일한(중복된) ACK를 3번 이상 보낼 때 동작하게 된다.
TCP 통신에서 수신 측은 데이터 패킷이 도착할 때마다 송신 측에 ACK를 회신하는데, 각 ACK는 특정 패킷을 받았다는 의미에서 고유 번호를 값으로 사용한다. 데이터가 손실되면 그 이후의 패킷에 대해 동일한 값을 가진 ACK가 반복적으로 송신되기 때문에 수신 측이 같은 ACK를 계속 전송한다는 것은 중간에 손실된 데이터가 있다는 뜻이며, 송신 측은 중복된 ACK를 3번 이상 받으면 이전에 전송했던 패킷이 손실됐다고 추정해서 즉시 재전송을 진행한다.
Congestion control (혼잡 제어)
TCP는 네트워크의 혼잡을 방지하기 위해 **혼잡 제어**를 통해 송신 속도를 조절하기도 한다. 데이터가 라우터를 거쳐 전송되는 과정에서 한 라우터에 처리량이 쌓이면 데이터가 제대로 전달되지 않을 수 있는데, 이때 송신 측에서 데이터를 재전송해 네트워크 혼잡을 유발할 수 있다. 이런 상황을 방지하기 위해 송신 측의 전송 속도를 제어해 네트워크 내의 패킷 수를 조절한다.
TCP가 네트워크의 혼잡도를 제어하는 데에는 여러 방식이 있다:
- Additive Increase/Multiplicative Decrease(AIMD): 네트워크 상태가 좋을 땐 보내는 양을 천천히(서서히) 증가, 상태가 좋지 않을 땐 보내는 양을 한번에 대폭 감소
- Slow Start: 연결 시작 시 작은 윈도우 크기(전송량)로 시작하고, ACK를 받을 때마다 점진적으로 증가
- Congestion Avoidance: 네트워크 혼잡 신호가 없을 경우 윈도우 크기를 선형 증가
- Fast Recovery: 혼잡이 감지된 후 빠르게 전송 속도를 조정하고 회복
Flow control (흐름 제어)
흐름 제어는 수신 측이 처리 가능한 데이터 양을 초과하지 않도록 송신 측의 전송 속도를 조정하는 메커니즘이다.
수신 측은 받은 데이터를 처리하기 전에 일시적으로 수신 버퍼(receive buffer)라고 하는 유한한 메모리 공간에 저장하는데, 수신 버퍼의 크기 이상으로 데이터가 계속 들어오게 되면 버퍼 오버플로우(overflow)가 발생하면서 더이상 데이터를 받을 수 없게 된다. (데이터 손실도 일어날 수 있다)
송신 측이 데이터를 전송하는 속도와 수신 측이 데이터를 처리하는 속도를 맞춰서 위와 같은 상황을 방지하기 위해 슬라이딩 윈도우(sliding window) 기법을 사용해 데이터의 흐름을 제어한다.
- 수신자가 자신의 버퍼 크기에 따라 윈도우 크기를 설정해 송신자에게 알려줌
- 송신자는 윈도우 크기만큼 데이터를 전송하고, ACK를 받을 때마다 다음 데이터를 보냄
- 데이터 흐름을 동적으로 조정해 오버플로우와 데이터 손실을 방지
'CS' 카테고리의 다른 글
운영체제와 운영체제 시스템 (0) | 2024.12.16 |
---|---|
신뢰적 데이터 전송의 원리 (0) | 2024.12.05 |
JSCODE 모의면접 스터디 참여 회고 (1) | 2024.12.01 |
네트워크 라우팅 (0) | 2024.11.28 |
공인 IP vs 사설 IP (0) | 2024.11.26 |