【网络原理】HTTP协议(一)

发布于:2025-08-04 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

1. HTTP协议的概念

2. HTTP协议的工作流程

3. HTTP协议的报文格式

3.1 抓包工具

3.2 HTTP请求格式

 3.3 HTTP响应格式

4. URL(统一资源定位符)

4.1 URL的组成

4.2 URL encode 


1. HTTP协议的概念

HTTP(超文本传输协议)是互联网上应用最广泛的应用层协议,用于在客户端和服务器之间传输超文本及其他数据。


这里萌新就会有疑问,什么是超文本?

文本

主要的数据为字符串,可以在UTF-8、GBK等字符编码表中找到合法的字符表示。

超文本

超文本不仅包含字符串,还可以嵌入图片、链接、音频、视频等非文本数据。超文本的核心是超链接,允许用户通过点击链接跳转到其他文档或资源,典型代表是HTML。

富文本

富文本是一种可以包含多种格式(如字体、颜色、表格、图片等)的文本形式,常见的应用场景包括Word文档、电子邮件、网页编辑器等

2. HTTP协议的工作流程

HTTP协议是一种基于请求-响应模型的通信协议,最主要的应用场景—网站,最常见的就是浏览器和服务器之间的传输数据,客户端(pc端,移动端)和服务器之间的数据传输

 HTTP协议交互的过程,就是典型的一问一答型

  1. 建立连接:客户端通过TCP/IP与服务器建立连接。

  2. 发送请求:客户端发送HTTP请求报文。

  3. 处理请求:服务器解析请求并生成响应。

  4. 返回响应:服务器发送HTTP响应报文。

  5. 关闭连接:关闭连接


3. HTTP协议的报文格式

3.1 抓包工具

抓包工具:抓包工具本质上就是一个“代理程序”,能够获取网络上传输的数据并显示出来,可以给我们在日常开发的时,提供一些参考

这里我们使用的抓包工具是fiddle软件,这个软件功能很强大,最简单的应用就是抓包,还可以进行弱网测试之类操作,在日常工作中经常使用这个软件


比如我们打开百度搜索界面的时候,会在fiddle中会显示,抓到的数据包,你的电脑上任何一个程序,只要使用了HTTP/HTTPS协议,都会被fiddle捕获到,

我们可以观察到,打开一个网站,客户端和服务器之间的交互不止一条,而是很多次

比如说,第一次交互是为了拿到这个页面的HTML,第二次交互为了拿到CSS,JS等数据,执行js的时候有可能会出发很多的http请求,出发更多的交互,获取更多的数据

 右上角为请求明细,左下角为响应明细,一般会对返回的响应进行压缩(节省带宽),请求不会压缩,在传输数据的时候,压缩和解压缩都是需要消耗资源和时间的


3.2 HTTP请求格式

 HTTP请求包含4个部分

1. 请求行(Request Line)

格式:<方法> <请求URI> <HTTP协议版本>

GET https://www.baidu.com/?tn=15007414_3_dg HTTP/1.1
  • 方法:指定操作类型(如GET、POST等)。

  • 请求URI:目标资源路径(可包含查询参数,如/path?key=value)。

  • 协议版本:常见的版本—HTTP/1.1

2. 请求头(Headers)

 键值对的格式

头部字段 作用
Host 服务器域名(必填,HTTP/1.1强制要求)
User-Agent 客户端标识(如浏览器或curl)
Accept 声明客户端可处理的响应类型(如text/htmlapplication/json
Content-Type 请求体的数据类型(如application/jsonmultipart/form-data
Content-Length 请求体的字节长度(POST/PUT时需要)
Authorization 认证信息(如Bearer Token)
Cookie 发送给服务器的Cookie数据

举例:

Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="9", "Not?A_Brand";v="8"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 SLBrowser/9.0.6.7021 SLBChan/10 SLBVPV/64-bit
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9

从第二行开始,一直到后面都是请求头,其中每一个键值对占一行,键和值之间使用空格分隔

3. 空行

请求头的下面会有一行空行,表示结束

4. 请求体(Body)

 http的载荷部分,有的请求中存在body,有的则不存在

 常见的格式:

  • application/x-www-form-urlencoded:表单数据

  • application/json:JSON格式

  • multipart/form-data:文件上传

举例:

POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 28

{"name":"John","age":25}

 3.3 HTTP响应格式

HTTP响应的基本格式,也是分为4个部分

1. 状态行(Status Line)

格式:<HTTP协议版本> <状态码> <状态描述>

举例:HTTP/1.1 200 OK
  • 协议版本:如 HTTP/1.1 或 HTTP/2

  • 状态码:3位数字,表示请求结果(如 200 表示成功)。

  • 状态描述:状态码的文本说明(如 OKNot Found)。

2. 响应头(Headers)

同样是根据键值对返回信息

头部字段 作用
Content-Type 响应体的数据类型(如 text/htmlapplication/json
Content-Length 响应体的字节长度(重要,尤其对二进制数据)
Server 服务器软件信息(如 Apache/2.4
Date 响应生成的时间(GMT格式)
Set-Cookie 设置客户端的Cookie(用于会话管理)
Cache-Control 控制缓存行为(如 no-cachemax-age=3600
Location 重定向目标URL(状态码为3XX时使用)

3. 空行

请求头的下面会有一行空行,表示结束

4. 响应体(Body)

内容:服务器返回的实际数据(HTML、JSON、图片等)。

格式:由 Content-Type 决定,常见类型:

  • text/html:网页内容。

  • application/json:API响应数据。

  • image/png:二进制图片数据。


4. URL(统一资源定位符)

URL:互联网上用于标识和定位资源的一段字符串,主要的作用就是定位资源

4.1 URL的组成

  https://www.example.com:8080/path/to/resource?query=value#fragment
  \___/   \_____________/\___/\_______________/\_________/ \_______/
    |           |         |          |             |           |
  协议        主机名     端口       路径          查询参数     片段标识
  • 协议(Scheme):指定访问资源使用的协议
  • 主机名(Host):服务器的域名或IP地址
  • 端口号(Port):服务器监听的端口号,如果不写端口号,会有一个默认的端口号
  • 路径(Path):服务器上的资源路径
  • 查询参数(Query String):以 ? 开头,包含 key=value 对,多个参数用 & 连接。
  • 片段标识(Fragment):以 # 开头,用来标识当前页面的某个部分

通过IP地址知道服务器在哪,通过端口号知道程序是哪个,通过路径知道访问那个资源

查询参数,是客户端给服务器传递信息的重要途径,这里数据的组织方式是键值对

根据IP地址,端口号,路径,查询参数,就可以描述出一个网络资源的位置


4.2 URL encode 

 在URL中,有一些数据字符,被保留可以正常使用,有一些字符不能被正常表示,如中文,空格这类的数据,必须进行编码,否则服务器会解析错误,出现一定的bug

bug举例

原始字符串:
https://example.com/files/document#1.pdf

 比如这里#并不是表示片段表示的出现,而是路径中的参数,避免出现歧义,则需要编码

编码后:
https://example.com/files/document%231.pdf

将 #  -> %23  (避免被误认为片段标识符)

URL 编码规则

格式:% + 2位十六进制数(对应字符的 ASCII 或 Unicode 编码)。

字符 编码后
空格 %20
/ %2F
? %3F
= %3D
& %26
# %23

 举例:

原始URL:
https://example.com/search?q=HTTP 协议&page=1

编码后:
https://example.com/search?q=HTTP%20%E5%8D%8F%E8%AE%AE&page=1

在开发的时候,如果URL中的查询参数中出现中文和特殊字符,进行编码是非常有必要的


网站公告

今日签到

点亮在社区的每一天
去签到