네트워크를 통해 데이터를 주고 받는 행위는 인터넷을 이용하는 유저라면 당연히 겪어보았을 것이다.
특히, 네트워크 관점에서 데이터를 주고 받는 방식은 크게 2가지가 있다. HTTP 통신과 Socket을 통한 TCP 방식이다.
많은 사람들은 이 두 방식의 차이점을 잘 모르거나, 헷갈려 한다. 어떤 때에 어느 방식이 유용한지, 각 통신은 어떤 특징이 있는지 알아보자.
두 통신에 대해 이해하려면 OSI 7계층의 관점에서 볼 필요가 있다.
왜냐하면 HTTP 통신과 TCP 방식은 OSI 4계층 관점에서는 같은 방식이면서도 7계층에서는 다른 방식이기 때문이다.
네트워크에서는 데이터를 전송하기 위해, 데이터에 헤더를 붙인 패킷을 이용한다.
패킷이란. 유저가 데이터를 전송하려 할 때 전송하는 데이터에 각 계층의 헤더가 붙어서 생긴 네트워크 전송 데이터이다.
이러한 헤더가 붙는 이유는 각 계층에서 맡은 역할에 따라 데이터를 정제하기 위해서이다.
예를 들어, 표현 계층에서는 데이터의 표현 방식에 대한 역할을 맡고있다. 따라서 데이터의 압축이나, 암호화/복호화 등의 작업을 헤더에 맞게 한다. (이러한 데이터의 규약을 프로토콜이라 한다.)
TCP 통신은 4계층에서 구현된 데이터 전송 프로토콜이다. 그리고 HTTP는 7계층에서 구현된 데이터 전송 프로토콜인데, TCP 기능 위에 구현된 것이다.
즉, 7계층의 패킷화 과정에서는 HTTP 헤더가 사용되고, 4계층에서는 TCP 헤더가 사용되는 것이다.
그래서 4계층의 관점에서는 TCP와 HTTP는 같은 프로토콜인 것이고, 7계층의 관점에서는 다른 프로토콜인 것이다.
HTTP와 TCP는 결국 4계층에서 같은 헤더를 사용하게 된다. 이런 TCP의 통신은 어떤 특징을 가질까?
통화 방식과 유사한 Socket 통신
그렇다면, TCP 통신은 어떤 방식으로 7계층에서 패킷이 생성될까? 바로 운영체제에서 제공하는 Socket의 헤더를 이용하여 패킷을 생성하게 된다.
Socket 통신의 특징은 두 호스트가 연결을 항상 유지하고 있고(stateful), 양방향으로 통신을 한다는 특징이 있다. 그렇기 때문에 실시간 통신이 필요한 경우에 자주 사용된다.
예를 들어, 스트리밍 서비스에서 동영상을 제공하는 호스트와 댓글을 쓰려는 호스트 모두 실시간으로 데이터를 주고 받기 때문에 연결이 항상 유지되고, 양방향에서 데이터를 전송할 수 있다.
문자 방식과 유사한 HTTP 통신
반면 HTTP 통신은 Socket 통신과는 다르게 두 호스트 간의 연결을 유지하지 않는다. 즉, 호스트의 요청에 다른 호스트가 응답을 한 후 연결을 종료하게 된다. (stateless)
이를 사용하는 예로는 웹이 있다. 웹의 경우, 유저가 url을 통해 웹사이트에 접근하면 서버는 데이터를 전송해 웹을 뿌려준다.
이후 웹과 유저의 네트워크가 연결된 상태가 아니라 연결은 종료된 상태이다.
그렇기 때문에, HTTP 통신의 특징은 다음과 같다.
OSI 계층에서 4계층은 데이터를 전송하는 역할을 담당한다. 그래서 TCP를 이용하는 Socket 방식과 HTTP 모두 4계층의 관점에서는 같은 방식의 데이터 전송 프로토콜이다.
하지만 7계층인 응용 계층의 역할은 유저들에게 상황에 알맞은 방식의 네트워크 연결을 제공한다.
스트리밍이나 게임과 같이 실시간 데이터 송수신이 필요한 때는 양방향 연결, 웹과 같은 빠른 데이터 송수신이 필요할 때는 서버-클라이언트 방식의 단방향 연결이 필요하다.
이와 같은 상황에 맞춰, Socket 통신과 HTTP 통신은 유저에게 편리한 네트워크 통신을 제공한다.