HTTP请求

3139 字
16 分钟
HTTP请求

HTTP请求#

[TOC]


HTTP协议简介#

什么是超文本?

  • 包含有 超链接各种多媒体元素标记 的文本

  • 这些超文本文件彼此链接,形成 网状(Web) ,因此又被称为 网页(Web Page)

    包含我们服务器上的所有资源

  • 这些 链接 使用 URL 表示

  • 最常见的 超文本格式 是超文本标记语言 HTML


什么是URL?

URL 即统一资源定位符,用来 唯一 的标识万维网中的某一个文档

image-20260127144848489
image-20260127144848489

特性httphttps
全称超文本传输协议(HyperText Transfer Protocol)安全超文本传输协议(HTTP Secure)
是否加密❌ 明文传输✅ 使用 SSL/TLS 加密
默认端口80443
安全性低:数据可被窃听、篡改、冒充高:提供机密性、完整性、身份认证
浏览器显示地址栏无锁 / 显示“不安全”绿色锁图标(若证书有效)

HTTPS = HTTP + SSL/TLS ,即在 应用层传输层 之间加了一个安全加密层

请求报文格式#

请求报文格式
请求报文格式

✅由 请求行请求头空行请求体 四部分组成

❗用一个 单独的 CRLF (\r\n回车+换行)表示头部结束,必须存在,即使没有 请求体

  • 它也是 HTTP 协议规定的 行结束符

    所有行都以 \r\n 结尾

请求行#

Terminal window
<方法> <请求URI> <HTTP版本>
  • 请求URI:要访问的资源路径,如 /index.html完整的URL

    这个 / 叫做网站的站点目录

    这个资源在网站站点的哪个地方,叫什么名字

URL vs URI#

