개발놀이터

네트워크 흐름제어와 혼잡제어 (Flow Control, Congestion Control) 본문

CS 지식/네트워크

네트워크 흐름제어와 혼잡제어 (Flow Control, Congestion Control)

마늘냄새폴폴 2024. 1. 13. 18:15

우리가 흔히 말하는 네트워크 통신은 TCP 3way handshaking에 의해 일어납니다. 그리고 TCP에 대해 조금 공부해보신 분들은 UDP와의 차이도 말할 수 있죠. 

 

UDP와 다르게 TCP는 전이중 방식과 점대점 방식 그리고 흐름제어와 혼잡제어를 통해 높은 신뢰성을 줄 수 있다고 말이죠. 

 

잠시 설명하자면 전이중 방식은 전송이 양방향으로 이어진다는 뜻이고 점대점 방식은 각 연결점이 종단점을 가진다는 것입니다. 하지만 흐름제어와 혼잡제어는 그냥 외우기만해서 잘 모르더라구요. 이 부분에 대해서 본격적으로 공부해봤습니다. 

 

흐름 제어

흐름 제어는 송신자와 수신자 사이에 버퍼(데이터를 받을 수 있는 용량)를 관리하기 위해 나온 방법론입니다. 

 

만약 송신자가 수신자에게 엄청나게 큰 데이터를 넘겨준다고 생각해봅시다.

 

우리가 클라우드에 사진을 올리던 메일로 사진이나 동영상같은 큰 파일을 보낼 때 수신자쪽의 용량이 파일보다 작은 경우 데이터의 유실이 발생할 수 있습니다. 

 

그래서 수신자는 파일을 잘 받을 수 있게 송신자와 지속적으로 대화하면서 버퍼의 크기를 늘립니다. 

 

  송신자 : 10GB짜리 영상 보낼게~

  수신자 : 나는 2GB밖에 못받는데 잠시만 기다려. 파일을 조금씩 보내봐

  송신자 : 100MB 갔어? 

  수신자 : 어 갔어 나 지금 용량 두배 늘렸어 좀 더보내봐

  송신자 : 500MB 보낸다~

  수신자 : 오케이 나 두배 더늘렸어~

  송신자 : 이번엔 2GB보낸다~

  수신자 : 어~ 넉넉해~ 또 두배 늘렸어~

  송신자 : 버퍼가 16GB면 내 파일 다 보내도 되겠다 다보낸다~!

 

이런식으로 흐름을 제어해서 버퍼가 꽉 차지 않게 조절하는 것을 의미합니다. 

 

이 방식은 기존 흐름 제어에 사용되던 알고리즘은 Stop and Wait에서 조금 더 업그레이드된 Sliding Window 방식입니다. 

 

Stop and Wait은 만약 10GB를 보내야하는데 수신자의 버퍼가 1GB밖에 안되면 1GB씩 열번 주고 받는것이죠. 

 

  송신자 : 10GB짜리 영상 보낸다~

  수신자 : 보내~

  송신자 : 1GB, 1GB, 1GB, 1GB, 1GB .....

 

이렇게 보내면 조금 느리겠죠? 

 

그래서 Sliding Window 방식이 도입되게 된 것입니다. 순차적으로 보내면서 용량을 조금 씩 늘리게 되면 더 빠르게 데이터 유실을 겪지 않고도 보낼 수 있으니까요. 

 

 

혼잡 제어

혼잡 제어는 예를 들어서 배달의 민족에서 이번주 토요일 12시에 50퍼센트 할인쿠폰 선착순 1000명! 이렇게 큰 이벤트를 하게 되면 과연 서버에 몇명이 몰리게 될까요? 

 

엄청난 혼잡을 예상할 수 있습니다. 

 

이렇게 혼잡하게 되면 데이터도 유실될 뿐만 아니라 서버가 엄청나게 부담이 될 것입니다. 

 

이 그래프를 알기 전 하나만 짚고 넘어가겠습니다. 바로 AIMD (Additive Increase / Mulitiplicative Decrease) 방식입니다. 

 

처음 패킷을 하나씩 보내보고 문제없이 도착하면 window 크기 (단위 시간 내에 보내는 패킷의 수) 를 1씩 증가시켜가며 전송하는 방법입니다. 

 

이 window의 크기를 바탕으로 패킷을 보내는 속도를 제어하는 방법입니다. window는 쉽게 말하자면 서버에 얼마나 패킷이 몰리는지 감시하는 감시자의 역할을 하고 있다고 볼 수 있죠. 

 

AIMD 방식은 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷의 보내는 속도를 절반으로 줄이면서 관리하는데 이 방식은 굉장히 공평하지만 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이라는 문제가 있습니다. 

 

