(Django) 비동기적 채팅 구현하기(작성중...)
1. WebSocket이란 ?
웹소켓(4계층)은 서버와 클라이언트간에 socket connection을 유지해서 언제나 양방향 통신/데이터 전송이 가능하게 하는 기술로 프로토콜이다. 웹은 필요한 정보를 HTTP 기반으로 request/response를 통해 데이터를 주고받기 때문에 네트워크의 연결을 유지하지 않는다. 좀 더 자세하게 살펴보자. 웹은 클라이언트에서 데이터가 필요하면 서버쪽에 request를 하고 서버가 response하는 방식으로 통신이 진행되는 단방향 통신이다. 이렇게 되면 서버쪽의 데이터가 업데이트 되어도 클라이언트 쪽 화면은 재랜더링 되지 않는 한 변경된 데이터가 업데이트 되지 않는다. 이렇듯 실시간 업데이트가 필요한 기능에서는 웹소켓의 기능을 사용한다.
웹 소켓은 서버로부터 response를 받아도 TCP connection이 살아있기 때문에 실시간 어플리케이션에서 많아 사용된다
쉽게말해, 웹소켓은 기존의 단방향 통신으로 데이터를 주고받아 실시간으로 데이터를 주고받기 어려운 상황에서 사용될 수 있는 프로토콜이다
2. WebSocket의 작동원리
서버와 클라이언트간의 웹소켓 최초 연결은 HTTP프로토콜을 통해 이루어진다. 연결이 정상적으로 이루어진다면 서버와 클라이언트 간에 웹소켓 연결(TCP/IP기반)이 이루어지고 일정 시간이 지나면 HTTP연결은 자동으로 끊어진다. 앞에서 말했던것처럼 웹소켓의 최초 연결은 HTTP를 사용하지만 이후 통신은 웹소켓 독자의 프로토콜로 이루어진다.
웹소켓이 tcp socket과 다른 점은 처음 접속할때 http request를 통해 handshaking과정을 통해 이루어진다. http request를 사용하기 때문에 80,443포트로 접속을 하므로 방화벽을 열지 않고도 양방향 통신이 가능하고 cors적용 등의 인증 과정을 기존과 동일하게 가져갈 수 있는 장점이 있다.
3. WebSocket 정리
- 웹소켓은 http 기반으로 양방향 통신을 지원하는 프로토콜이다
- 서버에 소켓이 연결되면 3way-hand-shake과정을 통해 tcp 세션이 생성된다
- 서버는 항상 고정된 하나의 포트만을 사용하지만 클라이언트는 각각의 소켓을 생성해 서버 소켓과 접속한다.
- handshake를 완료한 후에도 connection을 유지한다
way handshake란 ?
![]()
tcp/ip 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 서로 연결이 잘 되어 있는지 확인하는 과정이자 방법이다.
- 클라이언트가 서버에 접속을 요청하는 SYN패킷을 보낸다. 이때 클라이언트는 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다
- 서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 response해준다. 이후 클라이언트가 다시 ACK로 응답하기를 기다린다. 이때 서버는 SYN_RECEIVED 상태가 된다
- 클라이언트는 서버에게 ACK를 보낸후 연결이 이루어지고 데이터가 오고가게 된다. 이때 서버의 상태는 ESTABLISHED(확인, 확립된 상태 즉, 연결이 확인 된 상태)가 된다