[HTTP_NETWORK] HTTP와 TCP/IP

업데이트:

이번 시간에는 HTTP와 TCP/IP에 대해 알아보자.


1. HTTP란?

웹 브라우저 주소 입력란에 URL을 입력하면 어떻게 해서 웹 페이지가 보여지게 될까?

  • 웹 브라우저는 주소 입력란에 입력된 URL을 가지고 웹 서버에서 리소스라고 불리는 파일 등의 정보를 얻어오게 된다.
  • 이 때 서버에 정보를 요청하는 웹 브라우저 등을 클라이언트(client)라 부른다

  • 클라이언트에서 서버까지 일련의 흐름을 결정하는 것은 웹에서 HTTP라 불리는 프로토콜(약속)이다.

1) HTTP/0.9

1990년 등장. 이 당시 HTTP가 정식 사양서는 아니었음. HTTP/1.0 이전 버전이라는 의미로 HTTP/0.9로 불리고 있음.

2) HTTP/1.0

1996년 5월 HTTP가 정식 사양으로 공개됨. 초기의 사양이지만 아직도 많은 서버에서 사용하고 있는 사양.

3) HTTP/1.1

1997년 1월 공개된 버전.

4) HTTP/2.0

2015년 7월 공개된 버전.

2. 네트워크의 기본이 되는 TCP/IP

HTTP의 이해를 위해서는 TCP/IP 프로토콜에 대해 알아야 할 필요가 있다. 인터넷을 포함해 일반적인 네트워크는 TCP/IP에 의해 움직이고 있으며 HTTP는 그 중 하나이다. 상호간에 통신하기 위해 서로 같은 방법으로 통신하지 않으면 안된다. 이렇게 서로 다른 하드웨어와 운영체제 등을 가지고 서로 통신하기 위해서는 규칙이 필요한데 이러한 규칙을 프로토콜 이라고 부른다.

프로토콜에는 여러가지가 있는데 인터넷과 관련된 프로토콜을 모은 것을 TCP/IP라 부르고, TCP/IP는 4개의 계층으로 나뉘어진다.

1) 애플리케이션 계층

애플리케이션 계층은 유저에게 제공되는 애플리케이션에서 사용하는 통신의 움직임을 결정한다. TCP/IP에는 여러 공통 애플리케이션이 준비되어 있는데 FTP랑 DNS도 이 중 한가지이다. HTTP도 이 계층에 포함된다.

2) 트랜프포트 계층

애플리케이션 계층에 네트워크로 접속되어있는 2대의 컴퓨터 사이의 데이터 흐름을 제공한다. 트랜스포트 계층에는 서로 다른 성질을 가진 TCP와 UDP 두 가지 프로토콜이 있다.

3) 네트워크 계층

네트워크 상에서 패킷의 이동을 다룬다. 패킷이란 전송하는 데이터의 최소 단위를 의미한다. 이 계층에서는 어떠한 경로를 거쳐 상대 컴퓨터까지 패킷을 보낼지 결정하기도 한다. 인터넷의 경우 상대 컴퓨터에 도달하는 동안 여러 대의 컴퓨터와 네트워크 기기를 거쳐 상대방에게 전달되는데, 여러 가지 선택지 중 하나의 길을 정하는 것이 네트워크 계층의 역할이다.

4) 링크 계층

네트워크에 접속하는 하드웨어적인 면을 다룬다. 운영체제가 하드웨어를 제어하기 떄문에 디바이스 드라이버, 네트워크 인터페이스 카드(NIC)를 포함한다. 하드웨어적 측면은 모두 링크 계층의 역할이다.

3. TCP/IP 통신의 흐름

TCP/IP로 통신할 때 계층을 순서대로 거쳐 상대와 통신을 한다. 송신하는 측은 애플리케이션 계층에서부터 내려가고, 수신하는 측은 애플리케이션 계층으로 올라간다.

예시) 클라이언트 애플리케이션 계층 (HTTP 클라이언트) -> 클라이언트 트랜스포트 계층 (TCP) -> 클라이언트 네트워크 계층 (IP) -> 클라이언트 링크 계층 (네트워크) -> 서버 링크 계층 (네트워크) -> 서버 네트워크 계층 (IP) -> 서버 트랜스포트 계층 (TCP) -> 서버 애플리케이션 계층 (HTTP 서버)

1) 클라이언트 애플리케이션 계층 (HTTP 클라이언트)

HTTP 에서 어느 웹 페이지를 보고싶다는 HTTP 리퀘스트를 지시

2) 클라이언트 트랜스포트 계층 (TCP)

애플리케이션 계층에서 받은 데이터 (HTTP 메시지) 를 통신하기 쉽게 조각내어 안내 번호와 포트 번호를 붙여 네트워크 계층에 전달

3) 클라이언트 네트워크 계층(IP)

수신지 MAC 주소를 추가해서 링크 계층에 전달. 이를 통해 네트워크를 통해 송신할 준비가 됨.

4) 클라이언트 링크 계층 (네트워크) -> 서버 링크 계층 (네트워크)

수신측 서버는 링크 계층에서 데이터를 받아들여 순서대로 위의 계층에 전달. 애플리케이션 계층에 도달하면 클라이언트가 발신한 HTTP리퀘스트를 수신할 수 있음.

