HPACK talk at RFCs We Love

This commit is contained in:
Nemo 2020-07-24 22:21:25 +05:30
parent 1377244a81
commit 3c3ed1c654
2 changed files with 411 additions and 0 deletions

203
hpack/index.html Normal file

File diff suppressed because one or more lines are too long

208
hpack/index.md Normal file
View File

@ -0,0 +1,208 @@
# HPACK (RFC 7541)
\- Header Compression for HTTP/2
---
# http/1.1
## Request
```
GET /path HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip, deflate,br
```
---
# http/1.1
## Response
```
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 438
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
```
---
# PROS
- Easy to support, works both ways
---
# CONS
- Different algorithms have different implementations
- Does not support header compression
- Multiple security issues, via chosen-plaintext attacks.
---
Unrelated: There's also TLS compression (don't use it)
---
# hpack
---
# core ideas
1. most web requests will have fairly similar headers.
2. should be fast.
3. reduce complexity or implementation issues.
4. ignore encoding, focus on a correct decoding.
5. "streaming"
---
# important-to-note
1. Headers can be repeated
2. Headers are an Ordered List
---
# Static Table
Generated by frequency of header fields on popular websites.
```
+-------+-----------------------------+---------------+
| Index | Header Name | Header Value |
+-------+-----------------------------+---------------+
| 1 | :authority | |
| 2 | :method | GET |
| 3 | :method | POST |
| 4 | :path | / |
| 5 | :path | /index.html |
| 6 | :scheme | http |
| 7 | :scheme | https |
| 8 | :status | 200 |
| 9 | :status | 204 |
| 10 | :status | 206 |
| 11 | :status | 304 |
```
---
# Index Address Space
```
<---------- Index Address Space ---------->
<-- Static Table --> <-- Dynamic Table -->
+---+-----------+---+ +---+-----------+---+
| 1 | ... | s | |s+1| ... |s+k|
+---+-----------+---+ +---+-----------+---+
^ |
| V
Insertion Point Dropping Point
```
# Representation
A header field(=`name+value`) can be represented as:
## an index
is a reference to either:
- the static table
- the dynamic table
---
## or a literal (1)
the header field name can be represented
- literally
- a reference to either tables
---
# or a literal (2)
the header value is represented literally and
1. **ADD** it to the dynamic table
2. **DON'T ADD** it to the dynamic table
3. **NEVER ADD** it to the dynamic table
---
# a literal
can be presented in two forms:
1. directly
2. using a Huffman code
---
# decisions while parsing
- do a table lookup
- static table
- dynamic table
- read it literally
- directly
- using the huffman code
Almost is encoded as a integer or as a string
---
# literal representation
```
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| H | String Length (7+) |
+---+---------------------------+
| String Data (Length octets) |
+-------------------------------+
```
H=1 -> Huffman Encoded
H=0 -> Encoded as a "string"
# index representation
This is simple table lookup
```
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 | Index (7+) |
+---+---------------------------+
```
---
# Static Huffman Code
```
code
code as bits as hex len
sym aligned to MSB aligned in
to LSB bits
( 0) |11111111|11000 1ff8 [13]
( 1) |11111111|11111111|1011000 7fffd8 [23]
( 2) |11111111|11111111|11111110|0010 fffffe2 [28]
( 3) |11111111|11111111|11111110|0011 fffffe3 [28]
```
---
# dynamic table updates
- You can add entries to the table
- You can set the table size dynamically
>This mechanism can be used to completely clear entries from the
dynamic table by setting a maximum size of 0, which can subsequently
be restored.