Featured image of post Socket

Socket

소켓은 무엇일까?

Socket은 네트워크에서 데이터를 송수신하기 위한 프로그래밍 인터페이스입니다.

클라이언트와 서버 간의 통신을 가능하게 하는 네트워크 애플리케이션에서 기본적인 구성 요소로 애플리케이션과 네트워크 프로토콜 간의 중개 역할을 하며, 네트워크에서의 데이터 교환을 관리합니다.

소켓의 구성 요소

소켓은 네트워크 상의 두 지점 간에 연결을 설정(TCP, UDP)하고 데이터를 송수신하는 데 사용되는 소프트웨어 구조입니다.

이를 위해 IP 주소포트 번호를 사용하여 네트워크 상의 특정 지점을 식별합니다.

  • IP 주소: 네트워크 상에서 장치의 고유한 식별자입니다.
  • 포트 번호: IP 주소 내에서 애플리케이션의 특정 서비스를 식별하는 번호입니다.
  • 프로토콜: 데이터 송수신을 위한 규칙을 정의합니다. 가장 일반적인 프로토콜은 TCP (Transmission Control Protocol)와 UDP (User Datagram Protocol)입니다.

소켓의 동작 원리

소켓의 동작

  • 서버와 클라이언트:
    • 서버 소켓: 서버는 특정 IP 주소와 포트 번호에서 클라이언트의 연결을 기다립니다. 서버는 클라이언트의 요청을 수락하고, 연결된 클라이언트와 통신을 시작합니다.
    • 클라이언트 소켓: 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결 요청을 보냅니다. 서버가 연결을 수락하면 클라이언트와 서버 간의 데이터 통신이 시작됩니다.
  • 연결 설정:
    • 소켓 생성: 애플리케이션이 소켓을 생성합니다. 이를 통해 네트워크 상의 다른 장치와 통신할 수 있습니다.
    • 연결 요청: 클라이언트는 서버 소켓에 연결 요청을 보냅니다.
    • 연결 수락: 서버는 클라이언트의 연결 요청을 수락하고, 클라이언트와 통신을 시작합니다.
  • 데이터 송수신:
    • 데이터 전송: 클라이언트와 서버는 소켓을 통해 데이터를 송수신합니다. 이 데이터는 TCP 소켓을 통해 안정적으로 전송되거나, UDP 소켓을 통해 빠르게 전송될 수 있습니다.
    • 연결 종료: 데이터 전송이 완료되면 소켓 연결을 종료할 수 있습니다.

소켓의 종류

  • TCP 소켓:
    • 연결 지향적: 연결이 설정된 후 안정적으로 데이터를 전송합니다.
    • 신뢰성: 데이터의 순서와 무결성을 보장합니다.
  • UDP 소켓:
    • 비연결 지향적: 연결을 설정하지 않고 데이터를 전송합니다.
    • 속도: 빠르게 데이터를 전송하지만 데이터의 순서나 무결성을 보장하지 않습니다.

TCP 수신 데이터

TCP는 데이터 스트림을 전송하는 연결 지향 프로토콜로, 데이터가 연속적으로 전송되며 끝을 명확하게 구분하기 위해 여러 가지 방법을 사용할 수 있습니다.

응답의 길이를 미리 알고 있는 경우

응답의 길이를 미리 알고 있는 경우, 수신한 데이터의 길이를 확인하여 응답이 모두 도착했는지를 판단할 수 있습니다.

예를 들어, 서버가 응답의 길이를 헤더에 포함시키는 경우, 클라이언트는 먼저 헤더를 읽고 길이를 파악한 후, 전체 응답을 수신합니다.

  • HTTP Header
    • Content-length

종료 신호 또는 종료 문자 사용 - 종료 신호 또는 문자

응답에 종료 신호를 포함하여 클라이언트가 응답의 끝을 인식하도록 할 수 있습니다.

일반적으로 특정 문자열(예: \r\n, \r\n), 특정 바이트, 또는 프로토콜에 정의된 종료 신호를 사용합니다.

