You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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) 값을 보고 비교한다.
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 만 올 수도 있다.
들어가기에 앞서 용어 정리
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) 값을 보고 비교한다.
예시
HTTP2 Overview
gRPC
Request 특징
application/grpc
로 시작해야 한다(뒤에는 +proto 같은게 붙을 수 있음). 다른 타입을 사용하게 될 경우 415 http status code 를 받게 된다.Response 특징
참고
The text was updated successfully, but these errors were encountered: