# HTTP/2

## What makes gRPC Efficient

gRPC menggunakan HTTP/2 sebagai Transfer Protocol, maka dari itu gRPC mewarisi berbagai fitur dari HTTP/2

* Binary framing
  * more performant and robust ( lebih cepat dan konsisten )
  * Lighter to transport, safer to decode ( ringan dan aman )
  * Great combination with Protocol Buffer
* Header compression dengan HPACK
  * Mengurangi overhead dan meningkatkan performa
* Multiplexing
  * Mengirim multiple request dan response secara pararel dalam satu TCP connection
  * Mengurangi latency dan memperkuat network utilization
* Server push
  * One client request, multiple responses
  * Mengurangi round-trip latency

Demo: <http://www.http2demo.io/>

![grpc Stack](https://4184784299-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdF90Xe9F63MiAMEQ6k%2F-MdGMDH2BiBa0OkBJoFj%2F-MdGM_ZsHkAyz7F0qi2q%2Fdownload%20\(1\).jpeg?alt=media\&token=05ba238e-874c-4756-9322-579f6a68c8bf)

## How HTTP/2 Works under the Hood

* Satu TCP connection membawa multiple bidirectional streams
* Setiap streams mempunyai unique ID dan membawa multiple bidirectinal messages
* Setiap message ( request / response ) dibagi ke beberapa binary frames
* Frame adalah unit terkecil yang membawa data : HEADERS, SETTINGS, PRIORITY, DATA, etc.

![](https://4184784299-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdF90Xe9F63MiAMEQ6k%2F-MdGPPUDg0aSNIvdoPwP%2F-MdGPYG2cGVB1YCCLo1k%2FScreenshot%20from%202021-06-28%2013-58-41.png?alt=media\&token=8ac2ac16-c6d0-4ff0-977a-374d7c7391ac)

* Frames dari stream yang berbeda akan di interleaved dan di reassemble di sisi lain

![](https://4184784299-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdF90Xe9F63MiAMEQ6k%2F-MdGPPUDg0aSNIvdoPwP%2F-MdGPeybJPiRkYYOBbVM%2FScreenshot%20from%202021-06-28%2013-59-33.png?alt=media\&token=cf61a02c-4c00-41dd-b73f-e2a6424592be)

## HTTP/2 vs HTTP/1.1

* Pertama, HTTP/2 adalah binary protocol, sedangkan HTTP/1.1 adalah text protocol.
* Headers di compress di HTTP/2, sedangkan berupa plain text di HTTP/1.1
* HTTP/2 mengizinkan multiplexing, HTTP/1.1 tidak
* Kita dapat mengirim multiple requests and responses dalam satu connection di HTTP/2, sedangkan di HTTP/1.1 kita hanya dapat mengirim satu, yang mana kita harus membuat multiple TCP connections untuk mengirim multiple requests.
* Server-push is possible with HTTP/2, but tidak di HTTP/1.1
* HTTP/2 diluncurkan pada 2015, sedangkan HTTP/1.1 diluncurkan pada 1997.

![](https://4184784299-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MdF90Xe9F63MiAMEQ6k%2F-MdGPryKSzAGpl3PXj01%2F-MdGQ9LQtjGvJ4MGorkO%2FScreenshot%20from%202021-06-28%2014-01-34.png?alt=media\&token=9c421a61-23a8-44dc-a7d9-5c7a5ac210bb)