송신 쪽에서 각 계층을 거칠 떄는 헤더로 불리는 해당 계층마다 필요한 정보를 추가한다. 반대로 수신 측에서는 각 계층을 거칠 떄마다 해당 계층에서 사용한 헤더를 삭제. 이를 캡슐화라 한다.

4. HTTP와 관계가 깊은 IP/TCP/DNS 프로토콜

1) 배송을 담당하는 IP

IP는 네트워크 계층에 해당한다. 인터넷을 활용하는 거의 대부분의 시스템이 IP를 이용하고 있다. TCP/IP 명칭의 일부가 될 정도로 중요한 프로토콜이다. IP의 역할을 개개의 패킷을 상대방에게 전달하는 것이다. 상대에게 패킷을 전달하기 위해 여러 요소가 필요한데 그 중에서 IP 주소와 MAC 주소가 중요하다. IP 주소는 각 노드에 부여된 주소를 가리키고 MAC 주소는 각 네트워크 카드에 할당된 고유의 주소이다. IP 주소는 MAC 주소와 결부된다. IP 주소는 변경이 가능하지만 MAC 주소는 변경이 불가하다.

IP 통신은 MAC 주소에 의존해서 통신을 한다. 인터넷 통신에서 통신 상대가 같은 랜선 내에 있는 경우는 드물다. 따라서 여러 대의 컴퓨터와 네트워크 기기를 중계해서 상대방에게 도착하게 된다. 이렇게 중계하는 동안 다음으로 중계할 곳의 MAC 주소를 사용해서 목적지를 찾아가게 된다. 이 때 ARP라는 프로토콜이 사용된다.

ARP는 주소를 해결하기 위한 프로토콜 중 하나인데, 수신지의 IP 주소를 바탕으로 MAC 주소를 조사할 수 있다.

2) 신뢰성을 담당하는 TCP

TCP는 트랜스포트 계층에 해당되는데, 신뢰성 있는 바이트스트림 서비스를 제공한다. 바이트 스트림 서비스란 큰 데이터를 쉽게 보내기 위해 TCP 세그먼트라 불리는 단위 패킷으로 작게 분해하여 관리하는것을 의미하고, 신뢰성 있는 서비스는 상대방에게 보내는 서비스를 의미한다. 결국 TCP는 대용량의 데이터를 보내기 쉽게 작게 분해하여 상대에게 보내고, 정확히 도착했는지 확인하는 역할을 담당하고 있다.

상대에게 데이터를 보냈는지 확인하기 위해 TCP는 ‘three way handshaking’이라는 방법을 사용하고 있다. 패킷을 보내고 나서 바로 끝내는 것이 아니라 보내졌는지 여부를 상대에게 확인하러 간다. 이것은 ‘SYN’과 ‘ACK’라는 TCP 플래그를 사용한다.

송신 측에서는 최초 ‘SYN’플래그로 상대에게 접속함과 동시에 패킷을 보내고 수신측에서는 ‘SYN/ACK’ 플래그르 송신측에 접속함과 동시에 패킷을 수신한다. 마지막으로 송신측이 ‘ACK’ 플래그를 보내 패킷 교환이 완료되었음을 전한다. 중간에 통신이 끊기는 경우 TCP는 그와 동시에 같은 수순으로 패킷을 재전송한다. TCP는 이 외에도 통신의 신뢰성을 보증하기 위한 다양한 시스템을 갖추고 있다.

3) 이름 해결을 담당하는 DNS

DNS는 HTTP와 같이 응용 계층 시스템에서 도메인 이름과 IP 주소 이름 확인을 제공한다. 컴퓨터는 IP 주소와는 별개로 호스트 이름과 도메인 이름을 붙일 수 있다. 사람은 IP 주소 대신 이름을 이용해 상대의 컴퓨터를 지정하고, 컴퓨터는 IP 주소를 가지고 상대의 컴퓨터를 지정한다. DNS는 도메인명에서 IP 주소를 조사하거나 반대로 IP주소를 가지고 도메인명을 조사하는 서비스를 제공하고 있다.

5. 전체적인 흐름

1) 클라이언트는 도메인명을 가지고 DNS에서 IP주소를 획득한다.

2) 클라이언트는 HTTP 담당 웹 서버에 보낼 HTTP 리퀘스트를 작성한다.

3) 클라이언트의 TCP 담당이 HTTP 리퀘스트를 패킷으로 분해하고 일련번호를 부여한 뒤 상대에게 패킷을 전송한다.

4) 라우터 등에서 상대가 어디있는지 찾아 중계해가면서 배송한다.

5) 서버 TCP 담당이 패킷을 수신하고 패킷을 재조립한다.

6) 서버 HTTP 담당이 웹 서버에 대한 리퀘스트 내용을 처리한다.

7) 리퀘스트 처리 결과도 마찬가지로 TCP/IP 통신 순서대로 클라이언트에 반환한다.

6. URI와 URL

웹 브라우저에 웹 페이지를 표시하기 위해 입력하는 주소가 URL이다.

ex) https://www.google.co.kr

URI는 리소스를 식별하기 위한 문자열 전반, 통합 자원 식별자이다.

반면 URL은 리소스의 장소(네트워크 상위 위치)를 나타낸다. URL은 URI의 서브셋에 해당한다.