이제 그래프를 해석해보죠. 

 

  1. Slow Start (느린 시작) : AIMD와 마찬가지로 패킷을 하나씩 보내고 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window 크기를 1씩 늘려줍니다. 1씩 늘린다는 것은 한 주기가 지나면 window 사이즈가 2배가 된다는 것이죠. 

    window 크기가 2배가 됨에 따라 전송 속도도 가파르게 올라 지수함수 모양이 됩니다. 대신 혼잡 현상이 발생하면 window 크기를 바닥으로 떨어뜨리게 됩니다. 

  2. Fast Retransmit (빠른 재전송) : 패킷을 받는 쪽에서 순서대로 패킷을 받는게 아니라 나중에 도착한 패킷이 먼저 도착하게 되면 패킷을 재전송합니다. 

    이런 재전송이 세번 일어나게 되면 window 크기를 절반으로 줄입니다. 이는 약간의 혼잡 상태를 의미합니다. 
  3. Fast Recovery (빠른 회복) : 재전송이 세번 발생했다는 것은 혼잡상태를 의미합니다. 혼잡한 상태가 되면 window 크기를 1로 바로 줄이지 않고 선형적으로 window 크기를 늘립니다. 
  4. 안정기 : 패킷이 이제 안정적으로 들어와 더이상 패킷이 혼잡하지 않으면 다시 window 크기를 1로 줄여버립니다. 그리고 이후엔 AIMD방식으로 계속 진행됩니다. 

 

여기서 하나 헷갈릴만한 부분이 window 크기와 패킷의 전송속도와의 상관관계입니다. 

 

한번 정리하고 넘어가면 좋을 것 같네요. 

 

window 크기 : 단위 시간당 전송되는 패킷의 "수"

 

즉, window 크기는 패킷의 수를 조절하는 것이고 전송속도는 window 크기와 일대일 대응되지 않는다는 의미입니다. 

 

이를 그래프로 쉽게 설명해보겠습니다. 

 

전송 속도는 지수함수 형태로 증가하기 때문에 어느정도 선에선 전송 속도를 유지하면서 단위 시간당 들어오는 패킷의 수만 조절하는 것이죠. 

 

 

흐름 제어와 혼잡 제어가 신뢰성에 미치는 영향

흐름 제어와 혼잡 제어를 통해 TCP가 신뢰성을 높일 수 있었던 이유는 무엇일까요? 

 

흐름 제어와 혼잡 제어로 나눠서 간단하게 알아보겠습니다. 

 

흐름 제어

  • 수신자의 과부하를 피할 수 있다 : 흐름 제어는 수신자가 수행할 수 있는 용량보다 더 빠르게 데이터가 전송되는 것을 방지하여서 수신자의 버퍼를 안정화시켜 데이터 로스를 줄입니다. 
  • 역동적인 조절 : TCP는 역동적으로 수신자의 버퍼 사이즈와 수행 능력에 기반한 데이터 전송 비율을 조절할 수 있습니다. 이는 위에서 설명한 sliding window를 이용해 수행할 수 있죠. 
  • 데이터 무결성 보장 : 수신자의 수용량에 따라 송신자의 비율을 맞춤으로써 네트워크 인프라의 과부하를 피할 수 있게 되고 네트워크 과부하는 패킷 로스로 이어질 수 있습니다. 이렇게 패킷이 로스되면 지연시간이 길어지고 신뢰성을 잃게 되겠죠?

 

혼잡 제어

  • 네트워크 오버헤드를 막아준다 : TCP에서 혼잡 제어 매커니즘은 네트워크 인프라의 과부하를 막아주고 패킷 로스를 줄여줍니다. 
  • 전송 비율 조절 : TCP는 위에서 설명한 다양한 알고리즘 (slow start, congestion avoidance, fast recovery, fast retransmit) 등을 이용해서 데이터 전송 비율을 조절합니다. 이는 네트워크를 깔끔하게 만들어주는 역할을 수행합니다. 
  • 패킷 로스 핸들링 : 혼잡 상태여서 패킷이 로스가 되면 TCP는 이를 감지해냅니다. 그리고 재전송하죠. 이 과정에서 데이터는 정상적으로 도착지에 도착하는 것을 보장할 수 있습니다. 

 

 

정리

이렇게 TCP의 신뢰성을 담당하는 흐름 제어와 혼잡 제어에 대해서 알아봤습니다. 나중에 기회가 된다면 전이중 방식과 점대점 방식에 대해서 조금 깊이있게 공부해보고싶네요. 

 

TCP의 이런 신뢰성 덕분에 파일 전송과 같은 신뢰성이 필요한 서비스에서 TCP 연결이 수행됩니다. 뿐만 아니라 일반적인 server to server, server to client 관계에서도 TCP 통신을 사용하죠. 

 

반면 UDP는 TCP와 다르게 데이터 송수신간 여부를 확인하지 않기때문에 패킷 로스가 발생할 수 있어 신뢰성 측면에서 많이 부족하지만 그렇기 때문에 속도가 굉장히 빠르고 다대다 통신이 가능해서 스트리밍 서비스에서 주로 사용됩니다. 

 

여기까지 TCP의 흐름 제어와 혼잡 제어에 대해서 알아봤습니다. 이번엔 이해하는데 꽤 시간이 걸렸던 것 같습니다. 특히 window 크기와 전송 속도를 헷갈려서 더 시간이 걸렸네요. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

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

 

TCP/IP (흐름제어/혼잡제어) | 👨🏻‍💻 Tech Interview

최종 수정 : 12/17/2022, 7:23:59 AM

gyoogle.dev

 

And

Chat GPT 4.0 - Open AI