소켓에서 버퍼링을 하는 이유는 성능 최적화와 데이터 무결성 보장이다.
시스템 호출 최소화
소켓을 통해 데이터를 주고받을 때, 시스템 호출( send(), recv() )은 매우 비용이 크다
- 네트워크 입출력은 커널 공간과 유저 공간을 오가야 하는데, 시스템 호출이 발생할 때마다 문맥교환이 일어난다.
- 문맥교환은 오버헤드가 크기 때문에, 자주 호출하는 것보다 한 번에 큰 덩어리로 처리하는 것이 훨씬 효율적이다.
- 버퍼를 사용하면 소량의 데이터를 보낼 때마다 시스템 호출을 하는 것이 아닌, 일정 크기만큼 모아서 (=버퍼링) 한 번에 보냄으로써 성능 향상을 기대할 수 있다.
네트워크 트래픽 감소
- 네트워크는 패킷 단위로 데이터를 전송하는데, 너무 작은 패킷을 자주 전송하면 오버헤드와 지연이 발생한다.
- 버퍼링을 사용하면 작은 데이터 여러 개를 하나의 패킷으로 묶어서 전송하여 네트워크 부하를 줄일 수 있다.
데이터 손실 방지
- 송신 측과 수신 측의 속도가 다를 수 있다. ( 예: 빠른 서버 <-> 느린 클라 )
- 만약 버퍼가 없다면, 수신 속도가 느릴 때 송신된 데이터가 사라질 수 있다.
- 이를 방지하기 위해 수신 버퍼를 사용하여 데이터가 안정적으로 도착할 때까지 저장해야한다.
패킷 순서 보장 및 데이터 무결성 유지
- TCP와 같은 프로토콜에서는 패킷이 순서대로 도착하도록 버퍼를 활용하여 정렬 및 재조합을 한다.
- 예를 들어, 네트워크 상태가 불안정할 경우 패킷이 순서대로 도착하지 않을 수도 있는데, 버퍼를 사용하여 이를 재조립한다.
위와 같은 이유로 버퍼링이 꼭 필요하다.
'네트워크' 카테고리의 다른 글
[네트워크] 멀티쓰레드 채팅 서버 (0) | 2025.04.13 |
---|---|
[네트워크] 멀티 쓰레드 Echo (0) | 2025.04.11 |
[네트워크] Nagle's Algorithm ( 네이글 알고리즘 ) (0) | 2025.04.09 |
[네트워크] Echo Server, Echo Client (0) | 2025.04.09 |
[네트워크] 웹 서버, 웹 어플리케이션 서버 (0) | 2024.08.27 |