HyperText Transfer Protocol
Non-persistent HTTP 비지속 연결
Non-persistent HTTP response time = 2RTT + file transmission time
* RTT (Round Trip Time): 작은 패킷이 클라이언트에서 서버로 갔다 오는 왕복 시간
❗ issues
- 각 요청 객체에 대해 새로운 TCP 연결이 설정되고 유지되어야 한다.
TCP 버퍼가 할당되어야 하고 TCP 변수들이 클라이언트와 서버 양쪽에 유지되어야 하므로, 수많은 클라이언트들의 요청을 동시에 서비스하는 웹 서버에게 심각한 부담을 줄 수 있다.- 각 객체는 2 RTT를 필요로 한다. (TCP 연결 설정에 1 RTT, 객체를 요청하고 받는 데 1 RTT)
Persistent HTTP 지속 연결
서버는 응답을 보낸 후에 TCP 연결을 그대로 유지한다. 같은 클라이언트와 서버 간의 이후 요청과 응답은 같은 연결을 통해 보내진다. (default Connection: keep-alive
header)
HTTP/1.1에서 도입된 pipelining을 통해 단일 TCP 연결을 통해 대응되는 응답을 기다리지 않고 여러 HTTP 요청을 보냄으로써, 웹 페이지 로딩 시간 성능을 개선했다.
ℹ️ HTTP 파이프라이닝은 모던 브라우저에서 기본적으로 활성화되어있지 않다.
- 버그가 있는 프록시들이 여전히 많은데, 이들은 웹 개발자들이 쉽게 예상하거나 분석하기 힘든 이상하고 오류가 있는 동작을 야기한다.
- 파이프라이닝은 정확히 구현해내기 복잡하다.
전송 중인 리소스의 크기, 사용될 효과적인 RTT, 그리고 효과적인 대역폭은 파이프라인이 제공하는 성능 향상에 직접적으로 영향을 미친다. 이런 내용을 모른다면, 중요한 메시지가 덜 중요한 메시지에 밀려 지연될 수 있다. 중요성에 대한 생각은 페이지 레이아웃 중에도 진전된다. 그러므로 파이프라이닝은 대부분의 경우 미미한 수준의 향상만을 가져다 준다.- 파이프라이닝은 HOL 문제에 영향을 받는다.
❗ HOL (head-of-line) blocking issue
하나의 (느린) 오브젝트가 다른/따라오는 오브젝트의 진행을 방해해서 웹 성능이 저하되는 문제
- HTTP HOL Blocking (Application Layer)
|------------a.png------------| |-b.png-| |---c.png---|
- TCP HOL Blocking (Transport Layer)
|----packet1----|xxx lost xxx|----packet1----| |-packet2-| |--packet3--|
💡 Domain Sharding
여러 개의 병렬 TCP 연결을 동시에 생성해, 여러 subdomain을 이용하여 여러 리소스를 한 번에 다운로드하는 기술이다.
HTTP/1.1에서 domain sharding을 이용하여 HOLB를 해결해왔으나, 도메인의 주소를 찾기 위해 DNS Lookup 과정에서 시간을 잡아먹을수도 있으며, 브라우저별로 Domain당 Connection 개수의 제한(Chrome은 max 6개)이 존재하여 근본적인 해결책은 아니었다.
⭐️ HTTP/2 주요 목표: 하나의 TCP 연결상에서 멀티플렉싱 요청/응답 지연 시간을 줄이는 데 있다.
Frame: HTTP/2에서 최소 통신 단위이며, Header 혹은 Data 둘 중 하나다.
Message: HTTP/1.1과 마찬가지로 요청 혹은 응답의 단위이며, 다수의 Frame으로 이루어져있다.
Stream: 클라이언트와 서버 사이에 설정된 연결을 통해 양방향으로 주고받는 하나 이상의 메시지다.
❗ issues
- TCP HOC(Head of line) blocking
- no security over vanilla TCP connection
QUIC(Quick UDP Internet Connections, 빠른 인터넷 연결)
QUIC은 UDP 프로토콜 위에 구현한 트랜스포트 계층 프로토콜이다.
HTTP over TCP + TLS
QUIC 주요 기능
❗ Limitations
- QUIC은 패킷별로 암호화하기 때문에 패킷을 묶어서 암호화하는 TLS-TCP보다 리소스 소모가 더 클 수 있다.
- CPU 사용량이 많다.
- UDP를 사용하기 때문에 UDP Flood DDoS 공격에 취약하다.