흐름제어 : 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법
혼잡제어 : 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 기법
- Flow Control(흐름제어)
– 수신측이 송신측보다 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 발생한다.
– 내부 방식으로 Stop And Wait 와, Sliding Windows 두가지 방식이 있다. - Stop and Wait : 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
- Sliding Windows : 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인 응답없이 세그먼트를 전송할 수 있게하여 데이터 흐름을 동적으로 조절하는 제어 기법.
- 동작방식 : 먼저 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도우를 옆으로 옮김(Slide)으로써 그 다음 패킷들을 전송한다.
- Window : TCP/IP를 사용하는 모든 호스트들은 보내기 위한것과 받기 위한 2개의 Window를 가지고 있습니다. 호스트들은 실제 데이터를 보내기 전에 먼저 앞에서 포스팅했던 “TCP-3-way-handshaking”을 통해 수신컴퓨터의 reveive window size에 자신의 send windows size를 맞추게 됩니다. 즉 상대방이 받을 수 있는 크기에 맞춰 전송을 하게 됩니다.
- Sliding Windows 동작 방식
송신 버퍼)
– 200 이전의 바이트는 이미 전송되었고 확인 응답을 받은 상태입니다.
– 200~202 바이트는 전송되었으나 확인 응답을 받지 못한 상태입니다.
– 203~211 바이트는 아직 전송이 되지 않은 상태입니다.
수신 윈도우)
– 수신 프로세스가 다음에 처리할 바이트는 194 입니다.
– 수신 윈도우는 200의 수신을 기다리게 됩니다.
송신 윈도우)
– 수신 윈도우보다 작거나 같은 크기로 송신 윈도우를 지정하게 되면 흐름제어가 가능합니다.
– 위와 같이 송신윈도우가 7이라면, 200~202는 전송되었으나 확인응답을 받지 않았고, 203~206은 전송되지 않았지만 전송이 가능한 바이트입니다.
송신 윈도우의 이동)
– before 상태에서 203~204를 전송하면 수신측에서는 확인응답으로 203을 보내고, 송신측은 이를 받아 after 상태와 같이 수신 윈도우를 203~209 범위로 이동시킵니다.
– 그 후, 205~209가 전송 가능한 상태가 됩니다. - 2. Congestion Control(혼잡제어)
송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달됩니다. 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리 할 수 없게 됩니다. 이런 경우 호스트들은 또 다시 재전송을 하게 되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실을 발생시키게 됩니다. 따라서 이러한 네트워크의 혼잡을 피하기 위해 송신측에서 보내는 데이터의 전송속도를 강제로 줄이게 되는데, 이러한 작업을 혼잡제어라 합니다.
또한 네트워크 내에 패킷의 수가 과도하게 증가하는 현상을 혼잡(Congestion)이라 하며 혼잡현상을 방지하거나 제거하는 기능을 혼잡제어라 합니다. 흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해 혼잡제어는 호스트와 라이터를 포함한 보다 넓은 관점에서의 전송 문제를 다루게 됩니다.
혼잡제어 알고리즘)
AIMD(Additive Increase / Multicative Decrease)
처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가하며 전송하는 방법입니다. 만일 패킷전송에 실패하거나 일정 시간을 넘으면 패킷을 보내는 속도를 절반으로 줄이게 됩니다.
이 방식은 공평한 방식으로 사용하는 여러 호스트가 한 네트워크를 공유하고 있다면 후 진입하는 호스트가 처음에는 불리하지만 시간이 흐르면 평형 상태로 수렵하게 되는 특징이 있다.
문제점은 초기 네트워크의 높은 대역폭을 사용하지 못하여 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지는 못한다는 점이다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
Slow Strat)
합-증가/곱-감소 방식이 네트워크의 수용량 주변에서는 효율적으로 작동하지만 처음에 전송 속도를 올리는 데 걸리는 시간이 너무 길다는 단점이 있다. 이 방식도 위와 마찬가지로 패킷을 하나씩 보내는 것부터 시작하고 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다. 즉, 한 주기가 지나면 window size가 2배가 된다. 따라서 전송 속도는 합-증가/곱-감소와는 다르게 지수 함수 꼴로 증가하게 된다. 대신에 혼잡 현상이 발생하면 window size를 1로 떨친다. 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있으므로 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시키는 방식이다.
Fast Retransmit(빠른 재전송)
빠른 재전송은 TCP의 혼잡 조절에 추가된 정책입니다. 패킷을 받는 쪽에서 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보내게 됩니다. 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACk 패킷에 실어서 보내게 되므로 중간에 패킷 하나가 손실되게 되면 보내는 측에서는 순번이 중복된 ACK 패킷을 받게 되고, 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송해 줄 수 있습니다. 빠른 재전송은 중복된 순번의 패킷을 3개 받으면 재전송을 하게 됩니다. 이런 현상이 일어나는 것은 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 Windows Size를 줄이게 됩니다.
Fast Recovery(빠른 회복)
빠른 회복 정책은 혼잡한 상태가 되면 Window Size를 1로 줄이지 않고 반으로 줄이고 선형 증가시키는 방식입니다. 빠른 회복 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 합-증가/곱-감소 방식으로 동작하게 됩니다.