CS/네트워크

Socket

H.E 2024. 2. 4. 15:21

[ Socket ]

소켓(Socket)은 TCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점. 즉 네트워크 상에서 돌아가는 두 개의 프로그램 간 양방향 통신의 하나의 엔드 포인트

 

- 엔드포인트

아이피 주소와 포트 번호의 조합을 의미. 모든 TCP 연결은 2개의 엔드 포인트로 유일하게 식별되어질 수 있음

따라서 클라이언트와 서버 간 여러 개의 연결이 맺어질 수 있음

 

소켓은 클라이언트 소켓과 서버 소켓으로 구분되며, 소켓간 통신을 위해서는 네트워크상에서 클라이언트와 서버에 해당되는 컴퓨터를 식별하기 위한 IP주소와 해당 컴퓨터내에서 현재 통신에 사용되는 응용프로그램을 식별하기 위한 포트번호가 사용됨

 

소켓통신은 이러한 소켓을 통해 서버-클라이언트간 데이터를 주고받는 양방향 연결 지향성 통신을 말함

소켓통신은 보통 지속적으로 연결을 유지하면서 실시간으로 데이터를 주고받아야 하는 경우에는 사용됨

 

소켓통신에서는 서버와 클라이언트가 존재하며, 서버(Server)는 데이터를 제공하는 쪽을 말하며, 클라이언트(Client)는 데이터를 요청하여 제공받는 쪽을 말함

 

▶ 일반적인 소켓 통신의 흐름

서버

  1. 소켓 생성
  2. 바인딩 (ip, port번호 설정)
  3. listen()으로 클라이언트 요청에 대기열을 만들어 몇개의 클라이언트를 대기시킬지 결정
  4. accept()로 클라이언트와 연결
  5. 데이터 송수신
  6. 소켓 닫기

클라이언트

  1. 소켓 생성
  2. 서버에 설정된 ip, port로 연결 시도
  3. accept()로 클라이언트의 socket descriptor 반환
  4. 데이터 송수신
  5. 소켓 닫기

 

▶ 소켓 종류

스트림 소켓

  • TCP(Transmission Control Protocol)을 사용하는 연결 지향방식의 소켓
  • 송수신자의 연결을 보장하여 신뢰성있는 데이터 송수신이 가능
  • 데이터의 순서 보장
  • 소량의 데이터보다 대량 데이터 전송에 적합
  • 점대점 연결

서버

  1. 소켓 생성
  2. 바인딩
  3. listen(연결되지 않은 소켓을 대기모드로 전환)
  4. 클라이언트 요청 수락 후 통신을 위한 실질적인 소켓 생성(처음에 생성한 소켓은 새로운 클라이언트 요청을 대기하기 위해 쓰임)
  5. 데이터 송수신
  6. 소켓 닫음

클라이언트

  1. 소켓 생성
  2. 서버가 설정한 ip, port로 연결
  3. accept()로 클라이언트의 socket descriptor 반환
  4. 데이터 송수신
  5. 소켓 닫음

 

데이터그램 소켓

  • UDP(User Diagram Protocol)을 사용하는 비연결형 소켓
  • 데이터의 순서와 신뢰성을 보장하기 어려움
  • 점대점 뿐만아니라 일대다 연결도 가능

accept 과정없이 소켓 생성 후 바로 데이터 송수신

 

▶ HTTP 통신과 소켓 통신의 차이 

 HTTP 통신

  • 클라이언트의 요청이 있을 때만 서버가 응답
  • JSON, HTML, Image 등 다양한 데이터를 주고 받을 수 있음
  • 서버가 응답한 후 연결을 바로 종료하는 단방향 통신
  • 실시간 연결이 아닌 데이터 전달이 필요한 경우에만 요청을 보내는 상황에 유리

소켓 통신

  • 클라이언트와 서버가 특정 포트를 통해 양방향 통신
  • 데이터 전달 후 연결이 끊어지는 것이 아니라 계속해서 연결을 유지 → HTTP에 비해 더 많은 리소스 소모
  • 클라이언트와 서버가 실시간으로 계속하여 데이터를 주고받아야하는 경우에 유리
  • 실시간 동영상 스트리밍이나 온라인 게임 등에 사용

 

▶ 소켓 통신을 사용하는 이유

