네트워크 통신에서 신뢰적인 연결방식이다. 기본적으로 unreliable network에서 reliable network를 보장할 수 있도록 하는 프로토콜이다. TCP는 네트워크 혼잡회피 알고리즘을 사용한다.
송신측과 수신측의 데이터 처리속도 차이를 해결하기 위한 기법으로 흐름제어는 수신자가 패킷을 지나치게 많이 받지 않도록 조절하는 것이다. 기본개념은 수신자가 송신자에게 현재 자신의 상태를 피드백한다는 점이다.
송신측의 데이터 전달과 네트워크의 데이터 처리속도의 차이를 해결하기 위한 기법이다.
그러면 아래계층들에서 receiving node로 전송이 된다. 이때 송신자의 send buffer에 데이터를 저장하고 수신자는 receive buffer에 데이터를 저장한다. 어플리케이션에서 준비가 되면 이 buffer에 있는 것을 읽기 시작한다.
따라서 흐름제어의 핵심은 이 수신자의 buffer가 넘치지 않게 하는 것이다. 따라서 수신자는 RWND(Receive WiNDow) 라는 receive buffer의 남은 공간을 홍보한다.
수신측이 송신측보다 데이터 처리속도가 빠르면 문제가 없지만 송신측의 속도가 빠를경우 문제가 생긴다. 수신측에서 제한된 저장용량을 초과한 이후에 도착하는 데이터는 손실될 수 있고 만약 손실된다면 불필요하게 응답과 데이터 전송이 송신, 수신측 간에 빈번하게 발생한다. 이러한 위험을 줄이기 위해 송신측의 데이터 전송량을 수신측의 상태에 따라 조절해야한다.
수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 세그먼트를 전송할 수 있게 해서 데이터 흐름을 동적으로 조절하는 제어기법이다. 전송은 되었지만 ACK을 받지 못한 바이트 숫자를 파악하기 위해 사용하는 프로토콜이다.
LastByteSent- LastByteAcked <= ReceivedWindowAdvertised
(현재 공중에 떠있는 패킷 수 <= sliding window)
동작방식
먼저 윈도우에 포함된 모든 패킷을 전송하고 그 패킷들의 전달이 확인되는대로 윈도우를 옆으로 옮기면서 그 다음 패킷들을 전송한다.
Window
TCP/IP를 사용하는 호스트들은 송신하기 위한 것과 수신하기 위한 2개의 윈도우를 가지고 있다. 호스트들은 실제 데이터를 보내기 전 3way hand shaking을 통해 수신 호스트의 receive window size에 자신의 send window size를 맞추게 된다.
세부구조
이전 바이트는 이미 전송되었고, 200~202바이트는 전송되었으나 확인응답을 받지못한 상태이고, 203~211 바이트는 아직 전송되지 않은 상태다.
수신 윈도우보다 작거나 같은 크기로 송신윈도우를 지정하게 되면 흐름제어가 가능하다.
송신측 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에게 데이터가 몰린다면 자신에게 온 데이터를 모두 처리할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실을 발생시킨다. 따라서 이러한 네트워크 혼잡을 피하기 위해 송신측에서 데이터 전송속도를 강제로 줄이는데 이러한 작업을 혼잡제어라고 한다.
또한 네트워크 내 패킷 수가 과도하게 증가하는 현상을 혼잡이라고 하며 혼잡현상을 방지하거나 제거하는 기능을 혼잡제어라고 한다. 흐름제어는 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송문제를 다루게 된다,
처음에 패킷을 하나씩 보내고 문제없이 도착하면 윈도우 크기(단위시간당 보내는 패킷수)를 1씩 증가시켜가며 전송하는 방법이다. 패킷전송에 실패하거나 일정시간을 넘으면 패킷의 보내는 속도를 절반으로 줄여간다.
문제점은 초기 네트워크이 높은 대역폭을 사용하지 못해서 오랜 시간이 걸리게 되고 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다. 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
공평한 방식이며 여러 호스트가 한 네트워크를 공유할때 나중에 진입하는 쪽이 처음엔 불리하지만 시간이 지나면 평형상태로 수렴하는 특징이 있다.
AIMD 방식이 네트워크 수용량 주변에서 효율적으로 작동하나, 처음에 전송속도를 올리는데 시간이 오래걸린다는 단점이 있었다.
Slow Start 방식은 AIMD와 마찬가지로 패킷을 하나씩 보내며 시작하고 패킷이 문제없이 도착하면 각각 ACK패킷마다 window size를 1씩 늘려준다. 즉 한 주기가 끝나면 윈도우 사이즈가 2배로 된다. 전송속도는 AIMD에 비해 지수함수꼴로 증가한다. 대신 혼잡현상이 발생하면 윈도우 사이즈는 1로 떨어뜨리게 된다.
처음에는 네트워크 수용량을 예상할 수 있는 정보가 없으나, 한번 혼잡현상이 발생하면 네트워크 수용량을 어느정도 예상할 수 있다. 따라서 혼잡현상이 발생한 윈도우 사이즈 절반까지는 지수함수 꼴로 창크기를 증가시키고 이후부터는 완만하게 1씩 증가시킨다.
송신측에서 여러 개 세그먼트를 전송할 경우, 세그먼트가 손실되면 수신측에서 중복 ACK을 보내게 되는데, 타임아웃 전 송신측에서 중복 ACK을 3번 받게 되면 세그먼트를 즉시 전송한다. 중복 ACK을 통해 손실된 세그먼트를 검출한다.
혼잡 상태가 되면 윈도우 사이즈를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법이다. 이 정책까지 적용하면 혼잡상황을 한번 겪고나서부터 순수한 AIMD방식으로 동작하게 된다.