HTTP
引言
我们在浏览器中输入一个网址,按下回车,网页瞬间呈现在眼前。这背后默默工作的“搬运工”就是 HTTP(HyperText Transfer Protocol,超文本传输协议)。
无论是前端的数据请求,还是后端的 API 开发,都离不开对 HTTP 的理解。本文将带你从零开始,由浅入深地拆解 HTTP 协议,建议收藏作为学习和查阅的文档。
1. HTTP 究竟是什么?
HTTP 是一个在计算机世界里专门用来在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。
它有几个非常核心的特点:
- 基于 C/S 架构(客户端/服务端):永远是客户端发起请求(Request),服务端做出响应(Response)。
- 基于 TCP/IP 协议栈:HTTP 位于 OSI 模型的应用层,它通常基于 TCP 协议进行可靠的数据传输(HTTP/3 开始转向 UDP)。
- 无状态(Stateless):HTTP 协议本身是没有记忆的。你第一次请求和第二次请求,在服务器看来是完全独立的。
思考:那为什么我们登录后,网站能记住我们? 答案:为了解决无状态的问题,引入了 Cookie 和 Session 机制,甚至是现在的 JWT (Token) 技术。
2. HTTP 报文结构(长什么样?)
HTTP 的通信过程就是发送和接收“报文”。报文分为请求报文和响应报文,它们都是纯文本格式。
2.1 请求报文(Request)
当客户端向服务器要数据时,发送的就是请求报文。它包含四个部分:
- 请求行(Request Line):包含请求方法、URL、HTTP 版本。
- 请求头(Headers):附加信息,键值对格式(如浏览器类型、接受的数据格式等)。
- 空行(Blank Line):告诉服务器,请求头到此结束。
- 请求体(Body):通常在 POST/PUT 请求中,用来传递数据(如表单内容、JSON 数据)。
示例:
2.2 响应报文(Response)
服务器收到请求并处理后,返回给客户端的数据。也包含四个部分:
- 状态行(Status Line):包含 HTTP 版本、状态码、状态描述。
- 响应头(Headers):服务器的附加信息(如服务器类型、返回数据的类型等)。
- 空行(Blank Line):告诉客户端,响应头结束。
- 响应体(Body):真正请求到的数据(如 HTML 代码、图片、JSON 数据)。
示例:
3. 常用的 HTTP 请求方法(动词)
RESTful API 设计规范中,不同的 HTTP 方法代表了对资源的不同操作:
- GET:获取资源(只读)。
- POST:创建新资源或提交数据。
- PUT:更新资源(全量替换)。
- PATCH:更新资源(局部更新)。
- DELETE:删除资源。
- HEAD:类似 GET,但服务器只返回响应头,不返回响应体(常用于测试链接是否有效、检查文件大小)。
- OPTIONS:询问服务器支持哪些方法(常用于跨域请求的预检 Preflight)。
💡 面试高频考点:GET 和 POST 的区别?
- 用途:GET 用于获取数据,POST 用于提交数据。
- 参数位置:GET 的参数通常放在 URL 中,POST 的参数放在请求体(Body)中。
- 安全性:POST 相对更安全,因为参数不在 URL 中暴露(但抓包依然可见,真正安全需靠 HTTPS)。
- 缓存:GET 请求会被浏览器主动缓存,POST 不会。
- 幂等性:GET 是幂等的(执行多次结果一样),POST 不是幂等的。
4. 必懂的 HTTP 状态码
状态码由三位数字组成,第一位数字代表了响应的类别:
1xx:信息性状态码(接收的请求正在处理)
101 Switching Protocols:切换协议(如升级到 WebSocket)。
2xx:成功状态码(请求正常处理完毕)
200 OK:请求成功,最常见。201 Created:请求成功并且服务器创建了新的资源(常用于 POST)。204 No Content:请求成功,但没有资源可返回(常用于 DELETE)。
3xx:重定向状态码(需要客户端进一步操作)
301 Moved Permanently:永久重定向(网址换了,搜索引擎会更新书签)。302 Found:临时重定向。304 Not Modified:(重点) 资源未修改,告诉客户端直接使用本地缓存。
4xx:客户端错误状态码(客户端请求有问题)
400 Bad Request:请求报文存在语法错误或参数错误。401 Unauthorized:未认证,需要登录(没有 Token 或 Token 过期)。403 Forbidden:拒绝访问(已登录,但权限不足)。404 Not Found:请求的资源在服务器上不存在。405 Method Not Allowed:请求方法不支持(例如接口只允许 POST,你却用了 GET)。
5xx:服务器错误状态码(服务器处理请求出错)
500 Internal Server Error:服务器内部错误(后端代码抛异常了)。502 Bad Gateway:网关错误(通常是 Nginx 等代理服务器无法连接到后端应用)。503 Service Unavailable:服务器超载或正在停机维护。504 Gateway Timeout:网关超时(后端处理太慢了)。
5. 核心 HTTP Header(首部字段)
Header 就像是 HTTP 快递包裹上的“标签”,告诉双方如何处理数据。
- 数据格式与压缩:
Content-Type:告诉对方发送的数据是什么格式(如application/json,text/html)。Accept:客户端告诉服务器自己能接收什么格式的数据。Content-Encoding:数据压缩方式(如gzip)。
- 身份认证与控制:
Authorization:携带认证信息(如 Bearer Token)。Cookie:客户端发送本地保存的 Cookie。Set-Cookie:服务器要求客户端保存 Cookie。
- 缓存控制(性能优化核心):
Cache-Control:控制缓存策略(如max-age=3600,no-cache)。ETag/If-None-Match:通过内容哈希值判断文件是否修改。Last-Modified/If-Modified-Since:通过最后修改时间判断文件是否修改。
- 其他:
Host:指定请求的服务器域名(HTTP/1.1 必须包含)。User-Agent:客户端的信息(浏览器版本、操作系统等)。
6. HTTP 的演进史(1.0 -> 3.0)
了解协议的进化,能让你深刻理解前端性能优化的方向。
HTTP/1.0:短连接时代
- 特点:每次请求都必须建立一次 TCP 连接(三次握手),请求完立刻断开(四次挥手)。
- 痛点:连接建立和断开开销极大,极其慢。
HTTP/1.1:长连接与管道化(当前主流之一)
- 改进:引入
Connection: keep-alive,实现长连接,一个 TCP 连接可以发送多个 HTTP 请求。引入了Host头,支持虚拟主机。 - 痛点:队头阻塞(Head-of-Line Blocking)。同一连接中的请求必须按顺序排队处理,如果前一个请求卡住了,后面的都得等。
HTTP/2.0:多路复用(当前主流之一)
- 改进:
- 二进制分帧:数据不再是纯文本,而是打散成二进制帧。
- 多路复用:彻底解决 HTTP 层的队头阻塞,多个请求可以并行在一个 TCP 连接上交错发送。
- 头部压缩(HPACK):大大减小了 Header 的体积。
- 服务器推送(Server Push):服务器可以主动向客户端推送资源。
- 痛点:虽然解决了 HTTP 层的阻塞,但底层依然是 TCP。一旦网络丢包,TCP 层级的队头阻塞依然会导致整个连接卡住。
HTTP/3.0:甩掉 TCP,拥抱 QUIC
- 改进:直接放弃了 TCP,底层改为基于 UDP 的 QUIC 协议。
- 优势:彻底解决了队头阻塞(哪怕丢包,也只影响丢失的那个请求,其他请求继续传输),0-RTT 极速建连,弱网环境下表现极佳。
7. 附加题:HTTP 和 HTTPS 有什么区别?
简单来说:HTTPS = HTTP + SSL/TLS 协议。
HTTP 报文是明文传输的,这在互联网上无异于“裸奔”,极其容易被黑客窃听(比如抓包看你的密码)和篡改(比如运营商劫持插入广告)。
HTTPS 在 HTTP 和 TCP 之间加了一层安全套接字层(SSL/TLS):
- 加密:所有数据变为密文,防止窃听。
- 数据一致性:防止数据被中间人篡改。
- 身份认证:通过数字证书,证明“淘宝真的是淘宝”,防止钓鱼网站。 (注:HTTP 默认端口是 80,HTTPS 默认端口是 443)
结语
HTTP 协议看似庞杂,但只要理清了它的“请求-响应”模型,理解了常见的方法、状态码和 Header 的作用,再结合日常开发中的抓包工具(如 Chrome DevTools 的 Network 面板、Postman、Wireshark),你就能很快把它吃透。

