dev-writeup-2024 / january

개발 1일 1글 스터디
2 stars 0 forks source link

[01-15] 빈고는 못말려: 정체를 부르는 공포의 화도IC 로드 [네트워크 4편 - 흐름, 혼잡 제어] #59

Open Kjm04175 opened 9 months ago

Kjm04175 commented 9 months ago

서론

때는 바야흐로 202X년 여름. 빈고를 포함한 친구 일동은 연휴맞이 속초 여행을 기획했습니다. 연휴에 많은 차들이 휴양지로 몰릴 것을 예상했기에 시간대와 동선 전략도 미리 수립해 놓았습니다!

남은 것은 속초에 일찍 도착해서 즐기는 것 뿐! 일행은 파란 아반떼를 타고 여행을 시작합니다. 시장에서 전과 튀김, 다양한 해산물을 구매하고 수제 맥주를 즐길 생각을 하니 미소가 가시 질 않습니다.

하지만, 어쩐지 오늘따라 신호에 자주 걸리고 하늘도 우중충하네요... 시내의 도로부터 차가 꽤 많은 것 같기도 해요. 불안함이 엄습합니다.

모두 속초 여행 초행길이었기에, 네비게이션에 의존해 길을 찾아갑니다. 엥? 그런데 갑자기 네비게이션이 좌회전을 지시합니다. 직관적으로 봤을 때 무조건 직진을 해야 하는데?

다행히 빈고는 #19 에서 길 찾기 알고리즘을 공부해 두었기에, 직진이 최단 거리라는 것을 쉽게 계산할 수 있었습니다. 멍청한 고철 네비 같으니! 뉴스에서는 인공지능의 시대니 뭐니 하지만, 기계는 인간의 직관을 이기지 못하는 것 같네요.

그리고 등장한 것은 '화도 IC' 눈을 의심할 수 밖에 없는 풍경이었습니다. 도로에 주차 된 듯 움직이지 못하는 차량들은 마치 수나라의 100만 대군을 연상케 했고, 네비게이션 화면에 붉은색으로 물들어 있는 도로는 공포 그 자체였습니다. 설상가상으로, 추적 추적 내리기 시작하는 비는 호러 분위기를 가중 시켰죠.

자동차의 경적 소리가 마치 운전자들의 비명 소리 같습니다. 빈고는 눈 앞이 깜깜해지는 것을 느끼며, 다시는 기계에게 반항하지 않겠다 속으로 다짐합니다. 이들의 여정은 어떻게 되는 걸까요?

image

To be continue...

오늘은 네트워크 상에서 '화도 IC' 사태를 막기 위해 고안 된 방법인 '흐름 제어와 혼잡 제어'에 대해 알아보겠습니다.

그래서 이게 뭔데? [흐름 제어와 흔잡 제어란?]

흐름 제어

네트워크 상에는 송신, 수신 측이 존재합니다. 여기서 수신 측의 처리 속도가 빨라서 메세지가 들어오는 족족 처리할 수 있다면, 이 세상에 정체 문제는 발생하지 않을겁니다. 화도 IC의 경우도, 많은 차선에서 우르르 들어오는 차량보다 더 빠르게 내보낼 수 있었다면 정체가 없었겠죠.

하지만 안타깝게도 현재 인터넷은 그렇지 않아요.

너무 많은 정보가 수신 측에 전달되면 정보는 메모리에 쌓이게 되고, 축적된 정보량이 저장 공간을 초과하면 이후 정보는 손실 됩니다.

이 때, 버퍼 차이로 인해 생기는 데이터 속도의 차이를 해소하기 위한 방법이 흐름 제어입니다!

흐름 제어 기법에는 Stop&Wait, Sliding window가 있습니다.

혼잡 제어

데이터의 양이 라이터가 처리할 수 있는 양을 초과해버리면, 처리하지 못한 데이터를 손실 데이터라고 생각하고 계속 재전송을 해버립니다.

이 때 재전송 된 패킷이 네트워크를 혼잡하게 만드는 현상이 바로 혼잡입니다. 이런 혼잡은 송신측이 전송 속도를 적절히 조절하면서 진행할 수 있는데, 이것을 혼잡 제어라고 부릅니다.

혼잡 제어 기법의 일종으로는 AIMD, Slow start, fast retransmit, fast recovery 등이 존재합니다.

이제 이 둘이 뭔지는 알았으니, 어떻게 수행하는지 알아봅시다.

이 둘을 어떻게 수행하나요? [흐름, 혼잡 제어의 방법]

