HTTP/1.0 was finalized in 1996. Every request to the same server requires a separate TCP connection which is expensive to establish.
HTTP/1.1 (1997) introduced ๐ฝ๐ฒ๐ฟ๐๐ถ๐๐๐ฒ๐ป๐ ๐ฐ๐ผ๐ป๐ป๐ฒ๐ฐ๐๐ถ๐ผ๐ป๐, which allow a TCP connection to be reused for multiple requests and responses. This reduces the latency in setting up new connections for each request. But HTTP/1.1 doesnโt solve the ๐ต๐ฒ๐ฎ๐ฑ-๐ผ๐ณ-๐น๐ถ๐ป๐ฒ (๐๐ข๐) ๐ฏ๐น๐ผ๐ฐ๐ธ๐ถ๐ป๐ด problem.
Although HTTP/1.1 enabled pipelining, where multiple requests could be sent out without waiting for each response, the responses still had to be processed and sent back in the order the requests were received. This ordering requirement caused HOL blocking - if the first request took a long time, all later requests had to wait.
HTTP/2 (2015) introduced ๐๐ง๐ง๐ฃ ๐๐๐ฟ๐ฒ๐ฎ๐บ๐ - an abstraction that allows ๐บ๐๐น๐๐ถ๐ฝ๐น๐ฒ๐
๐ถ๐ป๐ด different HTTP exchanges onto the same TCP connection. Streams donโt need to be sent in order. This eliminates HOL blocking at the application layer. But HOL still exists at the TCP transport layer.
HTTP/3 draft was published in 2020. It uses ๐ค๐จ๐๐ instead of TCP as the ๐๐ฟ๐ฎ๐ป๐๐ฝ๐ผ๐ฟ๐ ๐ฝ๐ฟ๐ผ๐๐ผ๐ฐ๐ผ๐น, removing HOL blocking in the transport layer.
QUIC uses UDP. It introduces ๐๐๐ฟ๐ฒ๐ฎ๐บ๐ at the transport layer. QUIC streams share one connection, so no new handshakes or slow starts are necessary to create new streams. QUIC streams are delivered independently so packet loss usually doesnโt affect other streams.