Search
🔵

bc9.3_1.1_1. title: HTTP2에서는 최적화를 위해 단순 문자열이 아닌 데이터의 틀을 만들었다. 이를 바이너리를 사용한다고 한다.

메세지가 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 : 생각에 참고한 자료입니다.