diff --git "a/gRPC/HTTP2\354\231\200_gRPC.md" "b/gRPC/HTTP2\354\231\200_gRPC.md" new file mode 100644 index 0000000..bb070b7 --- /dev/null +++ "b/gRPC/HTTP2\354\231\200_gRPC.md" @@ -0,0 +1,55 @@ +## HTTP2 프로토콜 + +HTTP/2(하이퍼텍스트 전송 프로토콜 버전 2)는 기존의 HTTP/1.x 프로토콜의 단점을 보완하고 웹 성능을 향상시키기 위해 개발된 프로토콜입니다. +HTTP/2는 효율적인 웹 전송을 목표로 여러 가지 새로운 기능과 개선 사항을 도입했습니다. + +1. **멀티플렉싱(Multiplexing):** +HTTP/2는 하나의 연결에서 여러 요청과 응답을 동시에 처리할 수 있습니다. 이는 HTTP/1.x에서의 `단일 연결당 단일 요청/응답` 모델과는 큰 차이를 보이며, 여러 요청을 동시에 보내고 받을 수 있어 성능이 크게 향상됩니다. + +2. **헤더 압축(Header Compression):** +HTTP/2는 요청과 응답 헤더를 효율적으로 압축합니다. HPACK이라는 압축 방식을 사용하여 헤더 크기를 줄이고, 이를 통해 대역폭 사용을 최적화하고 전송 속도를 높입니다. + +3. **서버 푸시(Server Push):** +서버는 클라이언트가 요청하지 않은 리소스도 미리 전송할 수 있습니다. 예를 들어, 클라이언트가 HTML 파일을 요청하면 서버는 CSS나 JavaScript 파일도 함께 전송하여 페이지 로딩 속도를 높일 수 있습니다. + +4. **스트림 우선순위(Stream Prioritization):** +클라이언트는 여러 스트림에 우선순위를 부여할 수 있습니다. 이를 통해 중요한 리소스가 먼저 전송되고, 덜 중요한 리소스는 나중에 전송되어 웹 페이지 로딩이 최적화됩니다. + +5. **연결 지속성 및 보안:** +HTTP/2는 기본적으로 TLS(전송 계층 보안)를 사용하여 데이터의 기밀성과 무결성을 보장합니다. 또한, HTTP/2는 하나의 지속적인 연결에서 모든 요청과 응답을 처리할 수 있어 연결 설정 오버헤드가 감소합니다. + +## 스트림과 프레임 + +HTTP/2는 데이터를 효율적으로 전송하기 위해 **스트림(Stream)**과 **프레임(Frame)**이라는 개념을 도입했습니다. +이들은 HTTP/2의 핵심 구성 요소로, 데이터를 전송하고 관리하는 방식에 중요한 역할을 합니다. + +### 1. 스트림(Stream) + +**스트림**은 HTTP/2 연결 내에서 교환되는 독립적인 논리적 데이터 흐름입니다. 하나의 HTTP/2 연결에는 여러 개의 스트림이 존재할 수 있으며, 각 스트림은 클라이언트와 서버 간의 요청과 응답을 처리하는데 사용됩니다. + +- **양방향 통신:** 스트림은 양방향 통신을 지원합니다. 즉, 스트림은 클라이언트에서 서버로, 서버에서 클라이언트로 데이터를 전송할 수 있습니다. +- **고유한 ID:** 각 스트림은 고유한 스트림 ID를 가지고 있으며, 이 ID를 통해 스트림을 식별하고 관리합니다. +- **우선순위:** 스트림은 우선순위(Priority)를 가질 수 있습니다. 클라이언트는 여러 스트림의 우선순위를 설정하여 중요한 데이터가 먼저 전송되도록 할 수 있습니다. +- **병렬 처리:** HTTP/2에서는 여러 스트림을 병렬로 처리할 수 있습니다. 이는 HTTP/1.x의 순차적 요청/응답 처리 모델과는 달리, 동시에 여러 요청을 처리할 수 있게 하여 성능을 향상시킵니다. + +### 2. 프레임(Frame) + +**프레임**은 HTTP/2에서 가장 작은 전송 단위입니다. 모든 HTTP/2 통신은 프레임으로 나뉘어져 전송되며, 스트림은 이러한 프레임들의 집합으로 이루어집니다. HTTP/2에서 데이터는 반드시 프레임 단위로 분할되어 전송됩니다. + +- **프레임 유형:** HTTP/2에는 다양한 유형의 프레임이 존재하며, 각 프레임은 특정한 목적을 가집니다. 예를 들어: + - **HEADERS 프레임:** HTTP 요청이나 응답의 헤더 정보를 포함합니다. + - **DATA 프레임:** 실제 데이터(payload)를 포함합니다. + - **PRIORITY 프레임:** 스트림의 우선순위를 지정합니다. + - **RST_STREAM 프레임:** 스트림을 강제로 종료할 때 사용됩니다. + - **SETTINGS 프레임:** 연결 설정을 지정합니다. + - **WINDOW_UPDATE 프레임:** 흐름 제어를 위해 사용되며, 데이터 전송 가능 크기를 관리합니다. + +- **프레임 헤더:** 각 프레임에는 고유의 프레임 헤더가 있습니다. 이 헤더에는 프레임의 길이, 타입, 스트림 ID, 플래그 등이 포함되어 있으며, 프레임의 전달과 처리를 관리합니다. +- **프레임 재조립:** 클라이언트와 서버는 전송된 프레임들을 조립하여 완전한 요청이나 응답 메시지를 복원합니다. + +### 스트림과 프레임의 관계 + +- 하나의 스트림은 여러 개의 프레임으로 구성될 수 있습니다. 예를 들어, 하나의 스트림에서 HEADERS 프레임으로 요청 헤더가 전송되고, 이어서 여러 개의 DATA 프레임으로 실제 데이터가 전송될 수 있습니다. +- HTTP/2에서 여러 스트림은 동일한 연결을 공유하며, 각 스트림의 프레임은 혼재되어 전송될 수 있습니다. 이를 통해 네트워크 효율성이 향상됩니다. + +요약하자면, **스트림**은 HTTP/2 연결 내에서 독립적인 데이터 흐름을 나타내고, **프레임**은 이 스트림을 구성하는 최소 단위의 데이터 블록입니다. 이 두 구성 요소는 HTTP/2의 효율적인 데이터 전송과 병렬 처리를 가능하게 하는 핵심 요소입니다. \ No newline at end of file