HTTP는 클라이언트가 서버에게 요청을 보내고, 서버가 응답을 보내는 단방향 통신 프로토콜. 그에 비해 소켓 통신은 양방향 통신이 가능하며, 이를 통해 실시간으로 데이터를 주고받을 수 있음

HTTP는 각각의 요청에 대해 새로운 연결을 맺고 해제하는데 시간이 소요될 수 있는 반면 소켓 통신은 한 번 연결을 맺으면 해당 연결을 유지하고 계속해서 데이터를 주고받을 수 있어, 더 낮은 지연 시간을 가질 수 있으며 연결/해제에 대한 반복적 오버헤드가 줄어듬

 

[ WebSocket ]

웹 애플리케이션에서 양방향 통신을 지원하기 위한 프로토콜

HTTP 프로토콜과 달리, WebSocket은 서버와 클라이언트 간에 지속적인 양방향 연결을 제공하며 데이터를 실시간으로 주고받을 수 있음

 

▶ 웹 소켓 동작 과정

웹 소켓 동작 과정은 크게 세가지로 나눌 수 있음

  • 빨간 색 박스에 해당하는 Opening Handshake
  • 노란 색 박스에 해당하는 Data transfer
  • 보라 색 박스에 해당하는 Closing Handshake

Handshake

Opening Handshake 와 Closing Handshake는 일반적인 HTTP TCP 통신의 과정 중 하나임

접속 요청은 HTTP로 한 뒤, 웹소켓 프로토콜로 변경됨(WS)

 

Data Transfer

Opening HandShake에서 승인이 나고나면, 웹 소켓 프로토콜로 노란색 박스 부분인 Data transfer이 진행됨
여기서 데이터는 메시지라는 단위로 전달됨

  • 메시지
    • 여러 프레임(frame)이 모여서 구성되는 하나의 논리적인 메시지 단위
  • 프레임
    • 통신에서 가장 작은 단위의 데이터
    • 패킷은 전 네트워크 통신 과정에서 가장 작은 단위의 데이터를 뜻하고, 프레임은 데이터 링크계층(이더넷)에서 주고 받는 가장 작은 단위를 의미(작은 헤더 + payload 로 구성되어 있음)

 

▶ SocketJs

WebSocket 프로토콜의 대안으로 사용되는 브라우저 클라이언트와 웹 서버 간의 양방향 통신을 지원하는 자바스크립트 라이브러리

 

WebSocket은 브라우저 클라이언트와 웹 서버 간의 양방향 통신을 지원하지만, 모든 브라우저에서 지원되지는 않음

SockJS는 WebSocket이 지원되지 않는 브라우저에서도 양방향 통신을 가능하게 하기 위해 개발되었음

SockJS는 다양한 전송 프로토콜을 지원함 이를 통해, 브라우저와 웹 서버 간에 최적의 프로토콜을 선택하여 통신할 수 있음

 

Socket 전송 프로토콜 지원

  • WebSocket
  • HTTP streaming
  • HTTP long-polling
  • Iframe-based transport

 

▶ STOMP

STOMP(Streaming Text Oriented Messaging Protocol)는 텍스트 기반의 메시징 프로토콜

STOMP는 매우 간단하고 유연한 구조로 이루어져 있어서, 다양한 언어와 프레임워크에서 사용할 수 있음

 

STOMP는 JMS(Java Messaging Service)와 유사한 메시징 시스템을 구축할 수 있도록 지원

메시지 브로커와 메시지 송수신 클라이언트 간의 상호작용을 정의하는 규약으로, 메시지 전송, 구독, 메시지 핸들링, 트랜잭션 처리 등을 지원. STOMP는 텍스트 기반으로 이루어져 있어서, HTTP와 같은 프로토콜 위에서 동작하는 웹 애플리케이션에서 쉽게 사용할 수 있음

 

STOMP는 일반적으로 웹 소켓을 기반으로 동작함. 웹 소켓은 서버와 클라이언트 간의 양방향 통신을 지원하는 프로토콜로, STOMP와 함께 사용될 경우 실시간 메시징 시스템을 구현할 수 있음

'CS > 네트워크' 카테고리의 다른 글

EC2란?  (0) 2024.03.10
JWT - 어떻게 사용해야하는가?  (1) 2024.03.06
JWT  (0) 2024.02.04
HTTP2/HTTP3/웹소켓  (2) 2023.11.25
웹의 동작 원리  (0) 2023.11.12