Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gRPC over HTTP2 #13

Open
iamminji opened this issue Nov 16, 2022 · 0 comments
Open

gRPC over HTTP2 #13

iamminji opened this issue Nov 16, 2022 · 0 comments

Comments

@iamminji
Copy link
Owner

iamminji commented Nov 16, 2022

들어가기에 앞서 용어 정리

chunked encoding

content-length 가 없는 경우 커넥션이 끊길 때 까지 읽게 되는데 이를 방지하기 위해 Transfer-Encoding: chunked 를 넣어 사용한다. (응답의 크기를 알 필요가 없다.)

이걸 사용하면 body 가 그대로 나오지 않고 청크의 사이즈가 먼저 오고 각 청크를 보낸다. 그리고 마지막에는 0\r\n 을 보내게 되는데 이 값을 보고 끝났다는 걸 알 수 있게 되는 것이다.

trailer

chunked encoding 을 사용하게 되면 chunk 단위로 데이터를 보내게 된다. 이 말인 즉슨 보내고자 하는 데이터를 다 알 수가 없다는 것이다. 하지만 HTTP 에는 header 에 check sum 을 보내서 무결성 검사를 하고 있다. (check sum 은 content 를 다 알고 있어야만 계산할 수 있다.)

이 문제를 해결하기 위해서 사용하는 것이 바로 trailer 이다.

이 값은 chunked encoding의 마지막(0\r\n) 의 다음에 헤더와 동일한 문법을 갖게 되는 값을 추가한다. 클라이언트는 body를 다 읽고 마지막의 이 trailer (check sum) 값을 보고 비교한다.

예시

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Trailer: Expires

7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n
\r\n

HTTP2 Overview

  • HTTP1 과 다르게 하나의 커넥션을 활용해 여러개의 request 를 보낼 수 있다. 이걸 구현하기 위해서 framing 이라는 기술을 사용한다.

HTTP1 에서는 content-length 가 없는 경우 커넥션이 끊길 때 까지 읽는 것을 방지하기 위해 chunked-encoding 이라는 개념을 사용하고 있다.

  • HTTP2 는 spec 상으로 header, data 그리고 trailer 를 사용한다. (trailer 때문에 chunked-encoding 을 항상 사용하는 것 처럼 되었다.)

HTTP2는 TCP/IP 를 사용하고 있기 때문에 (stream 기반) 받는 쪽에서 packet drop이 있으면 retransmission 을 할 때까지 기다려야 한다. HTTP3는 UDP 기반이라 datagram 기반이라 packet drop 이 있어도 기다리지 않고 전송 성공한 패킷을 받을 수 있다.

gRPC

브라우저에서의 trailer 처리 때문에 gPRC web 프로토콜도 등장하였다. gRPC web에서는 body 의 마지막에 trailer가 들어가게 되어서, 웹이냐 아니냐에 따라서 trailer 위치가 다르다.
gRPC는 HTTP/2를 이용해 메시지를 보내기 때문에 고성능이라고 표현한다.

Request 특징

  • Request-Headers, *Length-Prefixed-Message, EOS (End Of Stream) 순 으로 메시지를 보낸다.
  • Content-Type 에는 반드시 application/grpc 로 시작해야 한다(뒤에는 +proto 같은게 붙을 수 있음). 다른 타입을 사용하게 될 경우 415 http status code 를 받게 된다.

Response 특징

  • (Response-Headers *Length-Prefixed-Message Trailers) 또는 Trailers-Only

일반적으로는 (Length-Prefixed-Message 가 없을 경우) Header와 Trailer 로만 구성되겠지만 특이사항일 경우(오류가 발생했을 땐) Trailer 만 올 수도 있다.

참고

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant