HTTP请求

HTTP请求
[TOC]
HTTP协议简介
什么是超文本?
-
包含有
超链接和各种多媒体元素标记的文本 -
这些超文本文件彼此链接,形成
网状(Web),因此又被称为网页(Web Page)包含我们服务器上的所有资源
-
这些 链接 使用
URL表示 -
最常见的 超文本格式 是超文本标记语言
HTML
什么是URL?
URL 即统一资源定位符,用来 唯一 的标识万维网中的某一个文档

| 特性 | http | https |
|---|---|---|
| 全称 | 超文本传输协议(HyperText Transfer Protocol) | 安全超文本传输协议(HTTP Secure) |
| 是否加密 | ❌ 明文传输 | ✅ 使用 SSL/TLS 加密 |
| 默认端口 | 80 | 443 |
| 安全性 | 低:数据可被窃听、篡改、冒充 | 高:提供机密性、完整性、身份认证 |
| 浏览器显示 | 地址栏无锁 / 显示“不安全” | 绿色锁图标(若证书有效) |
HTTPS = HTTP + SSL/TLS ,即在
应用层和传输层之间加了一个安全加密层
请求报文格式

✅由 请求行、请求头、空行 和 请求体 四部分组成
❗用一个 单独的 CRLF (
\r\n回车+换行)表示头部结束,必须存在,即使没有 请求体
它也是 HTTP 协议规定的
行结束符所有行都以
\r\n结尾
请求行
<方法> <请求URI> <HTTP版本>-
请求URI:要访问的资源路径,如
/index.html或完整的URL这个
/叫做网站的站点目录这个资源在网站站点的哪个地方,叫什么名字
URL vs URI
URL: https://nginx.org/en/docs/# 统一资源定位符https://nginx.org 是协议 + 域名'它是一个完整的网络地址,包含协议、域名、路径等信息'
URI: /en/docs/# 统一资源标识符'它是 URL 的一个子集,只表示“资源的位置”或“名称”,不包含协议和域名部分'Nginx 的 location 规则会根据这个 URI 来进行匹配| 项目 | 说明 |
|---|---|
| URL | 完整网址,如 http://example.com/path |
| URI | 域名后的内容,如 /path |
| Nginx location | 匹配的是 URI,不是整个 URL |
连接行为
- HTTP版本:如
HTTP/1.1、HTTP/2(通常写作HTTP/1.1)
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|---|---|
| 连接行为 | 短连接:每次请求都需重新建立连接 | 支持长连接(Keep-Alive): 响应后保持连接,不会立刻断开,保留这个连接 | 多路复用(Multiplexing): 单连接支持并发请求 | 基于 QUIC(UDP),支持多路复用与低延迟连接 |
| 是否加密 | 不加密(HTTP) | 可选:HTTP:不加密 HTTPS:加密(TLS) | 默认使用 HTTPS(TLS 加密) | 默认加密(基于 TLS 1.3 + QUIC) |
| 传输层协议 | TCP | TCP | TCP | UDP(通过 QUIC 实现) |
| 适用场景 | 早期 Web 应用 | 普通网页加载 | 现代网站、SPA、API 接口 | 流媒体、实时通信、高延迟网络环境 |

