iBetter Books
수정

받는 쪽의 사정을 배려하다

아무리 빠른 전송도 받는 쪽이 따라가지 못하면 소용없습니다. 상대가 처리하는 속도보다 훨씬 빨리 보내면 데이터가 수신 버퍼에 쌓이다가 결국 넘쳐 버립니다. 넘친 데이터는 조용히 사라집니다. 그 사라진 데이터를 다시 보내야 하고, 그 과정이 반복되면 오히려 전체 처리량이 뚝 떨어집니다. 빠르게 보내려다 더 느려지는 역설입니다.

버퍼라는 창고의 한계

받는 쪽 장치는 네트워크에서 들어오는 데이터를 버퍼라는 임시 창고에 저장해 두고, CPU나 응용 프로그램이 가져갈 때까지 기다립니다. 창고 크기는 유한합니다. 보내는 속도가 가져가는 속도보다 빠르면 창고가 가득 차고, 이후 들어오는 데이터는 받을 곳이 없어 버려집니다.

이 문제를 흐름 제어라고 부릅니다. 보내는 쪽의 전송 속도를 받는 쪽의 처리 능력에 맞게 조절하는 메커니즘입니다. 흐름 제어가 없는 세상을 상상해 보십시오. 빠른 서버가 느린 장치에 데이터를 쏟아내고, 느린 장치는 받는 척하다가 사실 절반을 버리고 있는 상황입니다.

멈춰달라는 신호

흐름 제어의 가장 단순한 형태는 받는 쪽이 "잠깐 멈춰"라고 신호를 보내는 것입니다. 이더넷에는 이를 위한 PAUSE 프레임이 존재합니다. 스위치나 장치가 버퍼가 가득 차기 전에 PAUSE 프레임을 보내면, 상대방은 지정된 시간 동안 전송을 멈춥니다. 버퍼가 비면 다시 전송을 재개합니다.

이 방식은 단순하고 효과적이지만 하나의 연결에만 적용됩니다. 여러 장치가 혼재된 네트워크에서는 더 정교한 조절이 필요합니다. 그 역할을 주로 맡는 것이 전송계층, 특히 TCP입니다. TCP의 윈도우 크기 조절은 PART 05에서 깊이 다룹니다.

흐름 제어와 혼잡 제어의 차이

흐름 제어는 보내는 쪽과 받는 쪽, 단 둘 사이의 속도를 맞추는 일입니다. 받는 쪽의 버퍼를 보호하는 것이 목적입니다. 혼잡 제어는 다릅니다. 네트워크 경로 전체, 즉 중간 라우터들이 감당할 수 있는 양을 초과해서 보내지 않도록 조절하는 것입니다. 흐름 제어는 상대방을 배려하는 것이고, 혼잡 제어는 길 전체를 배려하는 것입니다.

데이터링크계층에서는 주로 흐름 제어를 다루고, 혼잡 제어는 전송계층의 영역입니다. 다음 절에서는 흐름 제어를 구현하는 대표적인 방식인 Stop-and-Wait과 슬라이딩 윈도우를 비교해 봅니다.