[CS] HTTP와 TCP 그리고 Web Socket 해부하기

유아 Yooa·2023년 11월 15일
2

CS

목록 보기
2/4
post-thumbnail

Overview

웹 개발을 제대로 하기 위해서 관련 지식을 탄탄히 쌓아나가야 한다. 어립잡아 아는 것으로는 어떤 도움도 줄 수 없다. HTTP와 TCP, Web Socket의 차이는 알고 개발하자!

미리 알면 좋다.

OSI 7 Layer : ISO(국제표준기구)에서 만든 네트워크를 7계층으로 만든 모델

Protocol : 상호간의 접속이나 전달방식, 통신방식, 주고받을 자료의 형식, 오류 검출 방식, 코드 변환방식, 전송속도 등에 대하여 이미 정해진 약속

⇒ 레이어별 프로토콜은 OSI 7 Layer에서 레이어간에 존재하는 네트워크 통신을 위한 규약을 뜻한다.

HTTP와 TCP

HTTP(HyperText Transfer Protocol)는 OSI 7 Layer 중 최상위인 Application 계층(7계층)에서 동작한다. 개념적으로 본다면 HTTP는 TCP/IP 계층(4계층) 위(상위 레이어)에서 동작하는 것. 즉, HTTP 통신이 이루어지려면 TCP(Transmission Control Protocol) 를 거쳐야 한다.

TCP 통신에서는 소켓을 이용한 연결방식을 사용한다. 소켓도 마찬가지로 TCP 기반으로 나온건데 HTTP와 차이점은 연결 지향 / 동기식 통신이 필요할 때 소켓 통신을 이용하는게 더 유리하다.

소켓을 이용한 연결은 TCP 프로토콜을 기반으로 맺어진 연결이며, 소켓 통신이라고도 부른다. 이러한 소켓 통신을 사용하도록 설계하는 프로그래밍을 소켓 프로그래밍이라고 한다.

TCP 통신


TCP 통신을 하기 위해서는 3-way-handshake를 통해 데이터를 전송하기 전 연결하는 과정을 거친다. 데이터 전송이 끝나면 4-way-handshake를 통해 연결을 끊는 과정을 거친다.

Handshake라는 과정으로 서로가 통신할 수 있는 상태를 먼저 인증하고 나서 통신을 하는 연결지향적인 양방향 통신이다.

양방향 통신이란, 클라이언트단과 서버단이 서로 연결되어 있을 때 양방향으로 요청을 보내 통신을 할 수 있게 해주는 것이다. 연결이 끊어지지 않고 계속 유지해주어 서로에게 언제든 실시간으로 상태를 보낼 수 있으며, 받을 수도 있다.

보통 실시간 처리에서 많이 사용이 된다.
e.g. 실시간 게임
(* 방송과 라디오, 음성 통신은 TCP 통신이 아닌 UDP 통신)

HTTP 통신

HTTP 통신은 이 TCP 통신 기반에서 데이터를 전송하는 부분만 맡아서 역할을 하게 된다. 쉽게 말하면, HTTP 통신을 하기 위해서는 OSI 7 Layer에서 TCP 기반인

1) 4계층에서 3-way-handshake로 연결 과정을 거치고
2) 7계층에서 HTTP 기반으로 데이터를 전송하고
3) 다시 4계층에서 4-way-handshake로 연결을 끊는 과정을 거쳐야 한다는 것이다.

데이터 형태

  • TCP : Byte Array로 정보를 통신한다.
  • HTTP : string으로 정보를 통신한다.

HTTP 통신은 비연결지향적인 단방향 통신이다. 클라이언트의 요청이 있을 때만 서버단이 응답하고 처리를 해주며 해당 응답이 끝나면 연결을 바로 끊게 된다. 언제든 요청을 하면 그에 해당하는 값으로 답을 준다.

e.g. 인터넷 페이지

현재 보고 있는 페이지를 요청 후 받아서 결과로 처리하는 화면을 보고 있으며, 단방향 통신으로 현재는 연결되어 있지 않다.

클라이언트로부터 특정 URL로 요청이 들어오면 DNS 서버가 도메인에 매핑되는 IP 주소를 받아온다. TCP 계층에서 HTTP 메시지를 패킷으로 분해하고, IP 계층에서 전송 위치를 확인한 후 네트워크를 통해 전송한다. 받는 쪽은 위 과정을 역순으로 진행하여 처리한다.

HTTP 통신에서의 소켓

위에서 말했듯이 HTTP 통신은 TCP 통신 위에서 동작하므로 TCP에서 소켓을 사용해 연결과 끊음을 진행하고, 7계층에서 데이터를 전송하는 과정에서도 TCP에서 사용하던 소켓을 이용한다.

그러면 여기서 의문점🤔 소켓 통신은 양방향 통신이며 실시간으로 요청과 응답을 받는다고 하였는데 왜 HTTP 통신은 단방향 통신이 되는걸까?

출처 : docs.oracle.com/javase/tutorial/networking/sockets/definition.html

