요즘 지원 공고를 보다보면 웹소켓 통신을 사용해본 경험을 요하는 공고가 꽤 있었습니다. 사실 이전부터 웹소켓 통신을 해봐야지 라고 마음만 먹고 시작하지 못했어서, 직접 경험해보기 전에 웹소켓이 뭔지, 전체적으로 정리해 보려고 합니다.
HTTP와 TCP/IP
HTTP와 TCP/IP는 항상 같이 이야기가 나오지만, 이 둘이 자주 혼동되는거 같습니다.
현대의 인터넷 통신에서는 아래와 같은 TCP/IP 4계층 구조를 통해 통신을 하고 있습니다.
Application Layer(애플리케이션 계층): 응용 프로그램에서 사용하는 프로토콜을 정의하는 계층이다. 이 계층에서는 사용자와 직접적인 상호작용이 이루어진다. HTTP, FTP, SMTP 등의 프로토콜이 이 계층에서 동작한다.
Transport Layer(전송 계층): 데이터 전송의 신뢰성을 보장하는 계층이다. 데이터를 나누어 전송하고 재조립하는 기능을 제공한다. TCP와 같은 프로토콜이 이 계층에서 동작한다.
Internet Layer(인터넷 계층): 데이터를 목적지까지 전달하기 위한 경로를 결정하는 계층이다. 데이터를 패킷 단위로 나누어, 다음 목적지로 전달하는 역할을 한다. IP 프로토콜이 이 계층에서 동작한다.
Network Interface Layer(네트워크 인터페이스 계층, 데이터 링크 계층): 물리적인 네트워크와 관련된 계층으로 데이터를 전송하기 위한 하드웨어적인 부분을 다루는 계층이다. Ethernet, Wi-Fi 등의 프로토콜이 이 계층에서 동작한다.
이러한 계층에서 HTTP와 TCP/IP들이 사용되는데, 간단하게 말하자면 어떻게 데이터를 전송할 것인지 규칙을 정해놓은 것입니다.
HTTP와 TCP/IP는 각각의 계층에서 데이터에 대한 규칙을 정의합니다. 아래의 그림을 보면 이해가 될 수 있습니다.
위의 그림에서 알 수 있듯 통신을 위해서는 한 곳의 애플리케이션 계층에서 다른 곳의 애플리케이션 계층까지 도달하기 위해서는 거쳐야할 계층이 많습니다. 그리고 데이터들은 각각의 계층을 통해서만 다음 계층으로 넘어갈 수 있습니다.
그럼 HTTP와 TCP는 다른가?
이 2가지의 프로토콜은 서로 다릅니다. HTTP와 TCP의 가장 큰 차이점은 TCP는 독립적으로 서버와 클라이언트를 연결해서 데이터를 보낼 수 있지만, HTTP는 직접 연결을 하지 못해 TCP를 사용한다는 것입니다.
결국 HTTP는 TCP를 통한 연결을 사용해서 데이터를 보내고 검색합니다.
HTTP는 Stateless하다....?
그런데 여기서 제가 많이 헷갈렸던 것이 있습니다. 인터넷에서 찾아보면 HTTP와 TCP의 차이점을 말할 때 가장 많이 나오는 것이 바로 HTTP는 Stateless하다는 것입니다.
Stateless 하다는 것은 서버와 클라이언트가 연결된 다음 서버가 클라이언트가 요청한 결과에 대해 잊어버린다는 것을 말합니다. 그렇기 때문에 각 HTTP는 서로 독립적으로 처리됩니다.
반면에 TCP는 서버가 클라이언트의 상태를 보존하기 때문에 Stateful합니다.
제가 생각했을 때에는 만약 HTTP가 TCP를 통해서 연결을 한다면 HTTP가 Stateless일 이유가 없을 것 같았습니다. 이에 대한 정답을 찾다가 좋은 설명을 발견했습니다.
HTTP는 연결을 위해 TCP를 사용하고, 하나의 TCP 연결 아래에서 여러개의 HTTP 요청을 파이프라인화할 수 있습니다. 각각의 HTTP 요청은 다른 HTTP 요청의 데이터의 의존하지 않으며 요청을 처리하는데 충분한 데이터를 가지고 있습니다.
위의 그림은 HTTP가 상태를 유지하지 않는 방식을 나타내는 그림입니다. 노란 영역인 TCP 연결 안에서 녹색 막대로 나타내져 있는 HTTP 요청은 독립적으로 존재합니다.
HTTP는 이제 Stateful하다!
그럼 우리가 알고있는 HTTP는 전부 Stateless할까요?? 이것도 아닙니다. 사실 HTTP를 Stateful하게 사용하기 위한 노력은 계속되어 왔습니다. 여기선 다루지 않지만 쿠키나 세션 같은 것들이 생겨난 것도 상태를 유지하기 위함합니다.
HTTP/2에서는 더 나아가서 아에 상태를 유지하는 구성요소를 내장하도록 설계되었습니다.
또한 기존의 HTTP에 양방향 통신이 가능하게 만든 웹소켓도 생겨났습니다.
TCP/IP의 소켓과 웹소켓의 차이
이제 전체적으로 한번 알아봤으니 TCP/IP의 소켓에 대해 알아보겠습니다.
소켓은 통신을 할때 양방향 통로의 끝을 보통 말합니다. TCP 통신을 위해서라면 서버와 클라이언트에 각각 소켓을 생성하고 이를 IP 주소로 연결해 데이터를 송수신합니다.
웹소켓은 소켓과는 다르게 이전에 말했듯이 HTTP 요청으로 시작합니다. 일반적인 HTTP 요청과 같이 TCP 연결을 진행하는데, 연결이 성공하면 서버와 클라이언트를 이를 웹소켓 연결로 사용하기로 합의합니다.
그럼 연결은 필요한 만큼 유지되며, 서버와 클라이언트가 자유롭게 데이터를 독립적으로 전송할 수 있게 합니다.
추가 정보 - Socket.IO
Socket.IO는 웹소켓 프로토콜을 기반으로 구축되며, 양방향 통신을 가능하게 하는 라이브러입니다.
마무리하며
이렇게 해서 웹소켓이 뭔지 알아보기 위해 알아야 하는 정보들을 알아보는 과정을 거쳤습니다.
기존의 단순한 바이트 스트림을 통한 데이터 전송만 가능했던 소켓과는 다르게 웹소켓은 HTTP의 메시지 형식의 데이터를 다룰 수 있는 방법입니다.
그러니 웹소켓과 소켓을 구분짓지 말고, 소켓을 조금 더 사용하기 쉽게 만든것이 웹소켓이라고 이해하고 넘어가면 좋을것 같습니다.
Reference
'개발자의 기본 소양 > NETWORK' 카테고리의 다른 글
TCP / IP 계층에서 데이터 전달에 따른 프로토콜 동작 (0) | 2023.04.06 |
---|---|
FTP & FTPS (0) | 2023.03.31 |
SSH & SCP & SFTP (0) | 2023.03.31 |
SSL & TLS (0) | 2023.03.31 |
HTTP & HTTPS (0) | 2023.03.31 |