4.3.25 · D2 · HinglishComputer Networks

Visual walkthroughHTTP - 2 — multiplexing, header compression (HPACK), server push

2,584 words12 min read↑ Read in English

4.3.25 · D2 · Coding › Computer Networks › HTTP - 2 — multiplexing, header compression (HPACK), server


Step 1 — Byte actually kya hota hai, aur 8 slots kyun

KYA HAI. Ek byte 8 bits ki ek row hoti hai. Bit ek single slot hota hai jo ya rakhta hai. Yahi sabse chhoti cheez hai jo wire carry karta hai — HTTP/2 mein sab kuch, har frame, har header, aakhirkar inhi 8-slot bytes ki rows hain.

YAH SE KYUN SHURU KAREIN. HPACK ki poori chalaaki yahi hai ki ek hi byte se do kaam liye jaate hain: 8 slots mein se kuch slots kehte hain yeh cheez kaunsi tarah ki hai (ek flag), aur baaki carry karte hain ek number. "5-bit prefix" tab tak samajh nahi aayega jab tak tum 8 slots nahi dekh sakte aur indicate nahi kar sakte ki kaunse slots flags hain.

PICTURE. Neeche, ek byte ke 8 slots. Har slot ki ek "place value" hoti hai — sabse baayi slot ki value hai, phir . set hone wala slot apni place value add karta hai; set hone wala slot kuch nahi add karta. Byte padhne ke liye, tum un slots ki place values ko jodho jo hain.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 2 — Ek byte ko "flag bits" + "number bits" mein split karna

KYA HAI. HPACK number ke liye saare 8 slots use nahi karta. Yeh upar ke kuch slots flags ke liye reserve karta hai (ek code jo kehta hai is header ko kaise interpret karein), aur neeche ke slots number ke liye chhodta hai. Yeh neeche wala region ==-bit prefix== hai.

KYUN. Har header field ko pehle apna representation type announce karna hota hai: "Main ek fully indexed header hoon" (top slot mein ), ya "Main ek literal hoon jo yaad rakhna chahiye" (top do slots mein ), wagera. Yeh type-bits 8 slots mein se kuch kha jaate hain. Jo bacha wahi actual index number ke liye jagah hai. Alag alag types mein alag number of slots bachi rehti hain — exactly iseelie spec baar baar "-bit prefix" kehta rehta hai instead of ek fixed number: depend karta hai ki us representation ne kitne flag bits use kiye.

PICTURE. Wahi byte, ab do rangon mein paint ki gayi: baaye taraf burnt-orange flag slots, daaye taraf teal number slots. "Indexed" case mein ( flag) prefix slots ka hai. "Literal with incremental indexing" mein ( flag) prefix slots ka hai. Plain literal-name reference ke liye yeh hai.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 3 — Easy case: number prefix mein fit ho jaata hai

KYA HAI. Agar humara number itna chhota hai ki slots mein fit ho jaaye, toh hum bas wahan likh dete hain aur kaam khatam. "Chhota enough" ka matlab hai strictly less than .

boundary kyun (na ki )? slots se lekar tak ki values hold kar sakti hain. Lekin HPACK all-ones pattern () ko ek special signal ke roop mein reserve karta hai jiska matlab hai "Main overflow ho gaya — aage padhte raho". Toh jo values fit-and-stop hain woh hain se tak. Jis pal ke barabar hota hai, hum use waise nahi likh sakte; woh pattern "continue" flag hai. Yahi is page ka sabse important rule hai.

PICTURE. Ek 5-bit prefix (, toh ). Hum store kar rahe hain. Kyunki , teal slots ban jaati hain aur orange flag slots upar untouched rehti hain. Total ek byte.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 4 — Continuation bytes ki zaroorat kyun hai

KYA HAI. Agar ho? Prefix use hold nahi kar sakta. Toh hum do kaam karte hain: (1) prefix ko all-ones se bharo — "keep reading" signal — aur (2) remainder ko baad mein aane wale extra bytes mein store karo.

Pehle kyun subtract karein? Kyunki prefix ne pehle se hi all-ones hone ki wajah se utni magnitude "use kar li" hai. Hum use double count nahi karna chahte. Leftover store karna numbers ko jitna ho sake chhota rakhta hai, jo byte-count ko kam rakhta hai. Yeh classic variable-length integer idea hai: chhote numbers pe kam bytes lagte hain, bade numbers pe zyada, aur kisi ka bhi size fixed aur wasteful nahi hota.

PICTURE. Ek number jo 5-bit prefix ke liye bahut bada hai. Prefix solid ho jaata hai (), aur ek arrow byte ke bahar un continuation bytes ki taraf point karta hai jo hum Step 5 mein banane wale hain.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 5 — 7-bit continuation groups (varint engine)

KYA HAI. Hum leftover ko continuation bytes mein encode karte hain. Har aise byte mein, top slot ek flag hai ( = "aur ek byte aata hai", = "yeh aakhri wala hai") aur neeche ke 7 slots number ka ek chunk carry karte hain. Hum ke 7 bits ek baar mein peelte hain.