Connection: 控制连接行为(如keep-alive长连接)
短连接(1.0):请求一次,断开一次
特别消耗资源,所以我们现在不用1.0
长连接(1.1):握上手后,再也不断开了,请求一次响应一次
多路复用(2.0):一次性把所有请求全部给你,一次性响应全部给我
🍔HTTP2.0 以冒号开头(如
:method: GET,:path /index.html)来替代 HTTP/1.1 中的请求行,不再以明文形式包含协议版本号(如HTTP/1.1或HTTP/2.0)
http1.0 http1.1 http2.0都是基于tcp稳定连接的(三次握手,四次挥手)
http3.0基于udp
方法
方法(Method) 是对 所请求对象 所进行的操作,也就是一些命令;如 GET、POST、PUT、DELETE、HEAD 等
| 方法(操作) | 含义 | 使用频率 |
|---|---|---|
| GET | 请求读取一个Web页面 | ⭐⭐⭐⭐⭐(最高) |
| POST | 创建Web页面资源,提交表单、上传数据等 | ⭐⭐⭐⭐☆ |
| PUT | 存储保存Web页面,完整保存全部内容,更新整个资源 | ⭐⭐⭐☆☆ |
| DELETE | 删除Web页面 | ⭐⭐⭐☆☆ |
| OPTIONS | 查询特定选项 | ⭐⭐☆☆☆ |
| HEAD | 请求读取Web页面的头部,不给内容 | ⭐⭐☆☆☆ |
| TRACE | 用于网络测试,要求服务器送回刚刚收到的请求 | ⭐☆☆☆☆ |
| CONNECT | 用于代理服务器 | ⭐☆☆☆☆ |
✅ 小贴士:
-
日常上网时,你最常触发的是 GET 和 POST
-
PUT、DELETE 多见于 App 或网站后台的 API 操作
-
后四种方法(OPTIONS、HEAD、TRACE、CONNECT)大多由浏览器或服务器自动处理
普通用户基本不会直接使用
请求头
由若干 键值对 组成,每行一个,格式为:
Header-Name: Header-Value常见请求头包括:
-
Host: 指定目标主机和端口(HTTP/1.1 必须包含) -
User-Agent: 客户端信息(如浏览器类型) -
Accept: 客户端请求的页面类型(如text/html) -
Accept-Encoding: 客户端请求的页面编码方式,如:gzip -
Accept-Language: 客户端请求的偏好语言 -
Cache-Control: no-cache,这个是没有缓存如果有了缓存,响应报文中的状态码会从
200--->304 -
Cookie: 客户端携带的 Cookie -
Referer: 来源Referer,用来记录你这页面是从哪个网站过来的如果有,我们就能够记录下来;如果没有就是你自己直接访问过来的

以上都是用于 请求 的类型
请求体
🍔 请求体 是 HTTP 请求中用于携带 客户端 发送给 服务器 的数据的部分
- GET 请求通常没有请求体
- POST/PUT 等方法常带有请求体,用于提交数据
响应报文格式

- HTTP
响应报文和请求报文的结构差不多,也是由四个部分组成
状态码
用来反应 服务端 是否能够正常处理用户的请求
-
响应报文
状态行中的一个3位数字 -
类似于
命令行的错误提示状态码 未来就是用来定位错误的
✅ 2xx:成功
- 200 OK:请求成功,访问正常
🔁 3xx:重定向(跳转)
- 301 Moved Permanently:永久跳转,资源已永久移动到新地址 302 Found:临时跳转,资源暂时在别处 304 Not Modified:资源未修改,可使用浏览器缓存 ⚠️ 注意:304 是“缓存命中”,不是跳转,但常被归为 3xx 一类
❌ 4xx:客户端错误
-
404 Not Found:请求的页面或资源不存在,文件找不到,常见于 路径错误
代码目录不存在 404
-
403 Forbidden:权限拒绝,无法访问(可能是
权限问题或首页文件缺失)代码目录存在、页面不存在 403
🛠️ 5xx:服务器错误
- 500 Internal Error:服务器内部错误 可能是程序异常、依赖服务(数据库、缓存)突然不可用、SELinux 阻止 502 Bad Gateway:网关错误,后端服务无响应或宕机 503 Service Unavailable:服务暂时不可用,如后端负载高、升级维护中 504 Gateway Timeout:网关超时,后端处理时间过长(如复杂SQL查询)
💡 总结一句话:
2xx 成功,3xx 跳转,4xx 客户端问题,5xx 服务器问题
-
❤️用户请求在负载均衡处,如果所有后端 Web 服务器都宕机或无法建立连接
负载均衡器无法获取有效 HTTP 响应 此时,负载均衡器会自己生成一个 502 错误返回给用户
-
4和5开头的都要看错误日志
响应头(消息头):
| 头(header) | 类型 | 说明 |
|---|---|---|
| Server | 响应 | 关于服务器的信息,如Microsoft-IIS/6.0 |
| Content-Encoding | 响应 | 内容是如何被编码的(如gzip) |
| Content-Language | 响应 | 页面所使用的自然语言 |
| Content-Length | 响应 | 以字节计算的页面长度大小 |
| Content-Type | 响应 | 响应的页面类型 |
| Last-Modified | 响应 | 页面最后被修改的时间和日期,在页面缓存机制中意义重大 |
| Location | 响应 | 指示客户将请求发送给别处,即重定向到另一个URL |
| Set-Cookie | 响应 | 服务器希望客户保存一个Cookie |
示例小结

