HTTP 통신과 TCP 통신 그리고 웹 소켓에 대한 기본 개념 정리
- HTTP 통신과 TCP통신의 개념
- HTTP 프로그래밍과 소켓 프로그래밍
- HTTP,HTTPS 통신에서 양방향 통신을 위한 웹 소켓의 개념
모든 코드는 깃헙에 작성되어 있습니다.
1.HTTP통신과 TCP통신의 개념
우선 HTTP통신과 TCP통신에 대해 알기전에 OSI 7 Layer와 프로토콜이란것에 대해서 알아 가도록 하겠다.
OSI(Open Systems Interconnection) 7 Layer는 ISO(국제표준기구)에서 만든 네트워크를 7계층으로 만든 모델이고, 프로토콜(Protocol, 통신규약)은 상호간의 접속이나 전달방식, 통신방식, 주고받을 자료의 형식, 오류 검출 방식, 코드 변환방식, 전송속도 등에 대하여 이미 정해진 약속이기 때문에 레이어별 프로토콜은 한마디로 OSI 7 계층의 계층간에 존재하는 네트워크 통신을 위한 규약을 뜻한다.
즉, 우리가 이제 알려고 하는 HTTP(HyperText Transfer Protocol)와 TCP(Transmission Control Protocol)는 모두 특정 layer(계층)의 규약으로 해석할 수 있다.
HTTP는 7계층 규약이고, TCP는 4계층 규약이다.
HTTP와 TCP는 서로 다른 계층의 규약
그렇기에, TCP통신과 HTTP통신이란 해당 계층에 해당되는 규약(protocol)아래에서 이루어지는 통신을 의미한다.
조금 더 각각의 통신에 대해 자세히 보도록 하겠다.
TCP통신은 3-way-handshake라는 과정을 거치고 연결이 이루어진다. 그리고 연결을 종료할때는 4-way-handshake를 거치게 된다.
또한, TCP통신에서는 소켓을 이용한 연결방식을 사용한다. 그로인해, 양방향 통신이 가능하게 되는데 양방향 통신이란, 클라이언트단과 서버단이 서로 연결되어 있을때 양방향(클라이언트 -> 서버, 서버 -> 클라이언트) 으로 요청을 보내 통신을 할 수 있게 해주는 것이다. 또한, 클라이언트단과 서버단의 연결이 끊어지지않고 계속 연결을 유지해주어 실시간 소통이 가능하다.
위와같이 소켓을 이용한 연결은 TCP 프로토콜 기반으로 맺어진 연결이며, 소켓통신이라고도 부른다.
마지막으로, 이러한 소켓 통신을 사용하도록 설계하는 프로그래밍을 소켓 프로그래밍이라고 한다.
3-way,4-way handshake에 대해서 잘 모르겠다면, 필자의 네트워크에 관한 다른글을 참조하도록 하자.
3-way,4-way handshake에 관하여
TCP통신과 3-way-handshake
TCP통신과 4-way-handshake
TCP통신과 양방향통신 그리고 소켓통신
TCP통신과 소켓 프로그래밍
그렇다면, HTTP통신은 어떻게 이루어지는것일까?
HTTP통신에 대해 정리하고 대개 고민하고 헷갈리는 부분에 대해 한번에 정리하도록 하겠다.
위의 그림만 보더라도, HTTP통신은 TCP 위에서 이루어지는것을 알 수 있다. 즉, HTTP통신이 이루어지려면 TCP를 거쳐야 한다는 말인데, 이 말이 무엇인지 아래 그림을 보면서 설명하도록 하겠다.
위의 그림을 보면, 통신을 하기 위해서는 3-way handshake를 통해 데이터를 전송하기 전 연결하는 과정을 거치고, 데이터 전송이 끝나면 4-way handshake를 통해 연결을 끊는 과정을 거친다. 위에서 말한대로 TCP통신은 이 3-way handshake와 4-way handshake과정을 거치게 되는데, HTTP통신은 이 TCP통신 기반에서 데이터를 전송하는 부분만 맡아서 역활을 하게 된다. 즉, 쉽게말하자면 HTTP 통신을 하기위해서는 OSI 계층에서 TCP 기반인 4계층에서 3-way-handshake로 연결과정을 거치고 7계층에서 HTTP 기반으로 데이터 전송을 하고 다시 4계층에서 4-way-handshake로 연결을 끊는 과정을 거쳐야 한다는것이다.(세부적으로 다른부분이 있지만 이렇게 이해하면 쉽다. 나중에 필요시 더 자세히 보도록 하자.)
한번 더 쉽게말하자면, TCP통신 자체가 connect -> transmit -> disconnect 의 과정을 거치는데, HTTP통신에서는 connect와 disconnect를 TCP에서 맡고, transmit을 HTTP에서 맡아서 진행한다는 것이다.
HTTP통신은 TCP기반이다.(1)
HTTP통신은 TCP기반이다.(2)
HTTP통신은 TCP위에서 이루어진다.(1)
HTTP통신은 TCP위에서 이루어진다.(2)
HTTP통신은 TCP위에서 이루어진다.(3)
그러면, 이러한 배경지식을 기반으로 HTTP통신의 특징에 대해 보도록 하겠다.
HTTP통신은 TCP통신과는 다르게 단방향 통신이다. 즉, http통신은 클라이언트의 요청이 있을때만, 서버단이 응답하고 처리를 해주며 해당 응답이 끝나면 연결을 바로 끊게 된다. (서버단에서 클라이언트단으로 요청을 먼저 보낼 수 있는 양방향 통신과는 다르다.) 예를 들면, 우리가 특정 웹페이지(예를들어, sooolog.dev로 생각해보자.)를 들어가기위해 브라우저에 sooolog.dev를 입력하면 서버단에 요청이 들어오고 sooolog.dev에 해당하는 내용들을 브라우저(클라이언트)에게 보내고 연결이 끊기면서 끝나게된다.
위에서 설명한대로, HTTP통신은 TCP를 거쳐야 하니, 3-way,4-way handshake의 과정을 거치는 통신이며 TCP에서 소켓을 사용하여 연결과 끊음을 진행한다. 데이터를 전송하는 과정은 7계층에서 이루어지며, 이 과정에서도 TCP에서 사용하던 소켓을 이용한다.
그렇다면, 여기서 의문이 든다. 위에서 소켓통신은 양방향통신이며 실시간통신이 가능하다고 했는데 왜 http통신은 단방향 통신이 되는것일까? TCP통신이나 HTTP통신이나 데이터를 전송할 때 소켓이 사용되는것은 동일한데. 우선, HTTP통신이 소켓 기반인 이유는 애초에 HTTP는 TCP에 기반하여 만들어졌기 때문이다. 그렇기에, HTTP통신은 3-way,4-way handshake를 거치고 데이터 전송에도 동일한 소켓이 사용되는데, 이때 데이터전송에 사용되는 소켓의 통신방식이 TCP통신의 데이터전송에서 사용되는 소켓통신과는 다른 방식으로 사용이 된다.(애초에 TCP통신에서 사용되는 소켓은 4계층에서 사용되는것이고 HTTP통신의 데이터 전송에서 사용되는 소켓은 7계층에서 사용된다.) 그렇기에, HTTP통신이 소켓 기반의 통신은 맞지만, 단방향으로 사용되고 있는것이다.
2.HTTP 프로그래밍과 소켓 프로그래밍
양방향 통신을 위해서 소켓을 사용하도록 하는 프로그래밍을 소켓 프로그래밍이라 했는데, 반대로 HTTP통신을 하기 위한 프로그래밍을 HTTP 프로그래밍이라고도 한다. 하지만, HTTP 통신에서도 소켓을 사용한다고 했으니 꼭 소켓을 사용한다고 해서 소켓 프로그래밍이라고는 하지 않는다. 즉, 해당 소켓이 어떠한 용도로 사용되느냐에 따라 HTTP 프로그래밍이 될 수도 있고, 소켓 프로그래밍이 될 수도 있는것이다.
추가로, HTTP 프로그래밍은 단방향 통신이 가능하게 하며 HTTP통신은 애초에, html파일을 전송하거나, JSON, image파일등을 전송하는데 사용된다.
HTTP프로그래밍과 HTTP통신
소켓 프로그래밍이 실제 사용되는 예로는 실시간 동영상 streaming서비스나 실시간 채팅을 들 수 있다. 이는 뒤에 나올 웹 소켓이라는것을 사용하여 구현하는데, 잠시뒤에 설명하도록 하겠다.
HTTP 프로그래밍은 우리가 브라우저에서 특정 URL을 입력하고 이에 대한 결과값을 받아올때나 요청을 보내 Server의 응답을 기다리는 어플리케이션(Android or Ios)의 개발에도 주로 사용된다.
흔히 REST API도 모두 HTTP통신에 해당한다.
3.HTTP,HTTPS 통신에서 양방향 통신을 위한 웹소켓의 사용
기존의 HTTP통신은 connectionless로 기본적으로 연결이 유지되지 않으며 단방향이라는 특징을 갖고있다. 그렇기에 이를 극복하고 양방향이면서 실시간 통신이 필요한 기능들에 대해 여러가지 시도들이 있었다.
대표적으로, http polling, http streaming등이 시도되었다. 하지만, 비효율적이며 HTTP통신에서의 한계점 때문에 다른 대안이 제시되었다.
http polling이나 http streaming에 대해 더 알고싶다면 아래 참조링크를 참고하도록 하자.
http polling과 http streaming의 개념
그리하여, web socket(웹 소켓)이라는 개념이 나오게 됬다. 웹 소켓은 일반 소켓(TCP 기반 소켓)처럼 양방향에 실시간 통신이 가능하며, IP와 포트를 사용한 통신을 한다는점에서 공통점을 갖고 있다. 하지만, 웹 소캣은 기본적으로 HTTP 기반 계층(7 layer)에서 작동한다는점에서 일반 소켓이 TCP 기반 계층(4 layer) 에서 작동한다는 점에서 다르다.
그렇기에, 웹 소켓과 소켓은 엄연히 다른것으로 보아야 한다.
웹 소켓을 기반으로 하는 통신은 WebSocket 프로토콜이라는 새로운 규약에서 이루어진다. 하지만, 웹 소켓 통신을 위한 별도의 포트는 없으며 포트 80,443(http:80, https:443)을 사용하도록 설계되어져 있다. 그렇기에 HTTP 프로토콜, HTTPS 프로토콜과도 호환이 되도록 설계되어져 있다고 하는 것이다. (기존 HTTP도 포트80, HTTPS는 443에서 이루어지기 때문)
즉, 조금 더 풀어서 얘기하자면 최초 접속시 HTTP 혹은 HTTPS 위에서 3-way handshake를 거치고, 그 이후에 웹 소켓을 이용해야하는 경우에 HTTP Upgrade header라는 걸 사용하여 HTTP 프로토콜에서 혹은 HTTPS 프로토콜에서 WebSocket 프로토콜로 전환시킨다.
그렇기에, WebSocket 프로토콜이 HTTP 프로토콜을 대체하는 개념은 아니고 상호보완하는 개념으로 볼 수 있다. 더 자세한 내용들에 대해서는 실제로 웹 소켓을 사용할 때 알아보도록 하자.
HTTPS는 HTTP의 보안이 강화된 버전으로 HTTP를 기반으로 하여 웹서버와 통신을 하되 암호화 통신을 위한 별도의 협의 과정을 거치는것을 의미한다.
HTTPS와 HTTP의 관계
덧붙이자면, 모든 프로토콜에는 기본적으로 사용하는 포트들이 있다. SSH는 TCP기반의 22포트를 사용하고, HTTP는 TCP기반의 80포트, HTTPS는 TCP기반의 443포트를 사용한다. 그렇기에 위에서 웹 소켓통신시에 80포트와 443포트를 사용한다고 했을때 HTTP와 WebSocket 프로토콜이 서로 호환된다고 얘기가 가능한것이다.
각 프로토콜별 기본 포트
웹 소켓을 이용하는 프로토콜의 표시는 WS(WebSocket)으로 나타낸다.
웹 소켓 프로토콜의 표시
웹 소켓은 HTML5 이후에 나온 개념이기 때문에, html5이전 기술로 구현된 서비스의 경우에는 Socket.io, SocketJS를 사용하며, 이는 html5이전의 기술로 구현된 서비스에서 웹 소켓처럼 사용할 수 있도록 도와주는 기술이다.
그 외에, 예전에는 웹 소켓은 지원하지 않는 브라우저가 있었으나 현재는 거의 모든 브라우저에서 지원해주고 있으며, 버전이 낮은 경우 위의 Socker.io나 SockerJS를 사용하여 크로스 브라우징을 해주면 된다.
웹 소켓과 Socket.io, SocketJS는 같은 기능을 하는것은 맞지만 서로 다른 기술이다. 상황에 맞게 사용하면 되는것이다. 자세한 사항은 아래 참조링크를 보도록 하자.
웹 소켓과 Socket io에 관하여
태그 : #OSI 7layer, #protocol, #HTTP, #TCP, #HTTP 통신, #TCP 통신, #3-way-handshake, #4-way-handshake, #양방향통신, #소켓 통신, #소켓 프로그래밍, #단방향통신, #HTTP 프로그래밍, #웹 소켓, #WebSocket, #WS