WebSocket에 대해 이해하려면 우선 네트워크 계층 구조(Newtwork Layer)에 대한 이해가 필요하다. 네트워크 계층 구조란 네트워크에서 통신이 일어나는 과정을 단계별로 나눈 것이다. 대표적인 계층 구조 모델로 OSI 7계층 모델과 TCP/IP 5계층 모델이 있는데, OSI 모델보다 TCP/IP 모델이 인터넷 통신에서 실제로 사용되는 실질적 개념에 가깝기 때문에, TCP/IP 개념을 기반으로 웹소켓 통신에 관한 내용을 정리했다.
OSI 모델은 네트워킹 장비나 통신장치를 만들 때 표준적 기준으로 참조하는 개념적 모델에 가깝다.
TCP/IP 모델
네트워크에서 사용자(Client 및 Server) 간의 통신(데이터를 주고받는 행위)은 각각의 계층(layer)의 상호작용을 통해 이뤄진다. 네트워크 통신이 이뤄지는 흐름 및 과정을 이해하기 위해서라도 각각 계층의 개념과 역할을 알아두는 것은 중요하다.
애플리케이션 계층(Application Layer)
전송 계층(Transport Layer)
네트워크 계층(Network Layer)
데이터 링크 계층(Link Layer)
물리 계층(Physical Layer)
WebScoket을 이해하기 위해선 TCP/IP 모델의 전송 계층(Transport Layer)을 주목해야 한다. 전송 계층은 TCP 혹은 UDP 프로토콜을 이용하여 송신자와 수신자 사이의 데이터 전송이 제대로 이뤄지도록 한다. 이 중 TCP 프로토콜은 Socket을 활용한 양방향 전이중 통신 기능을 제공하는데, 이 기능을 활용하면 네트워크 사용자(Client 및 Server)들이 연결을 유지하며 실시간 통신이 가능하다. 이때 활용되는 Socket을 'TCP Socket' 또는 'TCP/IP Socket'이라 부르고, TCP Socket을 활용하여 제공하는 양방향 전이중 통신을 '소켓 통신'이라고 부른다.
TCP 프로토콜
네트워크 통신에서 자주 사용되는 프로토콜로, UDP에 비해 전송 속도는 느리지만 모든 데이터를 고정된 통신 선로를 통해서 순차적으로 전달하기 때문에 정확성과 안정성이 높다.
전이중 통신(Full-Duplex)
데이터를 양방향으로 동시에 송수신 할 수 있는 방식
Socket(TCP Socket)
Socket은 네트워크에서 동작하는 응용 프로그램(network application)들이 상호 통신할 수 있도록 연결해주는 부분이다. 가령 응용프로그램이 클라이언트 서버 모델(Client-server model) 구조인 경우, 클라이언트와 서버는 Socket이라는 일종의 연결 튜브(구멍 혹은 콘센트라고 생각해도 된다.)를 타고 상호 간의 데이터를 주고받게 된다. Socket이 IP 주소와 포트 번호로 조합된 엔드 포인트로 정의되는 이유도 여기에 있다. 통신이 이뤄지려면 클라이언트와 서버 모두 특정 포트와 연결된 Socket을 생성해야 하며, 생성된 Socket을 통해 실시간으로 데이터를 주고받는 것(양방향 전이중 통신)이 가능하다. 이는 WebSocket과 전혀 다른 개념이다.
네트워크 응용 프로그램(network application)
네트워크 통신을 활용하는 프로그램을 가리킨다. 이메일, 웹 메신저, P2P 사이트, 유튜브 등, 사용자가 실제로 이용하는 프로그램 대부분이 해당한다.
클라이언트 서버 모델(Client-server model)
중앙에 하나의 서버가 있고 주변에 있는 나머지 클라이언트들을 서버가 지원하는 구조. 각 클라이언트는 서버에 데이터를 요구하고 서버는 거기에 대한 응답으로 데이터를 전달해준다. 클라이언트 서버 모델에서는 서버가 유일하게 데이터를 제공하는 역할을 담당한다.
응용 프로그램(network application)들이 실시간으로 데이터를 주고받을 수 있도록, 전송 계층의 TCP 연결(양방향 전이중 통신)을 유지해주는 프로토콜이다. 응용프로그램이 클라이언트 서버 모델(Client-server model) 구조일 경우, 웹소켓 기술을 활용하면 클라이언트와 서버가 실시간으로 통신할 수 있다. 채팅, 주식 관련 서비스에서 데이터가 빠르게 교환될 수 있는 것도 웹소켓 기술 덕분이다.
WebScoket 프로토콜은 HTTP 프로토콜처럼 애플리케이션 계층(Application Layer)에 위치하며, TCP의 양방향 전이중 통신을 사용하기 때문에 전송 계층(Transport Layer)에 의존하고 있다고 볼 수 있다.
웹소켓을 통해 사용자 간의 양뱡향 연결을 수립하려면, 먼저 HTTP 요청의 도움을 받아 초기 연결이 이뤄져야 하며, handshake 과정을 거친 후 프로토콜은 HTTP에서 웹소켓으로 업그레이드된다. 자세한 사항은 아래 이미지를 참고하자. HTTP 요청 헤더에서 Upgrade: websocket
헤더를 통해 웹소켓 연결로 업그레이드 요청을 하고 있다. HTTP 응답 헤더 역시 이와 동일한 헤더를 가지고 있고, 요청 헤더의 Sec-WebSocket-Key
를 인코딩한 값이 담긴 Sec-WebSocket-Accept
헤더를 통해 웹소켓 연결이 개시되었음을 알리고 있다.
request
response