Terminal window
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.1HTTP/2(通常写作 HTTP/1.1
特性HTTP/1.0HTTP/1.1HTTP/2.0HTTP/3.0
连接行为短连接:每次请求都需重新建立连接支持长连接(Keep-Alive): 响应后保持连接,不会立刻断开,保留这个连接多路复用(Multiplexing): 单连接支持并发请求基于 QUIC(UDP),支持多路复用与低延迟连接
是否加密不加密(HTTP)可选:HTTP:不加密 HTTPS:加密(TLS)默认使用 HTTPS(TLS 加密)默认加密(基于 TLS 1.3 + QUIC)
传输层协议TCPTCPTCPUDP(通过 QUIC 实现)
适用场景早期 Web 应用普通网页加载现代网站、SPA、API 接口流媒体、实时通信、高延迟网络环境

image-20260202160315766
image-20260202160315766

Connection: 控制连接行为(如 keep-alive 长连接)

  • 短连接(1.0):请求一次,断开一次

    特别消耗资源,所以我们现在不用1.0

  • 长连接(1.1):握上手后,再也不断开了,请求一次响应一次

  • 多路复用(2.0):一次性把所有请求全部给你,一次性响应全部给我

🍔HTTP2.0 以冒号开头(如 :method: GET, :path /index.html)来替代 HTTP/1.1 中的 请求行 ,不再以明文形式包含协议版本号(如 HTTP/1.1HTTP/2.0

  • http1.0 http1.1 http2.0都是基于tcp稳定连接的(三次握手,四次挥手)

    http3.0基于udp

方法#

方法(Method) 是对 所请求对象 所进行的操作,也就是一些命令;如 GETPOSTPUTDELETEHEAD

方法(操作)含义使用频率
GET请求读取一个Web页面⭐⭐⭐⭐⭐(最高)
POST创建Web页面资源,提交表单、上传数据等⭐⭐⭐⭐☆
PUT存储保存Web页面,完整保存全部内容,更新整个资源⭐⭐⭐☆☆
DELETE删除Web页面⭐⭐⭐☆☆
OPTIONS查询特定选项⭐⭐☆☆☆
HEAD请求读取Web页面的头部,不给内容⭐⭐☆☆☆
TRACE用于网络测试,要求服务器送回刚刚收到的请求⭐☆☆☆☆
CONNECT用于代理服务器⭐☆☆☆☆

小贴士

  • 日常上网时,你最常触发的是 GETPOST

  • PUT、DELETE 多见于 App 或网站后台的 API 操作

  • 后四种方法(OPTIONS、HEAD、TRACE、CONNECT)大多由浏览器或服务器自动处理

    普通用户基本不会直接使用

请求头#

由若干 键值对 组成,每行一个,格式为:

Terminal window
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,用来记录你这页面是从哪个网站过来的

    如果有,我们就能够记录下来;如果没有就是你自己直接访问过来的

image-20260202153028977
image-20260202153028977

以上都是用于 请求 的类型

请求体#

🍔 请求体 是 HTTP 请求中用于携带 客户端 发送给 服务器 的数据的部分

  • GET 请求通常没有请求体
  • POST/PUT 等方法常带有请求体,用于提交数据

响应报文格式#

image-20260202175659661
image-20260202175659661

  • 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

示例小结#

image-20260202162419991
image-20260202162419991

curl -v(小写)#

  • 它会显示 curl服务器 通信的详细过程
  • > 表示客户端发出,< 表示服务器返回
Terminal window
[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>
# 响应实体

浏览器中调试查看#

  1. 打开 edge浏览器F12 进入开发者模式

  2. 选择 网络,再 刷新 网页

  3. 后随便点击一个查看详细内容

image-20260202140651325
image-20260202140651325

http的访问流程#

❣️它是基于 TCP连接 的基础之上​进行传输的

步骤操作
1解析 URL
2DNS 查询域名 → 获取 IP (域名解析)
3建立 TCP 连接(三次握手
4浏览器发送 HTTP 请求报文(GET /index.html)
5服务器处理请求,返回 HTTP 响应(含 HTML 内容)
6浏览器 接收 响应数据(HTML 文档)
7浏览器 解析并渲染 页面(即显示内容)
8释放 TCP 连接(四次挥手
Terminal window
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 --> 服务端

image-20260202174929291
image-20260202174929291

Terminal window
1.客户端发起http请求,请求会先抵达前端的防火墙
2.防火墙识别用户身份,正常的请求通过交换机和tcp连接到后端的负载均衡,传递用户的http请求
3.负载接收到请求,会根据请求的内容进行下发任务,通过tcp连接后端的web,转发发用户的http请求
4.web接收到用户的http请求后,会根据用户请求的内容进行解析,解析分为如下:
静态请求:web直接返回给负载均衡->防火墙->用户
动态请求:web向后端的动态程序建立TCP连接,将用户的动态http请求传递至动态程序->由动态程序进行解析
5.动态程序在解析的过程中,如果碰到查询数据库请求,则优先与缓存建立tcp连接,并发起数据查询操作
6.如果缓存没有对应的数据,动态程序再次向数据库建立tcp连接,并发起查询操作
7.最后数据由, 数据库->动态程序->缓存->web服务->负载均衡->防火墙->用户

http相关术语#

衡量系统访问量指标#

Terminal window
PV: 点击一次页面、刷新一次页面被网站记录一次PV
# 页面的访问量
UV: 一台主机就是一个UV、
# 独立访客数量
IP: 独立的公网IP地址
DAU:每天的活跃用户数量(日活)
MAU:每月的活跃用户数量(月活)
举个例子:
假设公司有一座大厦,大厦有100人,每个人有一台电脑和一部手机,上网都是通过nat转换出口,每个人每台设备点击网站2次, 请问对应的pv,uv,ip分别是多少?
PV: 100X2X2=400
UV: 100X2=200
IP: 1
'很多时候,访问到不了后台,缓存就解决了'

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

HTTP请求
https://www.kpyun.fun/posts/web/other/http/
作者
久棹
发布于
2025-10-30
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录