프로그래밍/소켓 프로그래밍 입문

소켓 기반 파일 송/수신의 구조와 원리

데일리 백수 2025. 1. 20. 21:39

파일 송수신은 단순히 문자열을 송수신하는 것과 달리 대용량 데이터를 처리하기 때문에 더 많은 복잡성과 성능 고려가 필요합니다. 이 글에서는 파일 송수신이 네트워크에서 실제로 어떤 과정을 통해 이루어지는지, 소켓 버퍼, 메모리 복사, 그리고 전송 과정에서 발생하는 문제를 중심으로 설명합니다.

 

 

1. 네트워크 파일 송수신의 큰 흐름

1.1 파일 송신 과정

  1. 파일 읽기:
    • 서버는 파일 시스템에서 데이터를 읽어 애플리케이션 버퍼에 저장.
  2. 데이터 전송:
    • 읽은 데이터를 소켓을 통해 네트워크 버퍼로 복사.
    • 운영체제가 이 데이터를 TCP/IP 프로토콜 스택에서 처리 후 전송.
  3. 네트워크 전송:
    • 데이터는 패킷으로 나뉘어 물리적인 네트워크를 통해 클라이언트로 전달.

1.2 파일 수신 과정

  1. 네트워크 데이터 수신:
    • 클라이언트의 네트워크 버퍼로 도착.
  2. 데이터 복사:
    • 운영체제가 네트워크 버퍼에서 애플리케이션 버퍼로 데이터를 복사.
  3. 파일 저장:
    • 클라이언트는 애플리케이션 버퍼에서 파일로 데이터를 기록.

 

2. 네트워크 송수신의 내부 구조

2.1 소켓 버퍼

  • 소켓 버퍼의 역할:
    • 송신 버퍼 (Send Buffer):
      • 애플리케이션이 send 호출로 데이터를 소켓에 전달하면, 데이터는 송신 버퍼에 저장됩니다.
      • 운영체제는 송신 버퍼에서 데이터를 읽어 네트워크 계층으로 전달.
    • 수신 버퍼 (Receive Buffer):
      • 네트워크로부터 도착한 데이터는 먼저 수신 버퍼에 저장.
      • 애플리케이션은 recv 호출을 통해 수신 버퍼에서 데이터를 읽어옵니다.

2.2 메모리 복사 과정

  • 송수신 시 데이터는 여러 단계의 메모리 복사를 거칩니다:
    1. 파일 → 애플리케이션 버퍼:
      • 서버는 파일 시스템에서 데이터를 읽어 메모리에 저장.
    2. 애플리케이션 버퍼 → 송신 버퍼:
      • 소켓 send 호출 시 데이터가 소켓 송신 버퍼로 복사.
    3. 송신 버퍼 → 네트워크 드라이버:
      • 운영체제가 송신 버퍼의 데이터를 네트워크 드라이버로 전달.
    4. 네트워크 → 수신 버퍼:
      • 수신 측 네트워크 드라이버가 데이터를 수신 버퍼에 저장.
    5. 수신 버퍼 → 애플리케이션 버퍼:
      • 클라이언트 애플리케이션이 recv 호출로 데이터를 읽음.
    6. 애플리케이션 버퍼 → 파일:
      • 수신 데이터를 파일 시스템에 저장.

 

3. 데이터 전송의 주요 문제와 해결 방법

3.1 송신 속도와 수신 속도의 불균형

  • 문제:
    • 서버가 데이터를 너무 빨리 전송하면 클라이언트 수신 버퍼가 가득 차고, TCP 슬라이딩 윈도우 메커니즘에 의해 송신이 차단될 수 있음.
  • 해결:
    • 송신 측에서 적절한 속도 조절 (예: 대기 시간 삽입, 클라이언트 ACK 신호 확인).

 

3.2 대용량 파일 처리

  • 문제:
    • 메모리 크기가 제한적이므로 대용량 파일을 한꺼번에 메모리에 올릴 수 없음.
  • 해결:
    • 버퍼 단위 전송:
      • 데이터를 일정 크기(예: 1KB 또는 4KB)로 나누어 전송.
    • 프로세스 재시작 가능 구조:
      • 장애 발생 시 재전송을 위해 전송한 데이터의 오프셋을 기록.

 

4. TCP/IP 프로토콜의 역할

4.1 데이터 분할

  • 파일 데이터가 TCP 세그먼트로 나뉨.
  • 각 세그먼트는 헤더 + 데이터로 구성되며, 헤더에는 송신 확인 및 재전송을 위한 정보 포함.

4.2 슬라이딩 윈도우

  • TCP는 송수신 간의 속도 차이를 조율하기 위해 슬라이딩 윈도우를 사용.
  • 송신 측은 수신 측의 윈도우 크기만큼 데이터를 보낼 수 있음.

 

5. 효율적인 파일 송수신을 위한 설계

5.1 최적의 버퍼 크기 선택

  • 송수신 버퍼의 크기를 너무 작게 설정하면 전송 속도가 느려짐.
  • 일반적으로 4KB ~ 64KB의 버퍼 크기가 적합.

5.2 비동기 I/O 활용

  • 비동기 방식:
    • 송신 측에서 데이터를 비동기로 전송하여 송수신 속도 최적화.
  • 이점:
    • 송신이 완료될 때까지 대기하지 않아도 됨.

5.3 프로토콜 설계

  • 파일의 크기, 이름, 데이터 분할 정보 등을 포함한 헤더 구조 정의.
  • 클라이언트와 서버 간의 명확한 요청-응답 설계 필요.

6. 파일 송수신의 단계별 요약

  1. 서버:
    • 파일 시스템에서 데이터를 읽고 송신 버퍼로 복사.
    • TCP 프로토콜을 통해 데이터를 클라이언트로 전송.
  2. 네트워크:
    • 데이터를 패킷으로 나누어 송신.
    • 패킷 손실 시 TCP가 자동으로 재전송.
  3. 클라이언트:
    • 데이터를 수신 버퍼에서 읽어 애플리케이션 버퍼에 저장.
    • 저장된 데이터를 파일로 기록.