결론부터 이야기하자면 TCP는 흐름 제어, 오류 제어, 혼잡 제어 3가지 제어기능이 있다.
이 3가지 기능에 대해서 자세하게 살펴보자.
1. 흐름 제어
-> 송신 측과 수신 측의 데이터 처리 속도가 다를 때 오류가 생길 수 있기 때문에 전송되는 데이터의 양을 조절하는 흐름 제어기능이 있다.
( 수신 측의 데이터 처리속도가 빠르면 문제 되지 않지만, 송신 측의 속도가 빠를 경우 문제가 된다 -> 수신 측의 데이터 용량을 초과한 이후에 도착한 패킷이 손실되거나 수신 측 버퍼가 넘치는 오버플로우 발생 가능!)
따라서, 송신 측의 데이터 전송량을 조절!!
해결 방법
1. Stop and Wait : 매번 전송한 패킷에 대한 응답(ACK)을 받은 후에 다음 패킷을 보내는 방법
(https://benlee73.tistory.com/186 에서 그림 활용하였습니다.)
하지만, 이런 식으로 하면 많은 패킷을 주고 받아야 하는데 상당히 비효율적 입니다.
2. Sliding Window : 송신 측이 수신 측에서 받은 윈도우 크기를 참고해서 데이터의 흐름을 제어하는 방식
- 최초 윈도우 사이즈 = 7(0~6 까지) 설정
- 송신자(sender)는 수신자(receiver)의 응답(ack)를 받기 전까지 데이터를 전송
- 수신자(receiver)는 응답(ack)를 송신자(sender)에게 보내면, 슬라이딩 윈도우 사이즈를 충족할 수 있게 윈도우를 옆으로 옮기며 데이터를 모두 전송할때까지 반복
윈도우 크기 = 수신 측이 한번에 처리할 수 있는 데이터의 양으로 3 way handshake할 때 송신 측에 전달되며 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다.
(https://steady-coding.tistory.com/507에서 그림 활용하였습니다.)
2. 오류 제어
-> TCP는 통신 중에 오류가 발생하면 해당 데이터를 재전송하는데 이때 재전송 기반 오류 제어 ARQ(Automatic Repeat Request)를 사용
오류를 알 수 있는 방법
- 송신 측이 ACK를 받지 못함 (데이터 유실 or ACK 유실 )
- 중복된 ACK 수신
- 수신 측이 NACK(부정응답)을 보냄
해결 방법
1. Go Back N : 오류 발생 지점부터 재전송
(https://benlee73.tistory.com/186 에서 그림 활용하였습니다.)
- 성공적으로 전송된 데이터까지 재전송하기 때문에 비효율적 *
2. Selective Repeat : 오류가 발생한 데이터만 재전송하는 방식
(https://benlee73.tistory.com/186 에서 그림 활용하였습니다.)
- 수신 측 버퍼의 데이터가 순차적이지 않다 -> 정렬 필요 *
3. 혼잡 제어
-> 네트워크 내 패킷 수가 급증하는 현상(혼잡)을 방지하고 제거하기 위한 기능
혼잡 제어 기법
1. AIMD(Additive Increase/Multicative Decrease) : 처음에 패킷을 하나씩 보내고 문제 없으면 윈도우 크기 +1, 실패하면 윈도우 크기 / 2
-> 윈도우 크기가 1씩 늘기 때문에 시간이 너무 오래 걸린다
2. Slow Start : 윈도우 크기를 1,2,4,8... 같이 지수적으로 증가시키다가 혼잡이 감지되면 윈도우 크기 1로
-> ACK가 도착할 때마다 윈도우 크기를 증가시키기 때문에 처음에는 윈도우 크기가 조금 느리게 증가할지라도, 시간이 가면 갈수록 윈도우 크기가 점점 빠르게 증가한다는 장점
3. Fast Retransmit : TCP가 받은 데이터 중 3번 이상 중복된 ACK 번호를 받으면 재전송한다.
-> 타임 아웃 시간이 지나지 않아도 해당 패킷을 재전송 가능하기에 빠른 재전송률을 유지한다.