HTTP란?
HTTP는 HyperText Transfer Protocol의 줄임말로 웹 환경에서 정보를 주고받는 의사소통의 규칙 및 약속이며 데이터 전송에 TCP 프로토콜, 라우팅에 IP프로토콜을 사용하는 구조를 갖추고 있다.
※ TCP에 대한 설명은 아래 링크를 참고
https://developer111.tistory.com/100
HTTP 버전별 특징
HTTP/0.9 | HTTP/1.0 | HTTP/1.1 | |
메서드 | GET | HEAD, POST 추가 | PUT, PATCH, DELTE 등 추가 |
헤더 | 미존재 | http 버전 정보, 상태코드, Content-type 등 |
Connection, Host 등 |
응답 | HTML 문서만 | 다양한 문서 가능 | - |
HTTP 0.9
헤더가 존재하지 않고 GET 요청만 존재하며 http메시지가 한줄로 이루어진 원라인 프로토콜이었다.
HTTP 1.0
상태코드가 추가되어 오류 파악에 용이해지게 됬다. 1.0 이전에는 에러 페이지를 별도로 작성해야했다.
헤더영역이 추가되었고 Content-type을 통해 다양한 문서를 전송할수 있게 되었다.
1.0까지 커넥션 하나에 하나의 요청만 가능한 구조였기에 요청마다 tcp연결과 종료를 설정하는 오버헤드가 존재하였다.
HTTP 1.1
HTTP의 가장 중요한 개념은 연결 지속성(Persistent Connection)이다.
Connection을 지정한 timeout 시간 동안 종료하지 않고 요청-응답을 반환하기 위해 유지할 수 있게 되었다.
즉, 하나의 커넥션에 여러 요청-응답을 반환할 수 있다.
// 연결 지속
Connection : Keep-Alive
Keep-Alive : timeout:5, max=1000
// 연결 지속X
Connection: Close
1.1에서는 Piplelining 방식도 지원하는데 요청을 한번에 보내고 응답을 이후에 받아 대기시간을 줄이는 것이다.
허나 응답의 순서는 요청 순서대로 받아야하기에 첫번째 요청의 응답이 늦어지게 되는 경우 다음 응답도 대기해야하기에 Pipelinig을 쓰지 않는 방식과 비교하여 큰 이득이 없었다. 또한 Pipelining 구현의 복잡성, 서버의 Pipelinig 미지원 등의 문제로 대부분의 브라우저에서 Pipelining 방식을 비활성화하였다.
또다른 특징 중 하나는 Host 헤더의 추가이다. Host 헤더는 요청을 보낼 도메인 주소이다.
HTTP/1.0 이전에는 하나의 IP 주소에 하나의 도메인만 연결할 수 있었다.
HTTP/1.1에서 Host 헤더를 통해 가상 호스팅을 가능하게 했다. 가상 호스팅이란 하나의 서버가 여러 도메인을 소유하고 각 도메인에 연결된 서비스를 제공할 수 있는 것이다. 이를 통해 우리는 서버 1대에서 http 통신을 하는 여러 서비스를 제공할 수 있게 된 것이다.
http 버전별 [요청-응답] 처리 과정
HTTP/1.0 | HTTP/1.1 (Persistent Connection) |
HTTP/1.1 (PipeLining) |
![]() |
![]() |
![]() |
- 요청과 응답에 대해 매번 커넥션 연결과 종료를 해야함 |
- 일정 시간 내에 들어온 요청에 대해 커넥션 유지하여 사용 - 매 요청 커넥션을 연결하고 종료하지 않으므로 latency를 줄임 |
- '요청-응답'을 반복하지 않고 요청을 여러개 보내고 응답을 받을 수 있음 - But, 응답은 반드시 요청 순서대로 전송해야함. 이로인해 head of line blocking 발생 |
=> 결국 모든 요청-응답은 동기적으로 동작
Head Of Line Blocking
PipeLining 방식에서 요청 순서대로 응답되므로 특정 요청의 응답 처리시간이 길어진다면 다음 응답들도 모두 대기 후 전송된다.
1번 요청이 10초, 2번과 3번 요청이 1초만에 처리되어 응답을 보낼수 있어도 2, 3번 응답은 10초를 대기하고 응답을 전송하게 되고 이러한 현상을 Head of Line Blocking이라고 한다.
잠깐, http1.1에서도 결국 요청-응답 순서가 지켜지는데 어떻게 브라우저에 비동기 통신이 지원되지??
대부분의 브라우저에서 default로 사용하는 http 버전은 1.1이다.
그런데 최신 브라우저에서 비동기 통신이 지원되는 것을 잘 알고 있다.
HTTP 통신의 방식을 보면 응답은 결국 요청 순서대로 전달되는 규칙이 지켜지기에 동기적으로 동작한다.
어떻게 비동기적으로 동작하는 것일까??
"하나의 도메인에 여러 TCP 연결 활용"
브라우저는 도메인 하나에 여러개의 TCP 연결을 수립시켜준다.
대부분의 브라우저에 기본값으로 도메인당 6개의 TCP 연결이 설정되어있다.
커넥션 하나 내에서는 동기지만 커넥션을 여러개 사용하므로 비동기적으로 동작시킬 수 있는 것이다.
HTTP/2.0
Multiplexing
멀티플레싱
HTTP 메시지 전송방식에 바이너리 프레임을 사용하여 요청순서에 무관하게 응답 처리
=> Head of Line Blocking 해결
기존 HTTP 메시지는 헤더정보와 바디정보가 한줄 띄는 방식으로 구분되며 텍스트 형태였지만,
HTTP2에서 메시지를 프레임으로 쪼개고 각 프레임은 Header , Data frame으로 구성되고 바이너리로 인코딩
(바이너리 프레임은 중간에 끼어들 수 있으며 헤더정보를 통해 순서대로 조립 가능)
HTTP/2에서 TCP에 복수개의 스트림을 생성하고 스트림 하나가 요청과 응답을 모두 처리할 수 있으며 복수개의 요청과 응답 또한 하나의 스트림에서 처리 할 수 있다.
이전에는 순서대로 응답을 받아야 클라이언트가 사용할 수 있어 서버에서도 요청 순서대로 보냈지만 이제는 바이너리 프레임을 통해 요청 순서 상관없이 응답을 받아도 조립하여 사용할 수 있으므로 서버에서도 처리되는대로 응답을 보낸다.
또한 여러개의 병렬 스트림 구조로 하나의 TCP 커넥션 안에서 더 많은 요청과 응답을 처리할 수 있게되어 전보다 커넥션 연결, 종료에 대한 비용이 절감되었다.
서버푸시
- 서버에서 클라이언트가 필요할 것 같은 정보를 미리 파악하여 전달 가능
(ex. html파일을 요청하면 서버에서 html파일에 사용되는 css, js파일을 함께 보냄
헤더 압축(중복 제거)
- 이전 버전까지는 요청/응답마다 같은 헤더정보 또한 반복해서 전달해야 했지만 허프만 코드를 이용하는
HPACK 알고리즘을 이용하여 헤더를 압축하여 전송했고 이로 인해 패킷 사이즈 감소
HTTP의 성질
비연결성(connectionless)
http통신은 클라이언트의 요청에 서버의 응답이 돌아오면 연결을 끊는다.
즉, TCP 연결을 끊게 되는 것이고 요청을 할 때마다 새롭게 연결하는 것이다.
HTTP/1.0 모델에서 요청과 응답마다 커넥션을 재연결하는 것이 바로 이런 특성이다.
HTTP/1.1에서 이러한 비효율성을 해결하기 위해 Persistent Connection 방식을 통해 일정시간 동안 요청에 대해서는 하나의 커넥션 연결에서 모두 처리할 수 있게 개선되었지만 연결이 지속되지 않고 종료되므로 여전히 비연결성을 특징을 갖는다.
무상태성(stateless)
서버는 사용자의 상태를 알 수 없다. 그렇기 때문에 사용자가 이전에 어떤 요청을 했는지 알 수 없다.
예를 들어, 로그인을 했음에도 불구하고 로그인 정보가 남아 있지 않아 계속해서 로그인을 해야하는 상황이 일어난다.
허나, 우리는 위와 같은 상황에 거의 직면한 적인 없다. 이는 세션-쿠키 또는 토큰 방식으로 요청마다 상태를 알 수 있는 값들을 전달하기 때문이다.
'OS & Hardware & Network > Network' 카테고리의 다른 글
TCP 깊게 이해하기 (0) | 2023.08.15 |
---|