TCP 흐름 제어는 송신자가 수신자의 처리 능력보다 빠르게 데이터를 보내 수신 버퍼가 넘치는 것을 방지하는 기능입니다. 수신자가 ACK를 통해 자신의 수신 윈도우인 rwnd를 알려주고, 송신자는 이를 기준으로 전송량을 조절합니다.
반면 TCP 혼잡 제어는 네트워크 자체에 과도한 트래픽이 발생하는 것을 방지하기 위한 기능입니다. 송신자가 cwnd라는 혼잡 윈도우를 관리하면서 네트워크 상태에 따라 전송량을 증가시키거나 감소시킵니다. 대표적인 방식으로 Slow Start와 Congestion Avoidance 등이 있습니다.
rwnd와cwnd의 차이는 무엇인가요?
rwnd는 수신자의 처리 능력을 나타내는 수신 윈도우로, 흐름 제어에 사용됩니다.반면
cwnd는 송신자가 네트워크의 혼잡 상태를 판단하여 관리하는 혼잡 윈도우로, 혼잡 제어에 사용됩니다.즉
rwnd는 수신자가 알려주는 값이고,cwnd는 송신자가 자체적으로 관리하는 값입니다.
실제 송신자가 전송할 수 있는 데이터 양은 어떻게 결정되나요?
TCP 송신자는
rwnd와cwnd를 모두 고려하여 전송량을 결정합니다.수신자가 충분히 처리할 수 있더라도 네트워크가 혼잡할 수 있고, 반대로 네트워크가 여유롭더라도 수신 버퍼가 부족할 수 있기 때문입니다.
따라서 확인되지 않은 채 전송 중일 수 있는 데이터 양은 일반적으로
min(rwnd, cwnd)의 제한을 받습니다. 새로 보낼 수 있는 양을 구할 때는 이미 전송했지만 ACK를 받지 못한 데이터 양도 고려해야 합니다.
rwnd는 송신자에게 어떻게 전달되나요?수신자는 TCP 헤더의 Window Size 필드를 통해 현재 자신이 추가로 수신할 수 있는 데이터 양을 송신자에게 알려줍니다.
송신자는 ACK를 받을 때 이 값을 확인하고 수신자의 버퍼가 넘치지 않도록 전송량을 조절합니다.
수신 버퍼가 가득 차면 어떻게 되나요?
수신 버퍼에 여유 공간이 없으면 수신자는
rwnd = 0을 알려 송신자에게 데이터 전송을 중단하도록 요청합니다. 이를 Zero Window라고 합니다.이후 송신자는 수신 윈도우가 다시 열렸는지 확인하기 위해 주기적으로 Zero Window Probe를 보내 상태를 확인합니다.
cwnd는 누가 결정하나요?
cwnd는 수신자가 전달하는 값이 아니라 송신자가 네트워크 상태를 바탕으로 자체적으로 관리하는 값입니다.송신자는 ACK 수신이나 패킷 손실 등의 상황을 통해 네트워크 상태를 간접적으로 판단하고
cwnd를 증가시키거나 감소시킵니다.
TCP는 네트워크가 혼잡한지 어떻게 판단하나요?
TCP는 패킷 손실이나 ACK의 상태, 구현에 따라 RTT 변화 등을 통해 혼잡을 추정할 수 있습니다. ECN을 사용하는 경우에는 네트워크 장비가 표시한 혼잡 신호를 수신자를 통해 전달받을 수도 있습니다.
전통적인 손실 기반 알고리즘은 Timeout이나 일정 수의 중복 ACK로 손실을 추정하면
cwnd를 줄입니다. 다만 중복 ACK 하나가 곧 혼잡을 의미하는 것은 아니며 알고리즘마다 판단과 조절 방식은 다릅니다. RFC 5681, RFC 3168의 ECN
Slow Start는 왜 필요한가요?
TCP 연결을 처음 시작할 때는 송신자가 네트워크가 어느 정도의 데이터를 감당할 수 있는지 알 수 없습니다.
따라서 작은
cwnd에서 시작하여 ACK가 정상적으로 도착하면cwnd를 빠르게 증가시키면서 네트워크가 감당할 수 있는 전송량을 탐색합니다.이를 Slow Start라고 하며, Slow Start 구간에서는 일반적으로
cwnd가 RTT마다 빠르게 증가합니다.
Slow Start와 Congestion Avoidance의 차이는 무엇인가요?
Slow Start는 네트워크가 감당할 수 있는 전송량을 빠르게 탐색하기 위해
cwnd를 빠르게 증가시키는 단계입니다.반면 Congestion Avoidance는 어느 정도 네트워크의 한계에 가까워졌다고 판단한 이후
cwnd를 보다 완만하게 증가시키는 단계입니다.일반적으로
ssthresh를 기준으로 Slow Start에서 Congestion Avoidance로 전환합니다.
ssthresh란 무엇인가요?
ssthresh는 Slow Start Threshold의 약자로, Slow Start와 Congestion Avoidance를 구분하기 위한 기준값입니다.일반적으로
cwnd가ssthresh보다 작으면 Slow Start 방식으로 증가하고,ssthresh이상이 되면 Congestion Avoidance 방식으로 증가합니다.