Network

CS 네트워크 TCP/IP 흐름제어 & 혼잡제어

차가운개발 2024. 10. 14. 15:02

 

TCP 통신이란 네트워크 통신에서 신뢰적인 연결 방식을 의미한다. 기본적으로 Reliable Network를 보장할 수 있도록 하는 프로토콜이다.

 

  • Unreliable
    전송한 데이터그램이 유실될 수 있고, 순서가 바뀌어 도착할 수 있다.
  • Reliable
    세그먼트가 유실될 경우 재전송을 통해 복구해주며, 순서가 바뀌어 도착하더라도 순서 번호를 이용하여 제대로 맞추어 전달한다. 

 

ㅇ Reliable Network의 문제점

  • 손실
    packet이 손실될 수 있는 문제
  • 순서 바뀜
    packet의 순서가 바뀔 수 있는 문제
  • Congestion
    네트워크가 혼잡한 문제
  • Overload
    receiver가 overload되는 문제

** TCP의 전송 제어 방법은 데이터의 양을 조절하는 흐름제어, 통신 도중 데이터가 유실되거나 잘못된 데이터가 수신되었을 경우 대처하는 방법인 오류제어, 네트워크 혼잡에 대처하는 혼잡제어로 나누어진다.

 

 

ㅇ 흐름 제어

수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제 없다. 그러나 수신 측의 처리 속도보다 송신 측이 더 빠른 경우 문제가 발생한다. 송신과 수신측은 모두 데이터를 저장할 수 있는 버퍼를 가지고 있다. 수신측의 데이터 처리 속도보다 송신 측의 데이터 처리 속도가 더 빠르다면 언젠간 수신측의 버퍼는 꽉 차버릴 것이다. 저장 용량을 초과한 후 도착하는 패킷은 손실될 수 있으며, 손실될 경우 불필요한 패킷 전송이 발생한다.

 

따라서 송신 측은 수신 측의 데이터 처리 속도를 파악하고 얼마나 빠르게 많은 데이터를 전송할지 결정해야한다. 

흐름제어는 송신 측과 수신측의 TCP 버퍼 크기의 차이로 인해 생기는 데이터 처리 속도 차이를 해결하기위한 기법이다. 

 

 

Stop and Wait

 

상대방에게 데이터를 보낸 후 잘 받았다는 응답이 올 때까지 기다리는 모든 방식을 통칭하는 말이다.

매번 전송한 패킷에 대한 확인 응답(ACK)을 받은 후 다음 패킷을 전송한다.

구현 자체가 간단하고 개발자가 작동 원리를 이해하기도 쉬운 편이지만, 패킷을 하나씩 보내기 때문에 비효율적인 방법이다. 비효율성을 커버하기 위해 여러가지 오류 제어 방식을 함께 도입해서 사용한다.

 

 

 Sliding Window

Stop and Wait를 사용하면 비효율적인 부분이 있기 때문에 TCP는 특별한 경우가 아니라면 대부분 슬라이딩 윈도우 방식을 사용한다.

 

수신 측이 한 번에 처리할 수 있는 데이터를 정해놓고 그때 그때 수신 측의 데이터 처리상황을 송신 측에 알려줘서 데이터의 흐름을 제어하는 방식이다.

 

수신 측에서 설정한 윈도우 크기만큼 송신 측에서 확인 응답없이 패킷을 전송할 수 있게하여 데이터 흐름을 동적으로 조절한다. Stop and Wait과 가장 큰 차이점은 송신 측이 수신 측이 처리할 수 있는 데이터의 양을 알고 있다는 점이다.

 

데이터 양의 정보를 알고 있기 때문에 ACK 응답을 주지않아도 데이터의 처리를 예측이 가능하다.

 

 

window

송신 측과 수신 측은 각각 데이터를 담을 수 있는 버퍼를 가지고 있고, 윈도우라는 일종의 마스킹 도구를 가지고 있다. 송신 측은 윈도에 들어있는 데이터를 수신 측의 응답이 없어도 연속적으로 보낼 수 있다.

 

최초의 윈도우 크기는 호스트들의 3-Way Handshake를 통해 수신 측 윈도우 크기로 설정되며 이후 수신 측의 버퍼에 남아있는 공간에 따라 변한다. 윈도우 크기는 수신 측에서 송신 측으로 확인 응답을 보낼 때 TCP 헤더에 담아 전달한다. 이 때 서로 현재 버퍼 크기를 공유하게 되고 송신 측은 수신 측의 버퍼 크기를 사용하여 자신의 윈도우 크기를 결정한다.

 

3-Way Handshake의 동작 과정에서

1번 : 송신의 버퍼 크기

2번 : 수신의 버퍼 크기

3번 : 윈도우 크기를 결정한다.

 

 

ㅇ 혼잡 제어

데이터의 양이 라우터가 처리할 수 있는 양을 초과하면 초과된 데이터는 라우터가 처리하지 못한다. 송신 측에서는 라우터가 처리하지 못한 데이터를 손실 데이터로 간주하고 게속 재전송하여 네트워크를 혼잡하게 만든다. 

네트워크의 혼잡을 피하기 위하여 송신 측에서 보내는 데이터의 전송 속도를 강제로 줄이게 되는데 이러한 작업을 혼잡 제어라고한다.

 

흐름제어 : 송신, 수신 사이의 패킷 수를 제어하는 기능

혼잡제어 : 네트워크 내의 패킷 수를 조절하여 네트워크의 오버플로우를 방지하는 기능

 

** 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다루게 된다.

 

  • AIMD(Additive Increase/Multiplicative Decrease)
    AIMD 방식은 처음에 패킷을 하나씩 보내고, 문제 없이 도착하면 윈도우의 크기를 1씩 증가시키며 전송한다. 전송에 실패하거나 일정 시간을 넘기면 윈도우의 크기를 반으로 줄인다.
    여러 호스트가 한 네트워크를 공유하여 나중에 진입하는 쪽이 처음에 불리하지만 시간이 흐르면서 평형상태로 수렴한다.
  • Slow Start(느린 시작)
    AIMD 방식은 윈도우 크기를 선형적으로 증가시키기 때문에 제대로 된 속도가 나오려면 시간이 오래걸린다.
    Slow Start는 윈도우의 크기를 1, 2, 4, 8 과 같이 지수적으로 증가시키다 혼잡이 감지되면 윈도우의 크기를 1로 줄이는 방식이다. 시간이 가면 갈수록 윈도우의 크기가 점점 빠르게 증가하는 장점이 있다.
  •  Fast Retransmit(빠른 재전송)
    패킷을 받는 수신자 입장에서는 세그먼트로 분할된 내용들이 순서대로 도착하지 않는 경우가 발생할 수 있다.
    이런 상황이 발생하면 수신 측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어 보낸다
    그리고 이런 중복 ACK를 3개 받으면 재전송이 이루어진다. 송신 측은 자신이 설정한 타임 아웃 시간이 지나지 않아도 바로 해당 패킷을 재전송할 수 있어 빠른 재전송률을 유지할 수 있다.
  • Fast Recovery(빠른 회복)
    빠른 회복은 혼잡한 상태가 되면 윈도우 크기를 1로 줄이지 않고, 반으로 줄이고 선형 증가시키는 방법이다. 이 방법을 적용하면 혼잡 상황을 한 번 겪고나서부터는 AIMD 방식으로 동작한다. 이것을 게속 반복한다.