3.5 수신 버퍼가 가득 차면 발생하는 현상
TCP 수신 함수인 recv()는 1바이트라도 수신할 수 있으면 즉시 리턴합니다. 이외에는 1바이트라도 채워질 때까지 블로킹합니다. 반대로 수신 함수가 수신 버퍼에서 데이터를 꺼내는 속도가 운영체제가 수신 버퍼의 데이터를 채우는 속도보다 느리면 어떻게 되는지 알아봅시다.
TCP는 수신 버퍼에 남은 공간이 하나도 없을 때까지 완전히 채워집니다. 수신 버퍼가 꽉 차면, TCP로 데이터를 보내는 쪽에서는 송신 함수인 send()가 블로킹됩니다. 극단적으로 이 상태에서 TCP recv()를 전혀 하지 않으면 send()도 계속 블로킹 상태를 유지합니다. 이 상태에서는 TCP 통신은 전혀 없고 TCP 연결만 살아 있는 것입니다.
정리하자면, TCP 송신 함수로 송신 버퍼에 데이터를 쌓는 속도보다 수신 함수로 수신 버퍼에서 데이터를 꺼내는 속도가 느리다고 해서 TCP 연결은 끊어지지 않습니다. 단지 실제 송신 속도가 느린 쪽에 맞추어 작동할 뿐입니다. TCP 신뢰도가 괜히 높은 것이 아닙니다.
▲ 그림 3-14 송신 버퍼에 데이터를 채우는 속도보다 수신 함수가 데이터를 꺼내는 속도가 느릴 때(TCP)