본문 바로가기

잡다한 개발잡담

HTTP를 이해하자(1)

인터넷에서 자료를 전송받으려면 서로 간의 통신이 필요하다. 이러한 통신은 어떻게 이루어지는지 알아보려고 한다. 마침 HTTP 프로토콜을 이해할 필요가 있다고 생각을 하고 있는 와중에 김영한 님의 강의를 들으며 나의 약간의 생각을 양념해서 정리해보았다. 강의는 크게 8개의 섹션으로 분리되어 있으며 하나씩 알아보려고 한다.

인터넷 네트워크

인터넷에서 A와 B가 통신을 하기 위해서는 프로토콜이란 약속이 필요할 것이다. 이러한 약속에는 많은 것들이 있을 텐데, 가장 중요한 것은 어디로 보내야 하냐? 즉, 주소일 것이다. 데이터를 어디로 전송하는 게 가장 중요한 부분이니까 말이다.

그래서 우리는 IP 주소라는 것을 부여하여 통신을 이루어질 수 있게 했다. 

IP 프로토콜의 역할

  • 지정한 IP 주소에 데이터 전달
  • 패킷이라는 통신 단위로 데이터 전달

근데 이러한 IP 프로토콜만으로 데이터를 전송하려면 한계가 존재한다.

IP 프로토콜의 한계

  • 비연결성 - 패킷을 받을 대상 또는 대상의 상태가 명확하지 않아도 전송
  • 비신뢰성 - 패킷의 손실 우려, 패킷이 순서대로 도착한다는 보장이 없음
  • 프로그램 구분 - 같은 IP에서 어플리케이션을 어떻게 구분할 것인가?

그럼 이러한 한계를 해결해줄 수 있는 방법이 분명 있을 텐데 그것이 바로 TCP다.

TCP와 UDP

TCP는 위에서 말한 IP 프로토콜의 한계를 해결해줄 수 있는 방법을 가지고 있다.

먼저 인터넷 프로토콜의 4계층을 한번 보자.

위와 같이 존재하며 IP의 한계를 위의 계층인 TCP가 보완하는 형태이다. 실제로 데이터를 전송할 때는, HTTP -> TCP -> IP -> NI순으로 갈 것이다. 위에서부터 전달하면서 자신의 정보들을 덧씌우는 형태이다.

TCP 특징

  • 연결지향 -  3 way handshake( 가상 연결 - 실제로 물리적으로 연결되는 것이 아니다.)
  • 데이터 전달 보증
  • 순서 보장

https://afteracademy.com/blog/what-is-a-tcp-3-way-handshake-process

tcp는 출발지 port, 목적지 port, 전송 제어, 순서, 검증 정보 등의 데이터를 담아 전송한다.

UDP

udp는  tcp의 저런 기능들은 하나도 없다. 그러므로 당연히 데이터의 신뢰성 있는 전달이나 순서가 보장되지 않는다. 그렇지만 3 way handshake를 하는 과정과 여러 가지 기능 등을 생략하므로 빠르게 보낼 수 있다. UDP는 IP와 거의 동일한 형태이며 PORT와 체크섬 정도만 추가된다. HTTP3의 스펙은 UDP로 나오며 앞으로 각광받을 확률이 높다고 하니 체크해보자.

PORT

yotubue도 하고 있고, 카카오톡도 하고 있는데 같은 컴퓨터에서 실행 될 테니 ip는 동일할 것이다. 그러므로 이러한 애플리케이션을 구분하는 내부적인 주소가 필요한데 이것을 port라고 부른다.

DNS

DNS는 전화번호부로 생각하면 된다. IP는 기억하기 어렵고 IP는 변경될 가능성이 있다. IP를 바꿀 때마다 클라이언트에게 알리는 것이 너무 번거로우니까 DNS 서버라는 것을 두어서 도메인 명과 IP를 설정할 수 있다.

즉 naver.com에 들어가기 위해 dns 서버로 접속해 naver.com의 도메인 주소에 알맞은 ip주소를 찾는다. 그리고 찾은 ip를 통해 진짜 서버로 접속하는 것이다.

URI(Uniform Resource Identifier)

URI? URL? URN? 뭘까요

URI는 로케이터(locator), 이름(name) 또는 둘 다 추가로 분류될 수 있습니다. 

김영한님 강의

URI는 리소스를 식별하는 것인데 자원이 어디에 있는지를 식별하는 방법이다. 2가지의 종류로 나눌 수 있는데 URL과 URN으로 나눌 수있다. URL은 주소이고, URN은 이름이다!

URL은 흔하게 볼 수 있는 인터넷상의 주소이고 urn은 이름을 부여한 것인데 거의 사용하지 않으므로 이런것이 있다라는 것만 알고 있으면 될 것 같다.

웹 브라우저의 요청 흐름

구글에 접속했을 때 일어나는 요청 흐름을 알아겠다.

웹 브라우저는 구글 서버를 찾아야 할 것이다.

1. DNS 서버를 조회하여 IP를 찾아낸다.

2. PORT 정보를 찾아낸다. (https면 443, http면 80 포트는 위 두개의 포트는 url에서 생략 가능하다.)

3. HTTP 요청 메시지를 생성한다. (GET /path/query/ , http 버전 정보, host 정보)

4. socket 라이브러리를 통해 TCP/IP로 3 way handshake 후 데이터를 전달한다.

5. 아래의 계층에서 패킷을 씌우면서 인터넷 망으로 전송한다.

6. 구글 서버가 요청이 도착하면 패킷을 계층에 따라 분리하면서 http 메시지를 찾아낸다.

7. http 메시지에서 요청한 데이터를 찾고 http 응답 메시지를 만든다.

8. 응답 패킷을 요청한 웹 브라우저에 전달한다.

9. 웹 브라우저는 html 파일을 렌더링해서 사용자에게 보여준다.