curl -v(小写)
- 它会显示
curl与服务器通信的详细过程 - 用
>表示客户端发出,<表示服务器返回
[root@web01 ~]#curl -v www.baidu.com* Trying 39.156.70.239:80...* Connected to www.baidu.com (39.156.70.239) port 80 (#0)# 尝试连接服务器80端口> GET / HTTP/1.1# 客户端发送的请求行,只是一个get请求> Host: www.baidu.com> User-Agent: curl/7.71.1> Accept: */*# 客户端发送的请求头'GET 请求通常没有请求体'> '请求'* Mark bundle as not supporting multiuse< '响应'< HTTP/1.1 200 OK# 响应状态行< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform< Content-Length: 2381< Content-Type: text/html< Pragma: no-cache< Server: bfe< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/< Date: Mon, 02 Feb 2026 05:25:10 GMT# 响应头<<!DOCTYPE html><!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc># 响应实体浏览器中调试查看
-
打开
edge浏览器按F12进入开发者模式 -
选择
网络,再刷新网页 -
后随便点击一个查看详细内容

http的访问流程
❣️它是基于 TCP连接 的基础之上进行传输的
| 步骤 | 操作 |
|---|---|
| 1 | 解析 URL |
| 2 | DNS 查询域名 → 获取 IP (域名解析) |
| 3 | 建立 TCP 连接(三次握手) |
| 4 | 浏览器发送 HTTP 请求报文(GET /index.html) |
| 5 | 服务器处理请求,返回 HTTP 响应(含 HTML 内容) |
| 6 | 浏览器 接收 响应数据(HTML 文档) |
| 7 | 浏览器 解析并渲染 页面(即显示内容) |
| 8 | 释放 TCP 连接(四次挥手) |
1.用输入域名 - > 浏览器跳转 - > 浏览器缓存 - > Hosts文件 - > DNS解析'先递归查询,再迭代查询' 客户端向服务端发起查询 - > 递归查询# 最后一定告诉你最终的答案 服务端向服务端发起查询 - > 迭代查询# 只返回自己知道的东西2.由浏览器向服务器发起TCP连接(三次握手) 客户端 -->请求建立连接 seq=x 服务端 'SYN' 服务端 -->响应客户端 ack=x+1 seq=y 客户端 'ACK确认收到,SYN建立连接' 客户端 -->建立连接 ack=y+1 seq=x+1 服务端 'ACK确认建立连接'3.客户端发起http请求: 1)请求的方法是什么: GET获取 2)请求的Host主机是: www.oldboyedu.com 3)请求的资源是什么: /index.html 4)请求的端端口是什么: 默认http是80 https是443 5)请求携带的参数是什么: 属性(浏览器信息、页面类型、编码、语言、缓存、等等) 6)请求头后面的空行:表示头部结束,必须存在,即使没有请求体4.服务端响应对应的内容 浏览器信息,时间,页面类型,是否进行长连接(连接行为)......5.客户端向服务端发起TCP断开(四次挥手)(假设当时seq=667,ack=1000) 客户端 --> 断开请求 FIN seq=1000 ack=668 --> 服务端 服务端 --> 响应断开 ACK seq=668 ack=1001 --> 客户端 服务端 --> 断开连接 FIN seq=668 ack=1001 --> 客户端 客户端 --> 确认断开 ACK seq=1001 ack=669 --> 服务端
1.客户端发起http请求,请求会先抵达前端的防火墙2.防火墙识别用户身份,正常的请求通过交换机和tcp连接到后端的负载均衡,传递用户的http请求3.负载接收到请求,会根据请求的内容进行下发任务,通过tcp连接后端的web,转发发用户的http请求4.web接收到用户的http请求后,会根据用户请求的内容进行解析,解析分为如下: 静态请求:web直接返回给负载均衡->防火墙->用户 动态请求:web向后端的动态程序建立TCP连接,将用户的动态http请求传递至动态程序->由动态程序进行解析5.动态程序在解析的过程中,如果碰到查询数据库请求,则优先与缓存建立tcp连接,并发起数据查询操作6.如果缓存没有对应的数据,动态程序再次向数据库建立tcp连接,并发起查询操作7.最后数据由, 数据库->动态程序->缓存->web服务->负载均衡->防火墙->用户http相关术语
衡量系统访问量指标
PV: 点击一次页面、刷新一次页面被网站记录一次PV# 页面的访问量
UV: 一台主机就是一个UV、# 独立访客数量
IP: 独立的公网IP地址DAU:每天的活跃用户数量(日活)MAU:每月的活跃用户数量(月活)
举个例子:假设公司有一座大厦,大厦有100人,每个人有一台电脑和一部手机,上网都是通过nat转换出口,每个人每台设备点击网站2次, 请问对应的pv,uv,ip分别是多少?PV: 100X2X2=400UV: 100X2=200IP: 1'很多时候,访问到不了后台,缓存就解决了'文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!