흐름 제어의 방법

Stop and Wait

Stop and wait는 패킷에 대한 응답인 ACK을 받았을 때 다음 패킷을 전송하는 방법입니다. 하지만, 패킷을 하나 씩 전송한다는 측면에서 효율성이 떨어진다고 볼 수 있습니다.

Sliding window

Sliding window는 수신 측에서 패킷의 사이즈를 조절하는 기법입니다. 수신자가 자신의 처리 속도에 맞게 패킷 사이즈를 조절할 수 있기 때문에 흐름 제어를 수행할 수 있게 됩니다! 최초의 연결에서는 3 way handshaking을 이용해 사이즈를 정하고, 이후 ack에서 윈도우 사이즈를 조절합니다.

위와 같이 데이터를 전송하고 ack을 받기 전까지 데이터를 전송하며, ack을 받았을 때 슬라이딩 윈도우를 이동합니다.

혼잡 제어의 방법

Adaptive increse / Multicative decrease (AIMD)

AIMD는 합 증가, 곱 감소 방식이라는 뜻입니다. 처음에 패킷을 하나 보내고 문제 없이 도착했을 때, 윈도우 크기를 하나 증가 시킵니다. 이 과정은 네트워크의 상태를 고려하며 점진적으로 큰 사이즈의 정보를 전송하기 위함입니다.

반면, 전송에 실패할 경우 윈도우 크기를 반으로 줄입니다. 네트워크 혼잡에 의해 정보를 잃는 경우는 네트워크에서 고려할 수 있는 최악의 경우이기에, 해당 경우를 방지하기 위해 상대적으로 극단적인 처방을 한 모습입니다.

즉, AIMD의 기초는 돌다리도 두드려 보며 천천히 데이터 사이즈를 증가 시키되, 불안정한 경우에는 과감히 데이트 사이즈를 줄이는데 있습니다.

Slow start

하지만 기본적인 AIMD의 경우 선형적으로 윈도우 사이즈를 증가 시키기 때문에 속도를 잃고 그것을 복구하는데 많은 시간을 소요 합니다.

Slow start는 그 문제를 해소하기 위해 윈도우 사이즈를 지수 승 (1 -> 2 -> 4 -> 8 -> 16) 순으로 증가시키다, 혼잡이 감지됐을 때 윈도우 사이즈를 1로 급격히 줄이는 방식입니다.

이 방식의 경우 혼잡 시 사이즈를 1로 줄인다는 리스크를 갖고 있음에도 급격하게 윈도우 사이즈를 증가시킬 수 있기 때문에 기본 AIMD의 단점을 상쇄해 줍니다.

Fast retransmit

빠른 회복은 혼잡 상태가 되었을 때, 윈도우 크기를 1로 급감 시키지 않고 선형으로 증가시키는 방법입니다.

이것은 한번의 혼잡으로 사이즈가 1로 급감하는 slow start의 문제를 해소한 것입니다.

요약하면, slow start를 통해 최적의 윈도우 사이즈를 대략적으로 잡은 후, AIMD를 통해 fine tuning 한다고 보시면 될 것 같습니다.

결론

image

오늘은 흐름 제어와 혼잡 제어에 대해 알아보았습니다. 인터넷 이용자들이 많아지고 네트워크 내 정보량이 많아짐에 따라 흐름 제어, 혼잡 제어는 필수적인 요소가 되었습니다. 특히 혼잡 제어의 경우 다양한 기능들이 연동되어 동작하기 때문에 알아두면 좋을 것 같네요.

흐름 제어와 혼잡 제어를 통한 인터넷 통신망의 제어는 실제 도로 상황에서도 어느 정도 적용이 되고 있습니다. 교통 경찰의 제어 등이 그 역할을 하고 있다고 볼 수 있죠.

하지만 빈고의 여행에서는 교통 체중으로 인해 교통 경찰이 도착하지 못했다고 합니다. 빈고가 숙소에 도착한 것은 오후 6시. 곧 저녁 먹고 잘 시간이네요.

[이 이야기는 실화를 바탕으로 재구성 되었습니다.]

참고자료

https://steady-coding.tistory.com/507

steammando commented 9 months ago

ㅋㅋㅋㅋㅋㅋㅋㅋ크아아악 화도IC!!!!!

snaag commented 9 months ago

ㅋㅋㅋㅋㅋㅋㅋㅋ 박진감넘치는 스토리 잘 봤습니다... 그래서 빈고친구들은 잘 탈출했나요?