메세지가 1.1에서는 모든 정보가 문자열로 전송되어 헤더나 \r\n같은 것을 파싱해주어야 했으나, 2.0에서는 정해진 위치에 정해진 길이의 데이터가 들어가도록 만들고, 헤더 테이블을 만드는 등 단순 문자열의 단순성을 포기한다. 이를 바이너리화된 데이터라고 한다. 문자열 파싱 속도보다 구조화된 데이터 포맷을 처리하는 것이 빠르기 때문이다. 문자열 처리 코드와 바이너리 처리 코드를 비교해 보자.
// HTTP/1.1 헤더 파싱
let buffer = "";
let headers = {};
for (let i = 0; i < data.length; i++) {
let char = data[i];
if (char === '\r' && data[i+1] === '\n') {
// 한 줄 완성됨
if (buffer === "") break; // 헤더 끝
let [key, value] = buffer.split(':');
headers[key.trim()] = value.trim();
buffer = "";
i++; // \n 건너뛰기
} else {
buffer += char;
}
}
JavaScript
복사
단순 문자열
// HTTP/2 프레임 파싱
let offset = 0;
// 프레임 헤더 (9바이트 고정)
let length = (data[0] << 16) | (data[1] << 8) | data[2];
let type = data[3]; // 헤더 프레임
let flags = data[4];
let streamId = (data[5] << 24) | (data[6] << 16) | (data[7] << 8) | data[8];
// HEADERS 프레임의 페이로드 = HPACK으로 압축된 헤더들
let headerPayload = data.slice(9, 9 + length);
JavaScript
복사
바이너리 - 헤더 프레임
// DATA 프레임 파싱
let length = (data[0] << 16) | (data[1] << 8) | data[2]; // 페이로드 길이
let type = data[3]; // 데이터 프레임
let flags = data[4]; // END_STREAM 등
let streamId = /* 4바이트 */;
// DATA 프레임의 페이로드 = 실제 바디 데이터 (압축 없음!)
let bodyData = data.slice(9, 9 + length);
JavaScript
복사
바이너리 - 데이터 프레임
틀을 미리 정해두기 때문에 개행을 찾아내거나 할 필요가 없어 파싱 속도가 빨라질 수 있다.
여기서 프레임이라는 단위가 생소하게 느껴질 수 있다. 간략히 설명하면 HTTP 2.0에서는 HTTP 요청/응답을 여러개의 Frame들로 나누고, 이 Frame들이 모여 요청/응답 Message가 되고, 그리고 Message는 특정 Stream에 속하게 되고(하나의 스트림 = 요청 메시지 + 응답 메시지. 양방향 대화의 채널이라고 볼 수 있음), 여러개의 Stream은 하나의 Connection에 속하게 되는 구조이다(ref1).
연결 1개 안에서 여러 대화가 동시에!
스트림 1: GET /page.html 요청/응답
스트림 3: GET /style.css 요청/응답
스트림 5: GET /script.js 요청/응답
Plain Text
복사
송신측은 헤더 페이로드와 데이터 페이로드를 모두 Frame 단위로 쪼개어 병렬적으로 전송한다.
[프레임: 스트림1 요청] [프레임: 스트림3 요청] [프레임: 스트림1 응답] [프레임: 스트림3 응답]
Plain Text
복사
수신 측에서 스트림 아이디를 기반으로 메시지를 구성하는 프레임들을 조립한다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
•
“HTTP2.0에서는 주고받는 데이터가 문자열이 아닌 바이너리다”는 말을 이해하려면 기존 버전의 HTTP를 통해 주고받는 데이터가 어떤 형식이었는지를 알고 있어야 한다. 바이너리는 쉽게 말해 그냥 틀이다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.