본문 바로가기
Computer Science/Computer Networking

[Computer Networking] Application Layer : HTTP

by __K.Jun__ 2024. 7. 4.

HTTP

HTTP(HyperText Transfer Protocol) : 각기 다른 종단 시스템에서 수행되는 클라이언트 프로그램과 서버 프로그램이 HTTP 메시지를 서로 교환하며 통신하는데, HTTP는 메시지의 구조 및 클라이언트와 서버가 메시지를 어떻게 교환하는지에 대해 정의하고 있다.
 

HTTP는 TCP를 전송 프로토콜로 사용한다. 
- 클라이언트는 80번 포트를 사용하여 서버에 TCP 연결을 시작한다.
- 서버는 TCP 연결을 수락하고, 연결이 이루어지면 브라우저와 서버 프로세스는 그들의 소켓 인터페이스를 통해 TCP로 접속한다.
- 소켓 인터페이스는 클라이언트/서버 프로세스와 TCP 연결 사이의 출입구다.
- 클라이언트/서버는 HTTP 요청 메시지를 소켓 인터페이스로 보내고/받고 소켓 인터페이스로부터 HTTP 응답 메시지를 받는다/보낸다.
- 일단 클라이언트가 메시지를 소켓 인터페이스로 보내면, 메시지는 클라이언트의 손을 떠난 것이고 TCP의 손에 쥐어진 것이다.
- 요청과 응답이 끝나면 TCP 연결이 중단된다.
 
HTTP는 비상태 프로토콜(stateless protocol)이다.
- 서버가 클라이언트에게 요청 파일을 보낼 때, 서버는 클라이언트에 관한 어떠한 상태 정보도 저장하지 않는다.
 

Non-persistent Connection & Persistent Connection

Non-persistent Connection(비지속 연결)
- 각 요구/응답 쌍이 분리된 TCP 연결을 통해 보내지는 것.

- 모든 요청 마다 2RTT + file transmission time이 필요하다.
- 비지속 연결은 각 요청 객체에 대한 새로운 연결이 설정되고 유지되어야 하기 때문에 TCP 버퍼가 할당 되어야 하고, TCP 변수들이 클라이언트와 서버 양쪽에 유지되어야 한다. 이는 수많은 클라이언트들의 요청을 동시에 서비스하는 웹 서버에게 심각한 부담을 줄 수 있다.
 
Persistent Connection(지속 연결) (HTTP/1.1)
- 모든 요구와 해당하는 응답들이 같은 TCP 연결 상으로 보내지는 것.
- 객체에 대한 요구는 진행 중인 요구에 대한 응답을 기다리지 않고 연속해서 만들어질 수 있다. (파이프라이닝)
- 일반적으로 HTTP 서버는 일장 기간 사용되지 않으면 연결을 닫는다.
- 서버가 연속된 요구를 수신할 때, 서버는 객체를 연속해서 보낸다.
- HTTP의 디폴트 모드는 파이프라이닝을 이용한 지속 연결을 사용한다.
 

HTTP Request Message

 
요청 메서드
- POST : 사용자가 폼을 채워 넣을 때 사용.
- GET : 브라우저가 URL 필드로 식별되는 객체를 요청할 때 사용
- HEAD : GET 방식과 유사, 단 서버가 요청 객체를 보내지 않는다.
- PUT : 웹서버에 업로드할 객체를 필요로 하는 애플리케이션에 의해 사용
- DELETE : 사용자 또는 애플리케이션이 웹 서버에 있는 객체를 지우는 것을 허용
 

HTTP Response Message

 
응답 코드
- 200 OK : 요청이 성공했고, 정보가 응답으로 보내졌다.
- 301 Moved Permenently : 요청 객체가 영원히 이동되었다. 새로운 URL은 응답 메시지의 Location: 헤더에 나와 있다. 클라이언트 소프트웨어는 자동으로 이 새로운 URL을 추출한다.
- 400 Bad Request : 서버가 요청을 이해할 수 없다는 일반 오류 코드다.
- 404 Not Found : 요청 문서가 서버에 존재하지 않는다.
- 505 HTTP Version Not Supported : 요청 HTTP 프로토콜 버전을 서버가 지원하지 않는다.
 

HTTP/2

HTTP/2의 주요 목표 : 하나의 TCP 연결상에서의 멀티플렉싱 요청/응답 지연 시간을 줄이는 데 있으며, 요청 우선순위화, 서버 푸시, HTTP 헤더 필드의 효율적인 압축 기능 등을 제공한다.
HTTP/2는 상태 코드, URL, 헤더 필드 등 HTTP 메소드 자체는 변경하지 않고, 클라이언트와 서버 간의 데이터 포맷 방법과 전송 방법을 변경했다.
 

HTTP/1.1
- 지속적인 TCP 연결을 이용하여 하나의 TCP 연결상에서 서버로부터 클라이언트로 보내지는 웹 페이지를 허용한다.
- 웹 페이지 당 오직 하나의 TCP 연결을 가짐으로써, 서버에서의 소켓 수를 줄이며 전송되는 각 웹 페이지는 공정한 네트워크 대역폭을 가질 수 있다.
- 그러나 하나의 TCP상에서 웹 페이지 있는 모든 객체를 보내면 HOL(Head of Line) 블로킹 문제가 발생할 수 있다.
- HOL 블로킹 : 하나의 TCP 연결을 이용하여 용량이 큰 파일은 병목 링크를 통과하는 데 오랜 시간이 걸리는 반면, 작은 파일들은 뒤에서 기다림이 길어진다.
- HTTP/1.1 브라우저에서는 여러 개의 병렬 TCP 연결을 열어서 HOL 블로킹 문제를 해결해왔다.
 

HTTP/2 프레이밍
- 하나의 웹 페이지를 전송하기 위한 병렬 TCP 연결의 수를 줄이거나 제거하기 위한 기법
- 각 메시지를 작은 프레임으로 나누고, 같은 TCP 연결에서의 요청과 응답 메시지를 인터리빙한다.
 

HTTP/3

- 트랜스포트 계층 프로토콜인 QUIC는 UDP 프로토콜 위에 위치하는 애플리케이션 계층에 구현되어 있다.
- QUIC는 메시지 멀티플렉싱, 스트림별 흐름 제어, 저지연 연결 확립과 같은 HTTP에 의미 있는 여러 특징을 갖는다.
- HTTP/3는 QUIC 위에서 작동하도록 설계된 새로운 HTTP 프로토콜이다.
- 메시지 인터리빙과 같은 HTTP/2의 특징들은 QUIC에 의해 포함되며, HTTP/3을 위한 훨씬 더 간단한 설계를 가능하게 한다.

 

HTTP와 HTTPS

HTTP : 평문 형태로 데이터를 전송하며, 기본적으로 80번 포트를 사용한다. 보안 수준이 낮으나 설정이 간단하다.

HTTPS : SSL/TLS를 사용해 데이터를 암호화하며, 기본적으로 443번 포트를 사용한다. 보안이 높고 인증서를 필요로한다.

728x90