<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HTTP/2 on Leanku 的博客</title><link>https://www.leanku.com/tags/http/2/</link><description>Recent content in HTTP/2 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 01 Aug 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://www.leanku.com/tags/http/2/index.xml" rel="self" type="application/rss+xml"/><item><title>HTTP 详解：一次请求背后发生了什么？</title><link>https://www.leanku.com/post/computerscience/http-network-communication/</link><pubDate>Tue, 01 Aug 2023 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/computerscience/http-network-communication/</guid><description>&lt;h1 id="http-详解一次请求背后发生了什么"&gt;HTTP 详解：一次请求背后发生了什么？&lt;/h1&gt;&#10;&lt;p&gt;在 Web 开发中，HTTP 几乎无处不在。&lt;/p&gt;&#10;&lt;p&gt;浏览器访问一个页面，前端调用一个 API，PHP、Java、Go 服务之间进行 RPC，下载文件，提交表单，这些场景背后都可能使用 HTTP。&lt;/p&gt;&#10;&lt;p&gt;但很多开发者真正理解的 HTTP 只是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /users&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;POST /login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;200 OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Content-Type: application/json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果继续往下追问：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;浏览器输入一个 URL 后，到底发生了什么？&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;就会涉及 DNS、TCP、TLS、HTTP、连接复用、请求报文、响应报文、缓存等多个环节。&lt;/p&gt;&#10;&lt;p&gt;理解这些内容之后，很多常见问题都会变得容易：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;为什么第一次请求比较慢？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;为什么 HTTP/1.1 需要 Keep-Alive？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;HTTP/2 为什么能够同时处理多个请求？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Cookie 和 Session 到底是什么关系？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;304 是什么意思？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;为什么 API 经常返回 401、403、404、409？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;HTTPS 到底保护了什么？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;HTTP 和 Socket、TCP 又是什么关系？&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;本文从一次实际请求开始，把这些概念串起来。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1-http-到底是什么"&gt;1. HTTP 到底是什么？&lt;/h2&gt;&#10;&lt;p&gt;HTTP（Hypertext Transfer Protocol，超文本传输协议）是一个&lt;strong&gt;应用层的请求/响应协议&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;它的核心模型非常简单：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ HTTP Request&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ HTTP Response&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;客户端发送 Request，服务端返回 Response。&lt;/p&gt;</description></item></channel></rss>