[Network] TCP의 흐름 제어

영근·2024년 10월 12일
0

Network

목록 보기
6/9
post-thumbnail

Intro

지난 포스팅에서, <IT엔지니어를 위한 네트워크 입문> 4장의 TCP에 대해 공부했습니다.

책에서는 TCP가 효율을 위해 많은 양의 패킷을 한 번에 주고 받은 뒤, 응답을 하나만 받으며, 그 방법으로 슬라이딩 윈도우를 사용하고 있다고 간략히 설명하고 있으나, 그 구체적인 방법이 궁금해져 이번 포스팅을 작성하며 공부해보려 합니다.


흐름 제어

TCP는 데이터 전송의 신뢰성을 확보하기 위해 상대가 패킷을 잘 받았는지를 ACK 넘버를 통해 확인합니다. 이렇게 확인 절차가 있는 프로토콜이다보니, 그 횟수가 많아진다면 데이터 전송의 효율이 떨어지게 됩니다. 따라서 한 번에 많은 패킷을 보내는 방법을 선택합니다.

하지만 패킷을 주고 받는 과정에 영향을 미치는 요소는 굉장히 다양하며, 송신 측과 수신 측의 데이터 처리 속도 또한 다르기 때문에 서로 과하지 않은 적당한 속도와 용량으로 패킷을 주고 받아야 합니다.

이 '적당한 속도와 용량'을 네트워크 과정에서 유연하게 결정하는 것을 흐름 제어라 하며, 자신이 처리할 수 있는 데이터의 양을 윈도 사이즈라 합니다.

수신 측이 이 윈도 사이즈를 송신 측에 보내면, 송신 측에서는 이를 확인하고 윈도 사이즈와 RTT 등을 통해 파악한 네트워크 상황을 고려해 알맞은 양의 데이터를 보내게 됩니다.

흐름제어 방법에는 아래의 두 가지 방법이 있습니다.

  • Stop N Wait
  • Sliding Window

Stop N Wait

Stop N Wait는 데이터를 보낸 후, 받은 쪽에서 잘 받았다는 응답이 올 때까지 기다리는 방법입니다. 이름만 봐도 알 수 있듯이(?) 오버플로우 될 일은 없지만, 비효율적이다는 단점이 있습니다.


Sliding Window

Stop N Wait 방식의 흐름 제어는 그 비효율성 때문에 현재는 잘 사용되지 않습니다.
조금 더 효율을 챙기는 흐름 제어 방식으로는 Sliding Window가 있습니다.

슬라이딩 윈도우는 서로 주고 받을 수 있는 데이터의 양(윈도 사이즈)을 정해놓고, 수신 측이 데이터 처리 상황을 ACK 넘버를 통해 알려주며 흐름을 제어하는 방식입니다.

그림을 보면, 윈도 사이즈가 7로 설정된 상태입니다. 처리 과정은 아래와 같습니다.

  • 송신 측에서 0, 1, 2, 3, 4, 5, 6을 보냅니다
  • 수신 측에서 처리 완료된 만큼의 응답을 보냅니다. 0, 1이 처리가 완료되었다면 수신 측에서 ACK 넘버를 2로 보냅니다.
  • 송신 측에서 ACK 2를 받은 뒤, 윈도우가 2칸 이동해 2 ~ 0까지가 된 것을 확인할 수 있습니다.

이 때, 아무 옵션도 설정되지 않은 TCP 윈도우의 최대 사이즈는 65,535 bytes입니다. WSCALE(Window Scale) 옵션을 최대로 적용하면 1GB까지도 설정이 가능합니다.

이 슬라이딩 윈도우 기법은 송신 측과 수신 측의 지속적인 커뮤니케이션을 통한 유연한 조절이 가능하다는 장점이 있습니다.

슬라이딩 윈도우 기법 또한 7-80년대에 사용되던 기법으로, 현재는 그 당시보다 윈도우를 몇 개씩 한 번에 보낼 수 있을 정도로 네트워크가 매우 빨라졌습니다.
따라서 아예 ACK 없이 패킷을 전송하는 방식의 Rate Control이 등장하기도 하였습니다.


이미지 출처

profile
Undefined JS developer

1개의 댓글