7 kyun, 8 nahi? Kyunki humne har byte ka 1 slot "more follows?" flag par kharch kar diya. Baaki 7 slots data ke liye hain. Toh har continuation byte ki value carry karta hai, aur (top slot) "keep going" marker ban jaata hai. Loop:

  • — lowest 7 bits (current chunk).
  • — top slot set karna yeh kehne ke liye ki "aur bytes aa rahe hain".
  • — 7 bits daaye shift karo, agla chunk expose karo.
  • Final emit mein hai, toh uska top slot hai → decoder rukta hai.

PICTURE. Remainder ek tall stack ki tarah dikhaya gaya hai, 7-bit chunks mein bottom-up slice kiya gaya. Har slice ek byte ban jaati hai; last ko chhodkar sabke upar burnt-orange "continue" top bit hai; last wale ke upar teal "stop" top bit hai.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 6 — Decoding: wapas padhna

KYA HAI. Decoder sab kuch ulta karta hai. Prefix padho. Agar woh se kam hai, toh wahi number hai, ruk jao. Agar woh ke barabar hai, continuation bytes padhte raho, 7 bits ek baar mein accumulate karte raho, jab tak ek byte ka top slot na ho.

KYUN AMBIGUOUS NAHI HAI. All-ones prefix aur top "continue" bits self-describing hain: har byte par decoder jaanta hai ki aur expect karna hai ya nahi, bina kisi length field ke. Yahi varint ko ek byte stream mein safely daalne layak banata hai.

PICTURE. 31, 154, 10 ka decode wapas mein: prefix kehta hai "overflow, base se shuru karo"; phir apne low 7 bits weight par contribute karta hai; phir (stop) weight par contribute karta hai; sum .

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Step 7 — Edge aur degenerate cases (reader ko kabhi stranded mat chhodna)

KYA AUR KYUN, har ek apni row mein figure mein:

  • . Kisi bhi prefix mein fit ho jaata hai (). Number slots mein all-zeros likh do. Ek byte.
  • (sabse bada jo phir bhi fit hota hai). E.g. . Phir bhi ek byte — kyunki . Yeh aakhri "sasta" value hai.
  • (trap). E.g. . Fit-and-stop nahi hota! Prefix all-ones ho jaata hai aur remainder , toh hum phir bhi ek continuation byte emit karte hain (, top bit off). Total do bytes store karne ke liye. Yeh log ko surprise karta hai: ek byte layta hai, do layta hai.
  • Remainder ka multiple of 128 hona. Agar exactly ho: toh emit , phir emit . Do continuation bytes.

PICTURE. Ek chhoti table-figure: par "cliff" jahan byte-count 1 se 2 ho jaata hai, saath mein aur cases draw kiye gaye.

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push
Recall 5-bit prefix mein index 31, index 30 se zyada costly kyun hai?

Kyunki "keep reading" signal ke roop mein reserved hai. Values ek byte mein fit-and-stop ho jaati hain; ko all-ones flag set karna padta hai aur phir remainder () ke liye ek continuation byte emit karna padta hai, jisse do bytes lagte hain.


Ek picture mein poora summary

Figure — HTTP - 2 — multiplexing, header compression (HPACK), server push

Yeh final figure poori machine ko ek number par chalata hai: ek byte orange flags + teal -bit prefix mein split; fit-or-overflow decision; aur daaye taraf nikalta 7-bit continuation chain, top-bit ka matlab "aur". Bas yahi hai HPACK integer encoding ka pura mechanism — woh mechanism jo ek baar dynamic table mein aa jaane ke baad baar baar aane wale 200-byte cookie ko ek single referencing byte mein badal deta hai.

Recall Feynman retelling — apne shabdon mein kehke batao

Ek byte 8 slots hoti hai. HPACK top slots ek type flag par kharch karta hai aur neeche ke slots ko ek number ke liye chhoti si dabbi ke roop mein chhodta hai. Agar number dabbi mein fit ho jaaye (strictly se kam), bas daalo usme — khatam, ek byte. Agar bahut bada ho, toh dabbi ko all-ones se bharo as a "aur bhi hai" signal, utna minus karo, aur baaki bachi hui cheez ko follow-up bytes mein 7 bits ek baar mein dalte jao — har aise byte ka top slot kehta hai "ek aur aa raha hai", jab tak ek byte na kehe "Main aakhri hoon". Decode karne ke liye, dabbi padho; agar all-ones hai, 7-bit chunks pakdte jao (lowest chunk pehle) aur unhe weights ke saath dabbi ki value ke upar jodo. Ek gotcha: value khud kabhi fit nahi hoti — yeh escape hatch hai — toh index ironically index se zyada costly hai.

Related: yeh varint trick poori tarah Varint-encoding mein dobara milti hai; HPACK generic gzip kyun avoid karta hai yeh CRIME-and-BREACH-attacks mein hai; literal-string path Huffman-Coding use karta hai; aur poora scheme TCP/TLS ke upar baitha hai, transport ke lihaz se HTTP-3-and-QUIC ne ise supersede kar diya hai.


Quick self-checks:

ko 5-bit prefix mein encode karo
Ek byte, number-slots (kyunki ).
ko 5-bit prefix mein encode karo
31, 154, 10.
31, 154, 10 decode karo (5-bit prefix)
.
special kyun hai
Yeh "keep reading / overflow" signal ke roop mein reserved hai, isliye yeh fit-and-stop value nahi ho sakta.
5-bit prefix mein index ki cost
Do bytes (prefix , phir continuation ).