{"id":28175351,"url":"https://github.com/webobite/http-evolution-in-recent-past","last_synced_at":"2026-01-25T15:03:38.543Z","repository":{"id":289844017,"uuid":"972573171","full_name":"webobite/HTTP-evolution-in-recent-past","owner":"webobite","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-25T10:30:17.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-15T23:13:58.923Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webobite.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-25T09:49:32.000Z","updated_at":"2025-04-25T10:30:21.000Z","dependencies_parsed_at":"2025-04-25T11:23:32.792Z","dependency_job_id":"2eb49f8c-363d-4994-8ab6-12dcd586b9e3","html_url":"https://github.com/webobite/HTTP-evolution-in-recent-past","commit_stats":null,"previous_names":["webobite/http-evolution-in-recent-past"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/webobite/HTTP-evolution-in-recent-past","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webobite%2FHTTP-evolution-in-recent-past","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webobite%2FHTTP-evolution-in-recent-past/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webobite%2FHTTP-evolution-in-recent-past/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webobite%2FHTTP-evolution-in-recent-past/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webobite","download_url":"https://codeload.github.com/webobite/HTTP-evolution-in-recent-past/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webobite%2FHTTP-evolution-in-recent-past/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28754807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T13:59:49.818Z","status":"ssl_error","status_checked_at":"2026-01-25T13:59:33.728Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-15T23:13:55.941Z","updated_at":"2026-01-25T15:03:38.524Z","avatar_url":"https://github.com/webobite.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# HTTP-evolution-in-recent-past\n### HTTP Protocol Evolution: 0.9 to 3.0\n\n---\n\n## HTTP/0.9\n\n### Overview\n\nHTTP/0.9 was the original, one-line protocol that supported only the GET method and delivered a raw HTML response without headers or status codes ([MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Evolution_of_HTTP)). The request format consisted solely of `GET /resource` and the server replied with the contents of the resource as a continuous byte stream.\n\n### Limitations and Scenarios\n\n- **Lack of Metadata:** No headers meant no way to specify content type, length, or encoding, making it impossible to serve non-HTML resources or perform content negotiation.\n- **No Status Codes:** Errors could only be conveyed by returning an HTML error page, complicating automated error handling.\n- **Connection Overhead:** Each request required a new TCP connection, leading to high latency for pages with multiple assets (e.g., images).\n\n\u003cimg width=\"619\" alt=\"image\" src=\"https://github.com/user-attachments/assets/4282dd7c-b86d-4c4a-b9e6-c21a7129344a\" /\u003e\n\n\n### Resolution in HTTP/1.1\n\nHTTP/1.1 introduced headers, status codes, and persistent connections to address these limitations.\n\n---\n\n## HTTP/1.1\n\n### Overview\n\nStandardized in RFC 7230–7235, HTTP/1.1 became the dominant web protocol by 1999. It required the `Host` header to enable virtual hosting and supported methods beyond GET, such as POST, PUT, and DELETE.\n\n### Problems Solved Compared to HTTP/0.9\n\n- **Persistent Connections:** Default support for keep-alive connections allowed multiple requests and responses over a single TCP connection, reducing the cost of TCP handshake and teardown for pages with many resources.\n- **Chunked Transfer Encoding:** Servers could send dynamically generated content without knowing the total size in advance by breaking the response into chunks.\n- **Caching and Conditional Requests:** Introduction of headers like `If-Modified-Since` and `ETag` enabled more efficient caching strategies and bandwidth savings.\n\n\u003cimg width=\"631\" alt=\"image\" src=\"https://github.com/user-attachments/assets/62412cf8-34c0-417b-9500-8664675e1c8a\" /\u003e\n\n### Remaining Challenges\n\n- **Head-of-Line Blocking:** Despite persistent connections, HTTP/1.1 pipelining suffered from head-of-line blocking, where a slow response could delay subsequent requests.\n- **Limited Server Push:** No standardized way for servers to proactively send resources before the client requested them.\n\n---\n\n## HTTP/2\n\n### Overview\n\nHTTP/2, published as RFC 7540 in May 2015, was designed to improve web performance while remaining fully compatible with HTTP/1.1 semantics. It introduced a binary framing layer, multiplexed streams, header compression (HPACK), and server push.\n\n### Problems Addressed\n\n- **Multiplexing:** Multiple requests and responses could be interleaved over a single TCP connection without waiting for earlier ones to complete, eliminating transaction-level head-of-line blocking.\n- **Header Compression:** HPACK reduced header overhead by compressing repeat header fields and using indexing for previously seen values.\n- **Server Push:** Servers could send additional resources to clients preemptively, anticipating future requests, which could improve page load times.\n\n\u003cimg width=\"553\" alt=\"image\" src=\"https://github.com/user-attachments/assets/d614bc13-af0d-46a3-8691-cf57a15676ef\" /\u003e\n\n\n### New Challenges\n\n- **TCP Head-of-Line Blocking:** Although HTTP/2 fixed application-layer blocking, packet loss at the TCP level still stalled all multiplexed streams on that connection.\n- **Complex Frame Management:** Binary framing and stream prioritization added implementation complexity for both clients and servers.\n\n---\n\n## HTTP/3\n\n### Overview\n\nHTTP/3, specified in RFC 9114 (June 2022), remaps HTTP semantics onto the QUIC transport protocol, which runs over UDP. QUIC integrates TLS 1.3, provides stream multiplexing, per-stream flow control, and 0-RTT connection establishment to reduce latency and eliminate TCP-level head-of-line blocking.\n\n### Problems Addressed\n\n- **Elimination of TCP Head-of-Line Blocking:** QUIC’s independent streams ensure that packet loss only stalls the affected stream, not the entire connection.\n- **Faster Connection Setup:** Integrated TLS handshake and transport negotiation enable fewer round trips, often allowing data to flow in 0-RTT configurations.\n- **Connection Migration:** QUIC supports seamless client IP changes (e.g., mobile roaming) without tearing down and re-establishing the connection.\n\n\u003cimg width=\"613\" alt=\"image\" src=\"https://github.com/user-attachments/assets/43797847-1f3d-4dca-8a84-091e3f7a4e65\" /\u003e\n\n\n### Remaining Considerations\n\n- **Middlebox Compatibility:** UDP-based QUIC may be blocked or throttled by firewalls and network middleboxes expecting TCP traffic.\n- **Implementation Maturity:** While major browsers and CDNs support HTTP/3, some server and infrastructure components are still catching up.\n\n---\n\n## Useful Links\n\n- [RFC 1945 – HTTP/1.0](https://datatracker.ietf.org/doc/html/rfc1945)\n- [RFC 7230–7235 – HTTP/1.1](https://datatracker.ietf.org/doc/html/rfc7230)\n- [RFC 7540 – HTTP/2](https://datatracker.ietf.org/doc/html/rfc7540)\n- [RFC 9114 – HTTP/3](https://datatracker.ietf.org/doc/html/rfc9114)\n- [MDN Web Docs: Evolution of HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Evolution_of_HTTP)\n- [HTTP/2 on Wikipedia](https://en.wikipedia.org/wiki/HTTP/2)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebobite%2Fhttp-evolution-in-recent-past","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebobite%2Fhttp-evolution-in-recent-past","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebobite%2Fhttp-evolution-in-recent-past/lists"}