- 네트워크 통신에서 신뢰적인 연결방식
- TCP는 기본적으로 unreliable network에서, reliable network를 보장할 수 있도록 하는 프로토콜
- TCP는 network congestion avoidance algorithm을 사용
수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제가 없지만, 송신 측의 속도가 빠르면 문제가 생긴다. 수신 측에서 제한된 저장 용량을 초과한 이후에 도착하는 패킷은 손실이 일어날 수 있으며, 손실될시에는 불필요한 추가 패킷 전송이 발생하게 된다. 흐름 제어는 위와 같이 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기 위한 기법이다.
Stop and Wait
매번 전송한 패킷에 대해 확인 응답(ACK)를 받으면 다음 패킷을 전송하는 방법이다. 그러나 패킷을 하나씩 보내기 때문에 비효율적인 방법이다.
Sliding Window
수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답(ACK) 없이 패킷을 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어 기법이다.
윈도우 크기
최초의 윈도우 크기는 호스트들의 '3 way handshaking'을 통해 수신 측 윈도우 크기로 설정되며, 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다. 윈도우 크기는 수신 측에서 송신 측으로 확인 응답(ACK)을 보낼 때 TCP 헤더(window size)에 담아서 보낸다. 즉, 윈도우는 메모리 버퍼의 일정 영역이라고 생각하면 된다.
동작 방식
윈도우에 포함된 패킷을 계속 전송하고, 수신 측으로부터 확인 응답(ACK)이 오면 윈도우를 옆으로 옮겨 다음 패킷들을 전송한다.
1.최초로 수신자는 윈도우 사이즈를 7로 정한다.
2.송신자는 수신자의 확인 응답(ACK)을 받기 전까지 데이터를 보낸다.
3.수신자는 확인 응답(ACK)을 송신자에게 보내면, 슬라이딩 윈도우 사이즈을 충족할 수 있게끔 윈도우를 옆으로 옮긴다
4.이후 데이터를 다 받을 때까지 위 과정을 반복한다.
재전송
송신 측은 일정 시간 동안 수신 측으로부터 확인 응답(ACK)을 받지 못하면, 패킷을 재전송한다. 만약, 송신 측에서 재전송을 했는데 패킷이 소실된 경우가 아니라 수신 측의 버퍼에 남는 공간 없는 경우면 문제가 생긴다. 이를 해결하기 위해 송신 측은 해결 응답(ACK)을 보내면서 남은 버퍼의 크기 (윈도우 크기)도 함께 보내 준다.
데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 이때 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 계속 재전송하여 네트워크를 혼잡하게 한다. 이런 상황은 송신 측의 전송 속도를 적절히 조절하여 예방할 수 있는데, 이것을 혼잡 제어라고 한다.
정리하자면, 흐름 제어는 송 수신 측 사이의 패킷 수를 제어하는 기능이라 할 수 있으며, 혼잡 제어는 네트워크 내의 패킷 수를 조절하여 네트워크의 오버플로우를 방지하는 기능이다.
AIMD (Additive Increase Multicative Decrease)
-합 증가/ 곱 감소 알고리즘
-처음에 패킷 하나를 보내는 것으로 시작, 전송한 패킷이 문제 없이 도착하면 윈도우 크기를 1씩 증가시키며 전송
-패킷 전송을 실패하거나 타임아웃이 발생하면 윈도우 크기를 절반으로 감소시킴
-여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만, 시간이 흐르면 평형 상태로 수렴
문제점
-초기 네트워크의 높은 대역폭을 사용하지 못함
-처음에 전송 속도를 올리는 데 시간이 너무 오래 걸림
-네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄임
Slow start
-AIMD와 같이 패킷을 하나씩 보냄
-하나의 패킷이 문제없이 도착하여 ACK를 보낼 때마다 윈도우 크기를 1씩 늘림
-한 주기가 지나면 윈도우 크기는 2배 -> 그래프의 모양이 지수함수 꼴
-혼잡 현상이 발생하면 윈도우 크기를 1로 떨어트림
-한 번 혼잡 현상이 발생하고 나면 이전에 혼잡 현상이 발생했던 윈도우 크기의 절반까지는 이전처럼 지수함수 꼴로 윈도우 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킴
Fast Recovery
-혼잡 상태가 되면 윈도우 크기를 1로 줄이지 않고 반으로 줄인 후 선형증가.
-혼잡 상태를 한 번 겪고 나서부터는 AIMD 방식으로 동작
Fast Retransmit
-먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK패킷을 보냄
-순서대로 잘 도착한 마지막 패킷의 다음 패킷 순번을 ACK패킷에 실어보내게 되므로 송신측에서는 순번이 중복된 것을 알게됨
-이것을 감지하여 중복된 순번의 패킷을 3개 받으면 타임아웃 전에 문제가 되는 순번의 패킷을 즉시 재전송해줌
-이런 현상이 일어나면 혼잡 현상이 발생한 것이므로 윈도우 크기를 줄임
TCP Tahoe
-처음에는 Slow Start 방식을 사용하다가 임계점에 도달하면 AIMD 방식 사용
-그러다 3 ACK 순번 중복(중간패킷유실)이나 타임아웃이 발생하면 혼잡이라고 판단하여 임계점은 혼잡이 발생한 윈도우 크기의 절반으로, 윈도우 크기는 1로 줄임
단점: 혼잡 이후 Slow start 구간에서 윈도우 크기를 키울때 너무 오래걸림. -> TCP Reno
TCP Reno
-Tahoe와 마찬가지로 slow start로 시작하여 임계점 이후에는AIMD방식으로 변경.
-단, 3 ACK 중복과 타임아웃을 구분함
-3 ACK 중복이 발생하면 Fast Recovery 방식을 사용
-윈도우 크기를 1로 줄이는 것이 아니라 반으로 줄인 후 윈도우 크기를 선형적으로 증가시킴.
-임계점은 줄어든 윈도우 값으로 설정
-타임아웃이 발생하면 Tahoe와 마찬가지로 윈도우 1로 줄이고 Slow start 진행.(임계점 변경하지 x)