응답 데이터가 연속적으로 오는 경우 - 청크 기반 프로토콜

응답 데이터가 여러 청크로 나누어져 연속적으로 오는 경우, 각 청크를 읽고 모든 청크를 조합하여 전체 응답을 구성합니다.

이때, 데이터의 구조를 이해하고 각 청크의 끝을 확인하여 전체 응답을 수집합니다.

타임아웃 설정

일정 시간 동안 데이터를 수신하지 않으면 연결을 종료하고 응답이 완료된 것으로 간주할 수 있습니다. 이 방법은 데이터의 길이나 종료 신호를 미리 알 수 없는 경우 유용합니다.

정리

  • 길이 기반:
    • 응답의 길이를 사전에 알고 있는 경우, 데이터의 길이를 확인하여 모든 응답을 받았는지 확인할 수 있습니다.
  • 종료 신호 또는 종료 문자:
    • 응답의 끝을 특정 문자열이나 신호로 표시하여 전체 응답을 확인할 수 있습니다.
  • 청크 기반:
    • 데이터가 청크로 나누어져 연속적으로 오는 경우, 모든 청크를 수집하여 전체 응답을 구성합니다.
  • 타임아웃:
    • 일정 시간 동안 데이터를 수신하지 않으면 응답이 완료된 것으로 간주할 수 있습니다.

소켓 옵션

소켓 옵션은 소켓의 동작 방식을 제어하거나 최적화하기 위해 설정할 수 있는 다양한 파라미터입니다.

소켓 옵션을 사용하면 소켓의 동작을 세부적으로 조정하거나 네트워크 통신의 성능을 향상시킬 수 있습니다. 소켓 옵션은 클라이언트와 서버 모두에서 사용될 수 있으며, 다양한 기능과 설정을 제공합니다.

주요 소켓 옵션

  • SO_REUSEADDR
    • 재사용 가능한 포트를 허용합니다. 주로 서버가 종료된 후 동일한 포트를 즉시 재사용할 수 있도록 설정합니다.
    • 사용 예: 서버가 비정상적으로 종료되었을 때, 포트가 즉시 재사용 가능하도록 설정합니다.
  • SO_KEEPALIVE
    • 연결이 유휴 상태일 때 주기적으로 “keep-alive” 패킷을 전송하여 연결이 여전히 유효한지 확인합니다.
    • 사용 예: 네트워크 연결의 상태를 주기적으로 점검하여 장기 연결의 유효성을 유지합니다.
  • SO_LINGER
    • 소켓이 닫힐 때, 데이터가 모두 전송될 때까지 기다리거나 즉시 닫을지 설정합니다.
    • 사용 예: 데이터가 전송되지 않은 상태에서 소켓을 닫을 경우, 남아 있는 데이터를 전송할 수 있도록 설정합니다.
  • SO_BROADCAST
    • 브로드캐스트 메시지 전송을 허용합니다. 주로 UDP 소켓에서 사용됩니다.
    • 사용 예: UDP 소켓을 통해 네트워크의 모든 호스트에 메시지를 전송합니다.
  • SO_RCVBUF 및 SO_SNDBUF
    • 수신 버퍼와 송신 버퍼의 크기를 설정합니다.
    • 사용 예: 높은 데이터 전송 속도가 필요한 애플리케이션에서 버퍼 크기를 조정하여 성능을 향상시킵니다.
  • TCP_NODELAY
    • Nagle 알고리즘을 비활성화하여 작은 패킷을 즉시 전송합니다.
    • 사용 예: 실시간 애플리케이션에서 지연을 줄이기 위해 패킷 전송 지연을 최소화합니다.
  • SO_TIMEOUT
    • 소켓의 읽기와 쓰기 작업에 대한 타임아웃을 설정합니다.
    • 데이터 송수신 시 응답이 지연될 경우 타임아웃을 설정하여 블로킹을 방지합니다.