Search
🔵

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

생성
prev summary
🚀 prev note
next summary
🚀 next note
♻️ next note
관련 임시노트
9 more properties
메세지가 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 : 생각에 참고한 자료입니다.