What Is a Socket?

A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to. An endpoint is a combination of an IP address and a port number.

소켓이란 네트워크 위에서 돌아가는 두 프로그램 간의 양방향 통신링크의 엔드포인트입니다. 소켓은 포트 넘버를 할당받아 TCP 레이어가 데이터의 목적지인 애플리케이션을 식별하도록 합니다. 엔드포인트는 IP 주소와 포트넘버의 조합입니다.

평소 개발에서 웹 서버를 만들 때 80포트를 이용해서 만든다. 이때 쓰는 엔드포인트도 IP 주소와 포트넘버의 조합이다. HTTP는 TCP에 기반하여 만들어졌기 때문에 HTTP 또한 소켓 통신을 활용한 방식의 일종인 것.

데이터 전송에 사용되는 소켓의 통신 방식이 TCP 통신의 데이터 전송에서 사용되는 소켓 통신과는 다른 방식으로 사용이 된다. 그렇기에 HTTP 통신은 소켓 기반의 통신이 맞지만, 단방향으로 사용되고 있는 것👀.

해당 소켓이 어떠한 용도로 사용되었느냐에 따라 HTTP 프로그래밍이 될 수도 있고, 소켓 프로그래밍이 될 수 있다.

Keep-Alive

초기에는 서버단에서 응답(3-way Handshake)한 후에 클라이언트의 Connection을 바로 끊어버렸으나, 최근에는 웹이 발전하며 콘텐츠가 다양하고 무거워지면서 매 요청마다 3-way Handshake를 하는 반복 작업이 웹 페이지의 로딩 시간의 증가와 사용자 경험 하락으로 이어졌다.

이처럼 성능상의 이유로 Keep-Alive 옵션을 통해 일정 기간 동안 클라이언트와 Connection을 유지하는 방식으로 통신이 가능해졌다고👀. (* Connection을 맺고 끊는 비용이 비싸다고 한다.)

Web Socket

양방향 통신이면서 실시간 통신이 필요한 기능들에 대해서는 여러가지 시도(e.g. http polling, http streaming..)가 있었고 HTTP 통신의 한계로 인해 다른 대안이 제시되었다. 그것이 Web Socket이라는 개념이다.

웹 소켓은 일반 TCP 기반 소켓처럼 양방향에 실시간 통신이 가능하며, IP와 포트를 사용한 통신을 한다는 점에서 공통점이 있다. 그러나 웹 소켓은 기본적으로 7계층에서 작동한다는 점이 TCP 소켓과 차이가 있다.
⇒ 웹 소켓과 소켓은 엄연히 다른 것.

웹 소켓을 기반으로 하는 통신은 Web Socket(WS) 프로토콜이라는 새로운 규약에서 이루어진다. 하지만, 웹 소켓 통신을 위한 별도의 포트는 없으며 80, 443 포트를 사용하도록 설계되어 있다. 그렇기에 HTTP, HTTPS와도 호환이 되도록 설계되어져 있다고 하는 것.

최초 접속 시 HTTP나 HTTPS 위에서 3-way-handshake를 거치고 그 이후 웹 소켓을 이용하는 경우 HTTP Upgrade header를 사용해 HTTP나 HTTPS에서 Web Socket 프로토콜로 전환시킨다.

그러므로 Web Socket 프로토콜은 HTTP 프로토콜을 대체하는 개념은 아니고 상호보완하는 개념으로 봐야한다👀.

HTTP Keep Alive와 WebSocket

HTTP의 Keep-Alive는 지속적 연결 방식이라고도 부른다. WS 프로토콜과 무엇이 다른걸까?

HTTP Keep-Alive는 클라이언트가 서버와 한 번 연결되면, 제한 시간 내에는 신뢰할 수 있는 연결을 위해 3-way Handshake의 반복 작업으로 발생시킬 수 있는 오버헤드가 없어지는 것이다.

하지만 연결이 되어 있는 동안 결국 Keep-Alive도 HTTP의 요청 및 응답 방식을 따르기 때문에, 클라이언트가 서버에 데이터를 요청하고 응답받는 것은 가능하지만, 서버가 원할 때에 클라이언트에게 데이터를 보내줄 수는 없다. (여전히 단방향)

하지만 WS 프로토콜은 양방향이므로, 서버 또한 언제든 원할때 클라이언트에게 데이터를 보내줄 수 있다.

HTTP 통신과 TCP 통신 둘 중 필요한 경우는?

  • HTTP 통신
    소켓 연결 과정(3-way-handshake)이 없으므로 간단한 정보들을 주고 받을 때 사용하면 좋다.
    웹 페이지처럼 단순한 데이터들로만 구성이 되어 있는 경우

  • TCP 통신
    서버에 소켓 연결을 하며 언제든 통신을 주고 받을 준비를 하기 때문에 여러 Client가 붙으면 그만큼 서버에 부담이 된다. 실시간 통신이 필요하다면 사용할 수 있다.


참고

profile
기록이 주는 즐거움

0개의 댓글