Socket이란, WebSocket이란
소켓
소켓이란 프로그램이 네트워크 상에서 데이터를 송신과 수신을 하기위한 연결부이다. 일반적으로 tcp/ip프로토콜을 사용하거나 웹 소켓을 이용한다
프로토콜
어떤 시스템이 다른 시스템과 통신을 원활하게 수용하도록 해주는 통신 규약이다
소켓 통신의 흐름
소켓의 흐름은 서버소켓과 클라이언트소켓으로 이야기 할 수 있다
클라이언트
- socket()함수로 소켓을 연다
- connect() 함수를 이용해 통신 할 서버의 ip, port번호에 통신을 시도한다
- 통신을 시도 할때 서버가 accept()함수를 사용해 클라이언트의 socket descriptor를 반환한다
- 클라이언트와 서버가 서로 read(), writer()를 하며 통신한다(반복)
서버
- socket()함수를 이용하여 소켓을 생성한다
- bind()함수로 ip와 port번호를 설정한다
- listen()함수로 클라이언트의 접근 요청에 수신 대기열을 만들어서 몇 개의 클라이언트를 대기 시킬지를 결정한다
- accept()함수를 사용하여 클라이언트와의 연결을 기다린다
소켓통신은 http통신과는 다르게 서로 연결을 유지하는 양방향 통신이다. 서버와 클라이언트가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 주로 사용된다
웹 소켓
웹소켓은 서버와 클라이언트간의 socket connection을 유지해 언제든 양방향 통신이나 데이터 전송이 가능하게 하는 기술이다
즉 http통신의 한계(단방향, 재접속)를 보완하는 기술이다.
웹 소켓 이전 비슷한 기술
Polling
서버로 일정 주기마다 요청을 송신한다
real time통신에서는 언제 통신이 발생할지는 예측이 불가능하다. 그렇기에 불필요한 request와 connection이 발생한다.
real time = 실시간
Long Polling
서버에 요청을 보내고 이벤트가 발생하여 응답을 받을 때까지 연결을 종료하지 않는다. 응답을 받으면 연결을 끊고 다시 재요청을 한다
많은 양의 메시지가 전송 될 경우 polling과 똑같다
Streaming
서버에 요청을 보내고 연결을 유지하며 데어터를 수신한다
클라이언트에서 서버로의 데이터 송신이 어렵다
즉 위의 방법들은 모두 HTTP를 통해 통신하기 때문에 request, response 둘 다 header가 불필요하게 크다
웹 소켓의 핸드 쉐이크
웹 소켓도 tcp의 핸드 쉐이크처럼 연결을 하는 과정이 존재한다. 이때 웹 소켓의 핸드 쉐이킹은 http(80)나 https(443)의 프로토콜을 통해서 이루어진다.
- 클라이언트에서 아래와 같은 표준적인 http 요청 header를 보낸다 (이때 http버전은 반드시 1.1 이상이여야하며 get방식이여야 한다 )
GET /chat HTTP/1.1
Host: example.com:8000 # 웹 소켓의 서버 구조
Upgrade: websocket # 현재 클라이언트. 서버 전송 프로토콜 연결에서 다른 프로토콜로 업그레이드/변경하기 위한 규칙
Connection: Upgrade # upgrade헤더가 명시되어 있는 경우 송신자는 반드시 connection헤더 필드도 함께 전송해야 한다
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== # 양쪽 통신자의 신원을 확인하는 키라고 생각하면 된다
Sec-WebSocket-Version: 13
- 서버가 클라이언트에게 웹소켓 프로토콜로 업그레드 하는 것을 승인하면 아래의 헤더를 전송한다
101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
핸드 쉐이킹이 완료되면 http프로토콜은 ws 프로토콜로 변경된다 (wss -> https처럼 데이터 보안을 위해서 ssl을 적용한 프로토콜) 이후 서로 messge를 주고받는다 (message : 여러 프레임이 모여 구성하는 하나의 논리적 메시지 단위)
프레임(frame)
커뮤니케이션에서 가장 작은 단위의 데이터이다 (작은헤더 + payload로 구성)
페이로드(payload)
데이터와 함께 전송되는 데이터중, 헤더와 메타데이터와 같은 데이터는 제외한 전송의 근본적인 목적이 되는 데이터의 일부분이다
웹 소켓 프로토콜 특징
- 최초 접속할때 http 프로토콜 위에서 핸드쉐이킹을 하기 때문에 http header를 사용한다
- 웹 소켓을 위한 별도의 포트는 없으며 기존포트(80, 443)를 사용한다
- 프레임으로 구성된 메시지라는 논리적 단위로 송수신된다
- 메시지에 포함될 수 있는 교환 가능한 메시지는 텍스트와 바이너리이다
socket.io
socket.io란 WebSocket과 같이 클라이언트와 서버의 양방향 통신을 가능하게 해주는 모듈이다. WebSocket은 HTML5이후에 나왔기 때문에 엊ㄴ의 기술로 구현된 서비스에서 WebSocket처럼 사용할 수 있도록 도와주는 기술이다.
socket.io는 통신을 시작할때 각 브라우저에 대해서 webSocket, streaming등등에서 가장 적절한 방법을 찾아 메시지를 보내준다.
reference
https://duckdevelope.tistory.com/19
https://rubberduck-debug.tistory.com/123
https://velog.io/@y1andyu
https://www.youtube.com/watch?v=MPQHvwPxDUw