빠른 재전송(Fast Retransmit)
빠른 재전송(Fast Retransmit)은 TCP의 혼잡 조절에 추가된 정책이다. 패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다. 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보낸다. 따라서 중간에 패킷하나가 손실되게 되면 보내는 측에서는 순번이 중복된 ACK 패킷을 받게 되고, 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송해 줄 수 있다. 빠른 재전송은 중복된 순번의 패킷을 3개 받으면 재전송을 한다. 그리고 이런 현상이 일어나는 것은 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 창 크기를 줄이게 된다.
한마디로, 데이터 전송 패킷 손실이 의심될 때 재전송 타이머가 만료되기(RTO) 전에 손실된 패킷을 빠르게 재전송하는 기법이다.
RTO란?
재전송 타이머가 만료되기까지 기다리는 시간(Retransmission Timeout)
기본 재전송 기법이 있음에도 Fast Retransmit이 필요한 이유는?
기본 재전송 타이머 방식만으로는 손실 복구가 느려, 데이터 전송 속도와 네트워크 대역폭 효율에 문제가 생길 수 있다. 이를 개선하기 위해 중복 ACK(Duplicate ACK)를 활용한 빠른 재전송(Fast Retransmit) 기법이 추가되었다.
Fast Retransmit 과정
송신 측에서 바로바로 여러 개의 세그먼트를 전송할 경우, 세그먼트가 손실되면 수신 측에서는 중복 ACK를 보내게 되는데, 타임아웃 전에 송신 측에서 중복 ACK를 3번 받게 되면 세그먼트를 즉시 전송한다. 즉, 수신 측이 기다리는 순서번호의 세그먼트보다 큰 순서번호의 세그먼트가 3개 도착할 경우를 의미한다.
흐름 제어(Flow Control)
TCP 송신자가 데이터를 너무 빠르게 또는 너무 많이 전송하여 수신버퍼가 오버플로우(Overflow)하는 것을 방지한다. TCP의 수신자는 수신버퍼(receive buffer)를 가지는데, 상위 계층으로 세그먼트를 보내는 애플리케이션 프로세스가 수신버퍼로부터 데이터를 읽는 속도가 느릴 수 있다.
- 목표: 애플리케이션 프로세스의 읽는 속도 = 송신자가 데이터를 전송하는 속도
- 즉, 흐름제어는 속도를 일치시키는 서비스이다.
Receive Window(rwnd)란?
- 수신버퍼의 가용 바이트 수로, 송신 윈도우 크기를 결정한다.
- 항상 수신 버퍼보다 작아야한다. 초과하면 오버플로우 발생한다.
- 수신버퍼의 크기는 소켓의 옵션을 통해 설정되는데 디폴트 값이 4096바이트이다.
수신자는 TCP헤더에 수신버퍼안에 있는 여유공간(Receive Window, rwnd) 값을 포함함으로써 버퍼에 공간이 있음을 송신자에게 알린다.
rwnd 계산
rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
RcvBuffer
: 수신 측 버퍼 크기.LastByteRcvd
: 가장 최근에 수신된 데이터의 끝 번호.LastByteRead
: 어플리케이션 계층에서 읽어간 데이터의 끝 번호.
'Network' 카테고리의 다른 글
Switch, Router? Mac 주소, IP 주소? ARP? (0) | 2024.11.30 |
---|---|
파이프라이닝 프로토콜 (0) | 2024.11.20 |
Forward Proxy, Reverse Proxy (0) | 2024.11.09 |
공개키? 개인키? (0) | 2024.11.08 |
HTTP/2.0 (0) | 2024.11.08 |