CS

[CS] WebSocket

펭귄코기 2022. 10. 29. 14:52

웹소켓 (WebSocket)

정의

두 프로그램 간의 메시지를 교환하기 위한 통신 방법 중에 하나이다

주로 HTML5에서 많이 사용된다

 

특징

1) 양방향 통신

데이터 송수신을 동시에 처리한다

 

클라이언트와 서버가 서로에게 원할때 데이터를 주고 받을 수 있다

 

기존의 http통신은 클라이언트가 요청을 보내는 경우에만 서버가 응답할 수 있었다

 

커넥션이 open, close된 여부를 따진다

 

2) 실시간 네트워킹 (Real Time Networking)

웹 환경에서 연속된 데이터를 빠르게 노출시켜야 할 때 사용한다

 

채팅, 주식, 비디오 데이터 등이 예를 들 수 있다

 

친구들과 채팅을 한다면 친구들과 연결이 된것이 아니라

같은 웹소켓 서버에 들어가 있는 상태인 것이다

 

여기에서 브라우저 끼리 연결을 시켜버리는 개념이 WebRTC, P2P 커뮤니케이션이고

여러 단만기에서 빠르게 데이터를 교환할 수 있게 된다

 

3) Polling, Long Polling, Streaming 과의 차이

서버로 일정 주기로 요청을 보낸다

real time 통신에 비해서 불필요한 요청을 보내게 된다

header가 불필요하게 크다

 

동작방식

 

1) 빨간 박스 (Opening Handshake)

환경

  HTTP80/443을 사용
  응답코드는 101

 

요청

요청
GET /chat HTTP/1.1     //반드시 GET 메서드
Host: localhost:8080  
Upgrade: websocket     //웹소켓 전환을 위해서 고정값
Connection: Upgrade    //현재의 전송이 완료된 후 네트워크 접속을 유지할 것인가에 대한 정보. 웹소켓 요청 시에는 반드시 Upgrade라는 값 고정
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==  //유효한 요청인지 확인하기 위해 사용하는 키 값. base64로 인코딩
Sec-WebSocket-Protocol: chat, superchat  
Sec-WebSocket-Version: 13 
Origin: http://localhost:9000

 

응답

응답
HTTP/1.1 101 Switching Protocols ##응답코드가 101. 101'프로토콜 전환' 으로 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 상태
Server: Apache-Coyote/1.1 
Upgrade: websocket 
Connection: upgrade 
Sec-WebSocket-Accept: y0C2sLRjQhdq3geJIKYeRVUgtFg= ##보안을 위한 응답 키로 Sec-WebSocket-Key를 base64로 인코딩. 클라에서 보낸값과 일치해야함

 

2) 노란 박스 (Data Transfer)

데이터 전송파트
메세지라는 개념으로 데이터를 주고 받음
여기서 메세지는 프레임단위로 되어있음
프레임은 communication에서 가장 작은 단위. 작은헤더 + payload로 구성
서버와 클라이언트는 서로가 살아 있는지 확인하기 위해 heartbeat 패킷을 보내며, 주기적으로 ping을 보내 체크

프로토콜이 ws로 변경됨 ws(80/443)

 

3) 보라 박스 (Closing HandShake)

커넥션을 종료하기 위한 컨트롤 프레임을 전송