눈송이의 개발생활

[Network]TCP/IP 흐름제어(Flow Control)와 혼잡제어(Congestion Control) 본문

Computer Science/Network

[Network]TCP/IP 흐름제어(Flow Control)와 혼잡제어(Congestion Control)

꾸지새미언니

TCP

  • TCP 3-way handshake가 완료되면 데이터 교환 시작
  • 데이터 전송의 신뢰성을 확보하기 위해 흐름 제어, 혼잡 제어, 재전송 제어를 조합해가며 전송

unreliable network의 4가지 문제

  1. 손실 : packet 손실되는 문제
  2. 순서 바뀜 : packet의 순서 바뀌는 문제
  3. congestion : 네트워크 혼잡
  4. overload : 수신측(receiver)이 overload되는 문제

 

흐름 제어(Flow Control)

  • 수신측(receiver) 단말이 수행하는 흐름(데이터 전달 속도) 양 조정
  • 송신측(sender)이 수신측(receiver)보다 속도가 빠른 경우 문제가 발생
  • 수신특에서 제한한 저장 용량을 초과한 이후 도착하는 데이터는 손실될 수 있음
  • 위험을 줄이기 위해 수신측에 맞춰 송신 측의 데이터 전송량을 조절해야 함

1️⃣ Stop and Wait

  • 매번 전송한 패킷에 대한 확인(ACK) 응답을 받으면 다음 패킷 전송하는 방법
  • 패킷을 하나씩 보내기 때문에 비효율적

2️⃣ Sliding Window

  • 수신측에서 설정한 window 크기만큼 송신측에서 확인 응답(ACK) 없이 세그먼트 전송
  • 데이터 흐름 동적으로 조절
  • window에 포함되는 모든 패킷 전송 ⇒ 패킷 전달 확인 응답(ACK) 받음 ⇒ window 옆으로 이동 후 해당하는 패킷들 전송
  • window
    • TCP/IP 사용하는 호스트는 송신 window와 수신 window 갖고 있음
    • 3-way handshaking 후 수신특의 receive window size에 송신측이 자신의 send window size 맞춤

3️⃣ 재전송

  • 송신측은 일정 시간동안 수신축으로부터 확인 응답(ACK)을 받지 못하면 패킷을 재전송함
  • 송신측이 재전송했는데 페킷이 소실된 경우가 아니라면 수신측 버퍼에 남는 공간이 없어 문제 발생
  • 이를 해결하기 위해 송신측은 ACK와 window size(남은 buffer size)를 보냄

 

혼잡 제어(Congestion Control)

  • 송신측(sender) 단말이 수행하는 흐름(데이터 처리 속도) 양 조절
  • 네트워크의 혼잡을 제어하기 위해 송신측에서 보내는 데이터의 전송 속도 강제로 줄이는 것
  • 혼잡 : 네트워크 내 패킷 수가 과하게 증하는 현상
  • 혼잡제어 : 혼잡 현상 방지하거나 제거하는 것

1️⃣ AIMD(Additive Increase / Multiplicative Decrease)

  • 처음에 패킷을 하나씩 보내다가 문제가 없으면 window 크기를 1씩 증가시키며 전송
  • 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷 보내는 속도를 절반으로 줄임
  • 공평한 방식
    • 한 네트워크를 여러명이 사용할 경우, 처음에는 나중에 진입한 사람이 불리하지만 시간이 지날수록 평형상태로 수렴
  • 문제
    1. 초기에 높은 대역폭을 사용하지 못해서 시간 오래 걸림
    2. 네트워크 혼잡해지는 상황 미리 감지 
    3. 네트워크가 혼잡해지고 나서야 대역폭 줄임

2️⃣ Slow Start

  • 처음에 패킷을 하나씩 보내다가 문제가 없으면 각각의 ACK 패킷마다 window 크기를 1씩 증가시키며 전송
    • 한 주기 지나면 window size는 2배
  • 전송속도는 지수 함수 꼴로 증가
  • 미리 정해진 임계값에 도달할 때까지 윈도우 크기 2배씩 증가
    • 전송되는 데이터의 크기가 임계값에 도달하면 혼잡 회피 단계로 넘어감
  • 혼잡 현상 발생하면 window size 1로 떨어뜨림
  • 처음에는 네트워크 수용량 예상할 수 없지만 한 번 혼잡 현상이 발생하면 네트워크 수용량 어느정도 예상할 수 있음
    • 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가

Congestion Avoidance (혼잡 회피)

  • 윈도우의 크기 임계값에 도달하면 데이터 손실이 발생할 확률 증가
  • 이를 회피하기 위해 윈도우 크기 선형적으로 1씩 증가시키는 방법
  • 수신측으로부터 일정 시간 ACK를 수신하지 못하는 경우 혼잡 상태로 인식 ⇒ 윈도우 크기 1로 감소 ⇒ 임계값을 패킷 손실이 발생했을 때의 윈도의 크기의 절반으로 줄임

Fast Retransmit

  • 먼저 도착해야할 패킷은 오지 않고 그 다음 패킷이 도착한 경우에도 ACK 패킷을 송신측에 보냄
  • 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보냄
    • 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 됨
    • 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송
  • 중복된 순번의 패킷을 3개 받으면 재전송
  • 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 window size를 줄임

Fast Recovery

  • 혼잡한 상태가 되면 window size를 반으로 줄이고 1씩 선형증가 시키는 방법
  • 혼잡상황을 한 번 겪고 나서부터는 순수한 AIMD 방식으로 동작



참고
https://gyoogle.dev/blog/computer-science/network/%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%20&%20%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4.html
https://steady-coding.tistory.com/507
https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Network/TCP.md

'Computer Science > Network' 카테고리의 다른 글

[Network]HTTP/1.1 HTTP/2.0 HTTP/3.0  (0) 2023.02.07
[Network]HTTP와 HTTPS  (0) 2023.02.07
[Network]TCP와 UDP  (0) 2023.02.03
[Network]TCP 3-way Handshake & 4-way Handshake  (0) 2023.02.03
[Network]REST API  (0) 2023.02.03
Comments