Front-End/Front-End 자료실

HTTP/2 프레임 정리

Chipmunks 2018. 7. 22.
728x90

1. 프레임 헤더

모든 프레임은 동일한 9 bytes(옥텟)의 헤더로 시작.
 

 

 
* HTTP/2 프레임 유형
 

 

2. DATA

DATA 프레임은 가변 길이의 옥텟으로 구성됨.
최대 프레임 길이 설정값으로 전송되는 개체 데이터가 하나 이상의 프레임으로 나눌 수 있음.
Pad Length 필드와 Padding 필드는 보안 상 필요에 따라 메시지의 크기를 숨기기 위해 사용.

 

 

* DATA 프레임 플래그

 

 

3. HEADERS

HEADERS 프레임은 스트림을 시작해 엔드포인트에 메시지 헤더를 전송하는 데 사용
 

 

* HEADERS 프레임 플래그

 

 

4. PRIORITY

PRIORITY 프레임은 스트림의 우선순위를 지정하기 위해 전송된다. 여러 번 전송될 수 있고, 이 경우 이전에 설정된 우선순위를 변경한다.

 

 

5. RST_STREAM

RST_STREAM은 클라이언트이나 서버에서 스트림을 즉시 종료하기 위해 사용된다. 이 프레임은 보통 오류 상태에 대한 응답이다. Error Code는 4 bytes 으로 구성된다. 오류 내역은 다음 문서에 있다. ( RFC 7540, Section 7 )

 

6. SETTINGS

SETTINGS 프레임은 일련의 키값 쌍으로 구성된다. 쌍의 개수는 프레임 길이를 개별 설정 길이(6)로 나눈 값이다. Identifier 2 bytes, Value 4 bytes, ...
 

 

 

엔드포인트가 SETTINGS 프레임을 수신하여 처리할 때, 이후 프레임 헤더에 ACK 플래그 (0x1) 을 설정한 SETTING 프레임으로 응답해야 한다. 송신자는 엔드포인트가 새로운 SETTINGS 프레임을 수신하고 그 정보에 따라 동작하고 있음을 알 수 있다.

 

7. PUSH_PROMISE

PUSH_PROMISE 프레임은 서버가 클라이언트에게, 클라이언트가 요청하지 않은 개체를 전송하려 한다는 것을알리기 위해 전송된다.  이 프레임은 클라이언트가 전송하는 HEADERS 프레임에 대응하는 서버측 프레임이다.

 

 

* PUSH_PROMISE 프레임 플래그

 

 

8. PING

PING 프레임은 엔드포인트 간 왕복 시간을 측정하는 데 사용한다. PING 프레임은 ACK 플래그 (0x1) 하나만 있다. 엔드포인트는 ACK가 설정되지 않은 PING 프레임을 수신하면 ACK 플래그를 설정하고 동일한 Opaque Data를 포함한 PING 프레임을 전송한다.
 
PING 프레임은 연결 수준의 프레임이므로 다른 어떤 프레임과도 연관이 없다. 따라서 스트림 식별자는 반드시 0x0 이어야 한다.
 

9. GOAWAY

GOAWAY 프레임은 연결을 정상 종료하기 위해 사용한다. 이 프레임 또한 연결 수준의 프레임이다. 따라서 스트림 식별자는 반드시 0x0 이어야 한다.

 

 
GOAWAY 프레임을 전송하면, 엔드포인트는 프레임의 수신 여부와 GOAWAY 프레임을 전송하는 이유를 수신자에게 알릴 수 있다.
 
문제가 발생한 경우, 오류 코드를 설정한다. (오류 코드는 위 RST_STREAM 내용 참조)
그리고 Last Stream ID에는 처리가 완료된 가장 높은 스트림 ID가 설정된다.
 
오류 없이 연결을 해제하려는 경우, Last Stream ID를 2^31 - 1  로 설정하여  NO_ERROR (0x0) 코드를 전송한다.
 

 

10. WINDOW_UPDATE

WINDOW_UPDATE 프레임은 스트림 흐름 제어에 사용한다. 송신자가 수신할 수 있는 바이트 수를 상대측에게 알려준다. 흐름 제어는 개별 스트림 또는 연결 상의 모든 스트림 (스트림 ID 0x0) 에 적용할 수 있다. 특정 스트림에 대한 WINDOW_UPDATE는 연결 수준의 흐름 제어에도 적용된다.
 

 

11. CONTINUATION

CONTINUATION 프레임은 HEADERS, PUSH_PROMISE, CONTINUATION 프레임의 추가 헤더로 구성된다.
 

 

* CONTINUATION 프레임 플래그

 

 


 

출처 : 러닝 HTTP/2

댓글