소켓에서 버퍼링을 하는 이유는 성능 최적화와 데이터 무결성 보장이다.

 

시스템 호출 최소화

소켓을 통해 데이터를 주고받을 때, 시스템 호출( send(), recv() )은 매우 비용이 크다

  • 네트워크 입출력은 커널 공간과 유저 공간을 오가야 하는데, 시스템 호출이 발생할 때마다 문맥교환이 일어난다.
  • 문맥교환은 오버헤드가 크기 때문에, 자주 호출하는 것보다 한 번에 큰 덩어리로 처리하는 것이 훨씬 효율적이다.
  • 버퍼를 사용하면 소량의 데이터를 보낼 때마다 시스템 호출을 하는 것이 아닌, 일정 크기만큼 모아서 (=버퍼링) 한 번에 보냄으로써 성능 향상을 기대할 수 있다.

 

네트워크 트래픽 감소

  • 네트워크는 패킷 단위로 데이터를 전송하는데, 너무 작은 패킷을 자주 전송하면 오버헤드와 지연이 발생한다.
  • 버퍼링을 사용하면 작은 데이터 여러 개를 하나의 패킷으로 묶어서 전송하여 네트워크 부하를 줄일 수 있다.

 

데이터 손실 방지

  • 송신 측과 수신 측의 속도가 다를 수 있다. ( 예: 빠른 서버 <-> 느린 클라 )
  • 만약 버퍼가 없다면, 수신 속도가 느릴 때 송신된 데이터가 사라질 수 있다.
  • 이를 방지하기 위해 수신 버퍼를 사용하여 데이터가 안정적으로 도착할 때까지 저장해야한다.

 

패킷 순서 보장 및 데이터 무결성 유지

  • TCP와 같은 프로토콜에서는 패킷이 순서대로 도착하도록 버퍼를 활용하여 정렬 및 재조합을 한다.
  • 예를 들어, 네트워크 상태가 불안정할 경우 패킷이 순서대로 도착하지 않을 수도 있는데, 버퍼를 사용하여 이를 재조립한다.

 

위와 같은 이유로 버퍼링이 꼭 필요하다.

+ Recent posts