[CS] Datagram Socket vs Stream Socket

Datagram Socket (SOCK_DGRAM)Stream Socket (SOCK_STREAM)은 소켓 통신에서 사용되는 두 가지 주요 타입이며, 각각 UDPTCP 프로토콜에 대응된다.


1. Stream Socket (SOCK_STREAM)

  • 프로토콜: TCP (Transmission Control Protocol)
  • 연결방식: 연결지향적 (Connection-oriented)
  • 데이터 전송 방식: 연속적인 바이트 스트림으로 데이터 전송
  • 신뢰성: 패킷 손실 없음, 순서 보장, 흐름제어, 혼잡 제어 제공
  • 용도: 웹 브라우징(HTTP), 메일(SMTP), 파일 전송(FTP), SSH 등

동작 흐름 (3-way handshake)

  1. 클라이언트가 connect() 호출 → SYN
  2. 서버가 accept() → SYN-ACK
  3. 클라이언트가 ACK → 연결 성립
  4. 이후 read() / write()로 데이터 송수신

2. Datagram Socket (SOCK_DGRAM)

  • 프로토콜: UDP (User Datagram Protocol)
  • 연결 방식: 비연결형 (Connectionless)
  • 데이터 전송 방식: 독립된 패킷(데이터그램) 단위로 전송
  • 신뢰성: 보장 없음 (순서, 손실, 중복 발생 가능)
  • 용도: 실시간 스트리밍, VoIP, DNS, 온라인 게임 등 지연 민감한 서비스

동작 흐름

  • sendto()와 recvfrom()을 통해 직접 상대 주소를 지정하여 데이터 전송
  • connect() 없이도 전송 가능 (연결 설정 없음)

Stream vs Datagram 비교 요약

항목 Stream Socket (TCP) Datagram Socket (UDP)
소켓 타입 SOCK_STREAM SOCK_DGRAM
연결 여부 연결 필요 (connect() 사용) 비연결 (주소만 있으면 전송 가능)
신뢰성 있음 (순서 보장, 손실 없음) 없음 (순서 보장 없음, 손실 가능)
전송 단위 바이트 스트림 개별 메시지(데이터그램)
전송 속도 느림 (오버헤드 있음) 빠름 (오버헤드 적음)
사용 예시 HTTP, FTP, SSH DNS, DHCP, VoIP, 게임