HTTP/0.9의 등장
HTTP 프로토콜은 HTML이라는 문서를 통신하기 위한 프로토콜로 1966년에 도입되었다. 이가 HTTP/0.9
이다.
이 버전은 GET
메소드만 지원하고 헤더나 상태 코드도 존재하지 않는 정말 프로토타입의 HTTP 프로토콜이었다.
HTTP1의 도입
HTTP/1.0
은 POST
나 HEAD
메서드가 추가된 형태이다.
이러한 메서드의 도입으로 응용할 수 있는 부분이 늘어났지만, 여전히 많은 문제를 가지고 있었다.
이러한 문제들을 해결하여 나온 HTTP 버전이 1.1
이다.
Persistent Connections
HTTP는 단일한 요청에 대해 단일한 응답을 주는 프로토콜로 설계되었다.
하지만 요청이 빈번해져도 하나의 요청에 대해 하나의 응답만 해줄 수 있기 때문에 불필요한 3-way-handshake
를 거쳐한다.
HTTP/1.1
은 연결을 지속할 수 있도록 하여 이러한 오버헤드를 줄였다. 직접 닫도록 지시하지 않는 이상 TCP 커넥션을 열린 상태로 유지한다.
pipelining
HTTP/1.1은 파이프라이닝이 가능하도록 업데이트 되었다.
클라이언트가 먼저 처리한 요청에 대한 응답을 기다리지 않고 하나의 커넥션에서 여러 요청을 보낼 수 있도록 허용하는 것이다.
Chunked Transfer Encoding
HTTP/1.1은 서버가 전체 응답이 생성될 때까지 기다리지 않고 작은 청크 단위로 응답을 보낼 수 있도록 허용하는 청크 전송 인코딩을 도입되었다.
이를 통해 특히 대규모 또는 동적으로 생성된 콘텐츠의 경우 더 빠른 초기 페이지 렌더링과 향상된 사용자 경험이 가능해졌습니다.
Caching and Conditional Requests
HTTP/1.1은 조건부 요청을 처리하는 캐싱 전략들이 도입되었다.
Cache-Control
및 ETag
와 같은 헤더를 추가하여 클라이언트와 서버가 캐시된 콘텐츠를 더 잘 관리하고 불필요한 데이터 전송을 줄일 수 있게 되었다.If-Modified-Since
및 If-None-Match
와 같은 헤더를 사용하는 조건부 요청을 사용하면 클라이언트가 이전 요청 이후 수정된 리소스만 요청할 수 있다.
HTTP/1.1의 문제
HTTP/1.1
은 20년동안 웹 생태계의 많은 성장을 가져왔지만, 웹 또한 상당한 발전을 거듭하여 HTTP/1.1 또한 근본적인 성능 문제가 드러나고 있다.
1. pipelining의 문제
pipelining을 통해 하나의 요청을 따르는 다른 요청들을 대기하지 않고 파이프라이닝해서 요청할 수 있게 되었지만,
브라우저는 구현의 어려움으로 파이프라이닝을 지원하지 않는다.
또한 브라우저는 head-of-line(HOL 차단) 문제가 여전히 남아있다.
이 문제는 대기열 헤드에서 차단된 요청이 그 뒤의 모든 요청을 차단할 수 있다는 것이다.
2. 다수의 HTTP 커넥션 문제
HOL차단은 도메인당 여러 HTTP 연결을 잡아주는 방법으로 어느정도 해결되었다. 크롬은 도메인 당 최대 6개 까지 지원한다.
하지만 최근의 페이지들은 이것만으로 충분하지 않다.
차선책으로, 많은 웹서버들은 이미지, css, js 등의 정적 리소스들을 다른 서브도메인에서 서빙한다. 각각의 서브 도메인 마다, 요청에 대한 6개의 커넥션을 더 얻는다. 이를 Domain Sharing
이라 부른다. 하지만 이 또한 문제가 있다.
TCP 커네션을 잡는데 시간이 걸리고, 별도의 메모리와 프로세스를 사용해야한다. 다수의 HTTP 커넥션을 사용하면, 서버와 클라이언트 모두 성능에 부하를 줄 수 있다.
'CS' 카테고리의 다른 글
HTTP/2에 대해 (0) | 2024.07.01 |
---|---|
좀비 프로세스와 고아프로세스 (0) | 2024.06.07 |