TCP 통신은 네트워크 통신에서 신뢰적인 연결 방식이며, 가장 큰 특성이 신뢰성이다.
신뢰성이란 중간에 데이터가 유실되지 않는 것을 뜻하는데 이러한 신뢰성을 구성하는 대표적인 방법으로 흐름 제어, 혼잡 제어가 있다.
흐름제어(Flow Control)란?
- 송신측과 수신측의 데이터 처리 속도 차이를 해결하기 위한 기법이다.
- 송신측의 데이터 전송량을 제어한다.
- 송신 측이 빠를 때 수신 측 버퍼가 넘치는 오버플로우 문제가 발생한다.
이러한 문제를 줄이기 위해 윈도우 크기로 송신 측의 데이터 전송량을 조절한다.- 수신측의 buffer(임시 저장 공간)는 제한된 크기를 가진다. buffer가 담을 수 있는 크기를 초과하게 되면, 그 이후에 도착하는 데이터를 버퍼에 담지 못하고 손실된다. (손실되면 불필요한 응답 및 데이터 전송이 발생한다)
흐름제어 방식
- Stop and wait 방식
- 데이터를 담아 패킷을 보낼 때마다 확인 응답(ACK)을 받아야만 그다음 패킷을 전송할 수 있다.
- 큰 사이즈의 연속적인 프레임을 작게 나누어 전송해야한다.
- 전송이 길어지면 오류 발생확률이 높아진다.
- 멀티포인트 통신방식의 경우 회선 점유율이 길어지기 때문에, 다른 부스테이션들의 지연이 발생할 수 있다.
- 장점: 구현방법이 단순하고 송신 측 내에 최대 프레임 크기의 버퍼를 1개만 잡아도 된다.
- 단점: 하나를 보낼때마다 응답을 받아야 하기 때문에 속도가 느리고 비효율적이다.
- Sliding window 슬라이딩 윈도우 기법(Go Back N ARQ)
![]()
- 수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답 없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 방법이다.
- 수신 측이 한 번에 처리할 수 있는 데이터의 양(윈도우 크기)을 3 way handshake할 때 송신 측에 전달한다.
- 데이터가 전송되었지만 ack 를 받지 못한 데이터의 byte 숫자를 파악하기 위해 사용한다.
- 상대방에게 응답을 받지 않아도 범위 내에서 데이터를 보낼 수 있다.
- 패킷의 왕복 시간(RTT)이 크다면 네트워크가 혼잡하다고 생각하여 윈도우 크기를 실제 버퍼의 크기보다 작게 설정한다.
- 통신 과정 중에도 네트워크 혼잡 등의 조건을 통해 윈도우 크기는 유동적으로 설정된다.
- 윈도우 : 송신, 수신 스테이션 양쪽에서 만들어진 버퍼의 크기
(윈도우의 크기) = (가장 최근 ACK로 응답한 프레임 수) - (이전에 ACK 프레임을 보낸 프레임 수)- 동작 방식
: 수신측에서 설정한 윈도우에 포함되는 모든 패킷을 전송하고
패킷들의 전달이 확인되는 대로 윈도우를 옆으로 옮겨 그다음 패킷을 전달받는다.
혼잡제어(Congestion Control)
- 송신측의 데이터 전달과 네트워크 상의 데이터 처리 속도 차이를 해결하기 위한 기법이다.
- 송신측의 데이터 전송 속도를 제어한다.
- 송신측에서 수신측으로 데이터를 전송할 때, 데이터는 지역망 또는 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 하나의 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 된다.
이러한 경우 송신측은 다시 재전송하게 되고, 이는 혼잡(네트워크 내에 패킷의 수가 과도하게 증가하는 현상)만 가중시키게 된다.
결국 오버플로우나 데이터 손실이 발생한다. 이러한 네트워크 혼잡을 피하기 위해서 송신측에서 보내는 데이터의 전송속도를 강제로 줄이는 작업인 혼잡제어가 필요하다.
혼잡제어 방식
1. AIMD (Additive Increase Multicative Decrease)
- 처음에 패킷을 하나씩 보내고 문제가 발생하지 않으면 윈도우 크기를 1씩 증가하는 방법이다.
- 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷 전송 속도를 절반으로 줄인다.
- 네트워크에 늦게 들어온 호스트가 처음에는 불리하지만, 시간이 흐르면서 평형상태로 수렴한다.
- 단점
- 처음에 전송 속도를 올리는 데 시간이 오래걸린다.
- 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다.
즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄인다.
- Slow Start
- AIMD의 단점을 극복하기 위한 방법으로 패킷을 하나씩 보내기 시작하고 문제없이 잘 도착한다면 ACK 패킷마다 윈도우 크기를 1씩 늘리며 하나의 주기가 끝나면 윈도우의 크기는 2배가 된다.
- AIMD와 달리 전송 속도를 지수 함수 꼴로 증가시켜서 윈도우 크기를 더 빠르게 증가시킨다.
- 혼잡이 감지되면 윈도우 크기를 1로 줄인다.
- 처음에는 네트워크 수용량을 예상할 수 있는 정보가 없지만, 한 번 혼잡 현상이 발생한 후에는 네트워크의 수용량을 어느 정도 예상할 수 있다.
-그래서 혼잡 현상이 발생하는 윈도우 크기의 절반가지는 지수 함수 꼴로 윈도우 크기를 증가시키고 그 이후에는 완만하게 1씩 증가시킨다.
- 빠른 재전송(Fast Retransmission)
- 수신측에서 먼저 도착해야할 패킷이 아닌 그 다음 패킷이 도착한 경우에도 ack 패킷을 송신측에 보낸다.
- 순서대로 잘 도착한 마지막 패킷의 그 다음 패킷 순번을 ack 패킷에 실어 송신측에 보낸다.
- 만약 중간에 패킷이 손실된 경우, 송신측은 수신측으로부터 순번이 중복된 ack 패킷을 받게 된다.
- 이를 감지하면 송신측은 손실된 패킷을 재전송해준다.
- 중복된 순번의 패킷을 3개 받으면 재전송을 하고 혼잡한 상황임을 감지하여 window size를 줄인다.
- 빠른 회복(Fast Recovery)
- 혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형 증가시키는 방법이다.
- 혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작하게 된다.
🙇 참고 사이트 🙇
https://hammii.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-TCPIP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%EC%99%80-%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4 https://doh-an.tistory.com/29 https://benlee73.tistory.com/186