一、HTTP 请求报文由哪些部分组成¶
原笔记先从请求报文开始拆解。一个典型请求如下:
---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: baidu.com
Connection: Keep-Alive
---request end---
它可以拆成四部分:
- 请求报文起始行
- 请求头
- 空行
- 请求报文主体
body
其中,body 一般出现在上传等场景中,普通下载类请求很多时候并没有请求体。
二、请求起始行最需要掌握什么¶
原笔记把请求起始行列为重点,示例是:
GET / HTTP/1.1
这里至少要掌握三个信息:
2.1 请求方法¶
原笔记列出了三个最常见的方法:
| 请求方法 | 说明 |
|---|---|
GET |
下载,大多数普通访问都是它 |
POST |
上传、登录等带提交动作的请求 |
HEAD |
类似 GET,但只返回响应头,常用于检查 |
2.2 URI 的含义¶
原笔记特别强调:
GET /lidao.mp4 HTTP/1.1 中的 / 不是 Linux 系统根目录,而是网站的站点目录。
例如:
- 假设站点目录是
/app/code/www/ - 那么访问
/lidaoav.mp4 - 实际对应的就是
/app/code/www/lidaoav.mp4
这也是后面学习 Nginx root 指令时的基础。
2.3 用 HEAD 方法检查网站¶
原笔记给出了一个 curl -I 的例子:
[root@oldboy01 ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Wed, 27 Dec 2023 12:53:09 GMT
Etag: "575e1f59-115"
Last-Modified: Mon, 13 Jun 2016 02:50:01 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
其中 -I 表示只显示 HTTP 响应头,不显示响应体。
三、请求头里最常见的字段¶
原笔记把两个字段列为重点:
| 字段 | 含义 |
|---|---|
User-Agent |
客户端代理,也就是用什么工具或浏览器访问 |
Host |
访问的目标网站,通常是域名或 IP |
除了命令行工具,原笔记还建议直接通过浏览器开发者工具查看网络请求:
- 按
F12或Fn + F12 - 打开“网络”面板
- 查看请求头和响应头
这对于排查实际网站请求尤其有帮助。
四、HTTP 响应报文由哪些部分组成¶
原笔记把响应报文也拆成四部分:
- 响应报文起始行
- 响应头
- 空行
- 响应报文主体
其中响应体就是服务端真正返回的数据,例如 HTML 页面内容。
五、响应起始行和响应头要重点看什么¶
原笔记把响应起始行的重点放在状态码上,例如:
HTTP/1.1 200 OK
这行至少包含:
- 协议与版本
- 状态码
- 状态码描述
在响应头里,笔记重点提到了这些字段:
| 字段 | 说明 |
|---|---|
Server |
服务端使用的 Web 服务器及版本 |
Content-Type |
返回内容的媒体类型 |
Content-Length |
返回内容大小 |
Location |
跳转后的新位置,常见于 301/302 |
例如查看 jd.com 时,原笔记给出了如下示例:
[root@oldboy01 ~]# curl -v jd.com
< HTTP/1.1 301 Moved Permanently
< Content-Type: text/html
< Content-Length: 178
< Connection: keep-alive
< Location: https://www.jd.com
< Server: jfe
从这里就能直接看出这是一次跳转响应。
六、HTTP 请求与响应的流程如何理解¶
原笔记配合流程图说明了完整过程,核心可以概括为:
1、用户在浏览器中输入网址 2、客户端向服务端发起 HTTP 请求 3、服务端接收请求并处理 4、服务端返回响应报文 5、浏览器拿到内容后进行展示
理解这条链路之后,再看抓包、日志和浏览器调试信息就不会混乱。
七、状态码该怎么记¶
原笔记给出了两层记忆方式。
先记大类:
| 状态码范围 | 含义 |
|---|---|
2xx |
正常 |
3xx |
需要跳转,整体仍属于正常处理 |
4xx |
客户端问题 |
5xx |
服务端问题 |
再记常见状态码:
| 状态码 | 说明 |
|---|---|
200 OK |
访问正常 |
301 Moved Permanently |
永久跳转 |
302 Found |
临时跳转 |
304 Not Modified |
浏览器缓存命中 |
403 Forbidden |
权限拒绝,或首页文件存在问题 |
404 Not Found |
文件找不到 |
500 Internal Error |
服务端内部错误 |
502 Bad Gateway |
网关错误,常见于反向代理或负载场景 |
503 Service Temporarily Unavailable |
服务临时不可用 |
504 Gateway Time-out |
网关超时 |
原笔记还给出了参考链接:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
八、小结¶
HTTP 协议的重点不是死记术语,而是把报文结构看懂:
- 请求看起始行、请求头和目标资源
- 响应看状态码、响应头和返回内容
- 排查问题时优先借助
curl、浏览器调试工具和状态码含义
把这几个核心点掌握住,后面学习 Web 服务和 Nginx 站点配置时会更有方向感。