-
[HTTP2 In Action] 4.2. HTTP/2 프로토콜 기초 - 프레임의 구조책/HTTP2 In Action 2025. 3. 31. 10:51
프레임
프레임은 HTTP/2 에서 다중화된 단일 연결의 스트림에서 전송되는 데이터 단위이다.
프레임은 고정 길이 헤더와 페이로드로 이루어져 있는데
헤더에는 프레임의 길이, 타입, 플래그, 리저브드 비트(현재는 사용되지 않음 반드시 0으로 해야함!! ),
식별자로 이루어져 있다.
Type 필드는 현재 14개가 정의되어 있다고 한다.
DATA, HEADERS, PRIORITY, RST_STREAM, SETTINGS,PUSH_PROMISE, PING, GOAWAY, WINDOW_UPDATE,
CONTINUATION, ALTSVC, ORIGIN, CACHE_DIGEST, (0xb)
Length 필드는 프레임의 길이를 말한다.
Stream Identifier 는 프레임을 식별하는 부호 없는 31비트 정수다.
31비트 정수인 이유는 자바와의 상호 운용성때문인데
자바에 32비트 부호 없는 정수가 없기 떄문이다.
이 프레임 유형은 더 생길 수 있다.
HTTP/2 프레임 유형을 살펴보기
nghttp -v https://www.naver.com
nghttp 를 사용해서 http2 프레임이 어떻게 요청하고 응답받는지 살펴보려고 한다.
1. HTTPS 를 통한 HTTP/2 로 연결하고 협상한다.
nghttp 는 HTTPS 설정이나 HTTP/2 프레퍼스/매직 메시지를 출력하지 않아 다음은 SETTINGS 프레임을 최초로 받는다
2. SETTINGS
이 SETTINGS 에는 16비트의 Id 와 32비트의 Value 를 가지고 있다.
SETTINGS_MAX_CONCURRENT_STREAMS(0x03) 가 id 고
100 이 value 인 식이다.
SETTINGS 프레임의 주요 특징:
클라이언트와 서버 모두 연결 설정을 통신하는 데 사용한다.
연결이 시작될 때 양쪽에서 보내며, 언제든지 설정을 변경하기 위해 추가로 보낼 수 있다.
SETTINGS 프레임은 반드시 확인(acknowledgment)되어야 함
SETTINGS 프레임에서 정의되는 주요 매개변수:
SETTINGS_HEADER_TABLE_SIZE (0x1): 헤더 압축에 사용되는 테이블 크기
SETTINGS_ENABLE_PUSH (0x2): 서버 푸시 기능 활성화 여부
SETTINGS_MAX_CONCURRENT_STREAMS (0x3): 동시에 열 수 있는 스트림의 최대 수
SETTINGS_INITIAL_WINDOW_SIZE (0x4): 스트림 레벨의 흐름 제어 초기 창 크기
SETTINGS_MAX_FRAME_SIZE (0x5): 보낼 수 있는 프레임의 최대 크기
SETTINGS_MAX_HEADER_LIST_SIZE (0x6): 헤더 목록의 최대 크기이에 대한 응답은 이렇다.
3. PRIORITY
PRIORITY 프레임의 주요 특징:
클라이언트가 서버에게 특정 스트림의 처리 우선순위를 알려주는 데 사용된다.
스트림 간의 종속성(dependency)과 가중치(weight)를 설정할 수 있다.
언제든지 보낼 수 있으며, 스트림의 우선순위는 동적으로 변경될 수 있다.
흐름 제어(flow control)의 영향을 받지 않는다.PRIORITY 프레임은 고정 길이며 어떤 플래그도 정의하지 않는다.
4. HEADERS
최종적으로 이 모든 설정 이후 프로토콜의 본론으로 넘어가 HTTP/2 요청을 만들 수 있게 된다.
HTTP 요청과 응답의 헤더 정보를 전송하는 데 사용되고
새로운 스트림을 시작하는 데 사용된다.
HEADERS 프레임의 주요 특징:
패딩(선택적): 보안 목적으로 프레임 크기를 가릴 수 있다.
우선순위 정보(선택적): 스트림의 종속성과 가중치 정보를 포함할 수 있다.
헤더 블록 조각: HPACK으로 압축된 HTTP 헤더 정보
플래그:
END_STREAM (0x1): 이 스트림에서 더 이상 데이터를 보내지 않음을 나타낸다.
END_HEADERS (0x4): 모든 헤더 정보가 이 프레임에 포함되어 있음을 나타낸다.
PADDED (0x8): 패딩이 사용되었음을 나타낸다.
PRIORITY (0x20): 우선순위 정보가 포함되어 있음을 나타낸다.
헤더 압축:
HTTP/2는 HPACK 압축 알고리즘을 사용하여 헤더를 압축한다.이는 다음에 더 나온다!
헤더 분할:
헤더가 큰 경우, 여러 HEADERS 프레임과 CONTINUATION 프레임으로 분할될 수 있다.
마지막 프레임에는 END_HEADERS 플래그가 설정된다.
중요한 특징:
HTTP/1.1과 달리 HTTP/2에서는 헤더 필드 이름이 소문자로 전송된다.
HTTP/2는 의사 헤더 필드(:method, :path, :scheme, :authority 등)를 사용하여 요청과 응답 정보를 전달한다.
HEADERS 프레임은 스트림의 상태를 변경할 수 있습니다(idle → open 또는 half-closed).
우선순위 정보를 포함할 때는 서버가 리소스를 효율적으로 할당하는 데 도움이 된다.
HEADERS 프레임은 HTTP/2에서 HTTP 메시지의 시작을 표시하며, HTTP/1.1의 시작 줄과 헤더 섹션을 대체하는 것이다.응답은 이렇게 요청 id 13 으로 온 것을 볼 수 있다.
5. DATA
HTTP/1 에서의 메시지 본문은 HTTP 헤더 다음에 이어지는 두 개의 줄 바꿈 다음에 오는 응답으로 전송됐다.
HTTP/2 에서 데이터는 별도의 메시지 유형이다!
DATA 도 HEADERS 와 같이 패딩의 사용을 허용해서 처음에 길이를 명시하고자 Pad Length 필드를 둘 수 있는데
내가 요청보낸 naver.com 에서는 보이진 않는다.
근데 패딩이 어떻게 보안적으로 도움이 되는걸까?
각 프레임은 헤더와 페이로드로 구성되는데, 패딩은 페이로드 부분에 추가적인 의미 없는 바이트를 삽입하는 것이다.
0을 집어넣어서 길이 기반의 정보가 유출되는 것을 막는 것이다.
이렇게 통신은 마무리 되었다.
여기서 나온 프레임 외에도 다른 프레임 종류들이 있는데
그 중에서 GOAWAY 프레임만 살펴보겠다.
nghttp -v https://naver.com
www 를 빼고 보내면 301 응답을 받게 되는데 이때 GOAWAY 프레임을 볼 수 있다.
6. GOAWAY 프레임
더 이상 보낼 메시지가 없거나 심각한 오류가 발생한 경우 연결을 종료하는 데 사용된다.
GOAWAY 프레임은 어떤 플래그도 지정하지 않는다.
요약
- HTTP2 를 사용하기 위해 클라이언트와 서버는 어떠한 HTTP 메시지를 전송하기 전에 HTTP/2 를 사용하기로 합의해야 한다.
- HTTP/2 에서 요청 및 응답은 HTTP/2 프레임으로 발신되고 수신된다.
- 예를 들어 HTTP/2 GET 요청은 보통 HEADERS 프레임으로 전송되며, 응답은 보통 HEADERS 프레임과 그 다음에 따라오는 DATA 프레임으로 수신된다.
- 대부분의 웹 개발자와 웹 서버 관리자는 HTTP/2 프레임에 신경을 쓸 필요가 없지만 프레임을 볼 수 있는 도구는 있다.
완전 바이너리 형태로는 못봤지만 그래도 프레임 단위로 어떤 데이터가 오가는지 보니 더 잘 와닿는 것같다!
'책 > HTTP2 In Action' 카테고리의 다른 글
[HTTP2 In Action] 5. 서버 푸시의 구현 (0) 2025.04.08 [HTTP2 In Action] 4.1. HTTP/2 프로토콜 기초 - 왜 HTTP/1.2 가 아니고 HTTP/2 일까? (0) 2025.03.13 [HTTP2 In Action] 3. HTTP2로 업그레이드 여정 (0) 2025.03.10 [HTTP2 In Action] 2. HTTP1.1 의 근복적인 성능 이슈와 우회 방법 (1) 2025.03.07 [HTTP2 In Action] 1. http의 역사와 https (0) 2025.02.16