个人学习26.2.22 计网 HTTP协议
HTTP
PART 0 前言
本文的作用为记录自己学习的过程 所以可能出现错误 以及知识点不全面的情况 欢迎批评指正
有参考别人的教学内容与文章
PART 1 简介
HTTP( HyperText Transfer Protocol ) 超文本传输协议
顾名思义 HTTP 就是个 用来传输超文本资源的协议
而超文本 就是包含超链接的文本,可以使用户从当前内容跳转到下一个内容
这个协议作用于两个对象 客户端 服务端
我们访问互联网 就是为了获取网上的资源
而获取资源就需要 客户端 与 服务端 进行网络通信:
客户端 发出 请求报文 的时候 服务端才会回送 响应报文
而 HTTP 规定了请求报文和响应报文的格式
PART 2 URL
在正式开始请求和响应的结构和过程前 我们先来简单地认识一下 URL
URL( Uniform Resource Locator ) 统一资源定位符
顾名思义 就是用于定位资源的字符 用户可以通过访问URL来获取自己想要的资源
一个完整的 URL 结构由六个按顺序排列的部分构成:
<协议><域名><端口><路径><查询参数><锚点>
比如 https://www.example.com:8080/path?query=123#fragment
我们把这条URL拆开分析一下
PART 2.1 协议
比如 http协议 https协议 等
https相比起http更加安全 因为http为明文 而https则进行了加密
http的默认端口为 80
https是的默认端口为 443
http为 非持久连接 即每次完成请求响应 都立刻断开客户端与服务端的连接
这样做的好处在于 服务器可以逐个处理多个请求 节省资源
http 1.1 中为 持久连接 客户端可连续发送多个请求
用Connection:close这一请求头进行断开连接
http协议中 服务器不会记录历史请求数据(无状态)
对于用户来说 其实是有些麻烦的 比如每次进入网页都要重新登陆账号
不过Cookie这一请求头可以实现状态管理 减少繁琐的流程
PART 2.2 域名
域名 顾名思义就是 区域的名称
浏览器通过DNS(域名系统)将域名(如 www.bilibili.com)解析为对应的IP地址(如 120.92.168.51),以便知道服务器在网络中的具体位置
域名其实是为了方便人去阅读而设立的 每个域名背后都对应着一个 IP地址
就比如访问b站 比起在浏览器输入 120.92.168.51
www.bilibili.com 明显更容易记忆
PART 2.2.1 ip地址
IP地址( Internet Protocol Address ) 即 互联网协议地址
每一台设备(包括服务器)在出厂时都会配备唯一的IP地址
IP地址的作用就是 唯一标识互联网中的一个网络及该网络内的一台主机
目前我们最常用的IP地址版本为 IPV4(互联网协议第四版)
它的标准型态为32位二进制数(即32个0/1)
由于IPV4提供的地址不够使用 所以后来推出了IPV6(128位二进制)
号称能让地球上的每一粒沙子都有一个专属的IP地址
由于32位对于人类来说实在太长 为了更容易识别记忆IP地址
将其拆分为等长的四段(4*8)
段与段间用 . 分隔 再把每段二进制数转化为十进制数
就得到了我们的常见的IP地址格式(点分十进制)
例如 11000000 10101000 00000001 00000001
化为点分十进制就是 192.168.1.1
这样一个IP地址又可以分割为 网络位 和 主机位
网络位 可以类比为我们生活的 小区地址 同一网络内所有设备的网络位完全相同
主机位 可以类比为小区内的 门牌号 用来确认网络内的具体设备 且必须唯一
我们可以通过 子网掩码 来判断 网络位 和 主机位
子网掩码的格式和IP地址是一一对应的 比如:
IP地址:192.168.1.10
子网掩码:255.255.255.0
数字为255的部分为网络位 数字为0的部位为主机位
子网掩码本质上也是二进制分段后转化的十进制 所以 255.255.255.0 其实是指
11111111 11111111 11111111 00000000
由于它有24位1 且代表了网络位 我们可以用它在表示IP地址的同时 顺带展示网络位:
192.168.1.10/24 这种方法被称为 CIDR表示法
IP地址中有几个特殊地址
-
0.0.0.0: 通常代表任意地址或本机所有IP 若为服务器配置这个IP 可接收来自任意网卡的外部连接请求 -
127.0.0.1: 本地回环地址 代表设备自身 无论是否接入网络 这个地址都能联通 常用于测试本地网络的运行状态 -
255.255.255.255: 受限广播地址 若在该地址传输数据 同一局域网的所有设备都能接收到
PART 2.2.2 域名的结构
我们拿 www.bilibili.com 举例
我们发现这个域名被 . 分成了三个部分 www bilibili com
-
com:好比省级 -
bilibili:好比市级 -
www:好比县级 -
com:顶级域名 -
bilibili.com:一级域名 -
www.bilibili.com:二级域名
顶级域名
域名管理机构为了管理方便 将虚拟的网络空间划分为多个顶级区域 且都规定了名字 这些就是顶级域名
顶级域名可以划分为三类:
- 国家和地区顶级域名 ccTLDs(Country Code Top-level Domains)
例如 中国是.cn日本是.jp - 通用顶级域名 gTLDs(Generic Top-level Domains)
例如 工商企业com网络服务商net非营利组织org - 新通用顶级域名 New gTLD(New Generic Top-level Domains)
例如 通用xyz高端top红色red人man
在每个顶级域名中 又可以分为很多子区域 这些子区域就是 一级域名
我们在域名注册商那里购买的域名就是 一级域名
从一级域名开始 就能被用来指向IP地址了
域名虽然有等级的划分 但它指向的IP的服务器是没有等级划分的
而在一级域名中再划分的子区域就称为 二级域名
之所以很多网站前都用 www. 指向与一级域名相同的IP地址
是因为 www 是万维网(World Wide Web)的简写 早期域名都是这样处理的 用户也就习惯了
二级域名还可以再往下分 从二级域名开始的取名和指向
都是域名所有者通过域名管理系统中的DNS解析设置来自行设定的
PART 2.3 端口
与 USB HDMI 等物理端口不同 这里的端口是基于软件/网站的
端口用于实现不同软件应用程序或服务之间的顺畅通信
远程计算机一般使用固定的端口 而本地计算机则会让操作系统动态分配端口
端口号的范围为0~65535
用于表示网络中计算机或设备上的进程或服务 一般来说:
- 0~1023 用于特定服务或协议 比如 HTTP FTP SSH
- 1024~49151 由IANA分配 任何应用程序注册后都可以使用
- 49152~65535 动态或私有端口
当数据通过IP地址到达对应的计算机 端口号则会将它们定向到正确的服务
列举一些常见的服务及其对应的端口号
- HTTP -> 80
- HTTPS -> 443
- FTP -> 21
- SSH -> 22
- TELNET -> 23
- SMTP -> 25
- DNS -> 53
- POP3 -> 110
- IMAP -> 143
- SNMP -> 161
PART 2.4 路径
路径 用于指定服务器上资源的具体位置 以 / 开头 也以 / 分割
比如 /products/electronics/smartphones
表示访问网页中 "产品→电子产品→智能手机"的页面
/为根路径 可以访问网站的首页或默认页面
还有某些路径(隐藏路径)可能不直接对应文件系统 而是由Web服务器重写规则或应用程序路由处理
PART 2.5 查询参数
查询参数 用于向服务器传递额外数据
比如:
?key1=value1&key2=value2&key3=value3
我们可以看到 查询参数以 ? 开头 参数间用 & 连接
参数的形式都为用 = 连接的 键值对
通过查询参数 我们可以做到:
- 传递搜索关键词
- 指定分页信息
- 过滤或排序数据
- 传递会话标识或跟踪信息
- 向服务器传递配置选项
查询参数的特性:
- 无序性:参数的顺序通常不影响结果(除非服务器端特别处理)
- 可省略值:有些参数可能只有键没有值,如?print或?flag
- URL编码:当值中包含特殊字符(空格、中文、=、&等)时,需要进行URL编码
- 空格编码为
%20或+ =编码为%3d&编码为%26- 列举一个编码解码网站
- 空格编码为
- 长度限制:不同浏览器对URL长度有限制(通常2048-8192字符),查询参数不宜过长
- 请求方式限制:查询参数通常用于GET请求,POST请求的数据通常在请求体中
PART 2.6 锚点
锚点 也称为 哈希 或 片段标识符
形如:#xxx
比如:#installation
锚点的特点:
- 在浏览器(前端)处理 不会发送给服务器
- 改变锚点不会导致页面重新加载
- 不同锚点会被记录在浏览器历史中,可以使用前进/后退按钮导航
- 锚点中如果有特殊字符,也需要进行URL编码
传统锚点内容对搜索引擎不可见,但现代搜索引擎已能处理部分情况
通过锚点 我们可以做到:
- 配合前端语言设定的 id属性 实现同一页面不同位置的跳转
- 保存应用状态
- 实现前端路由
- 比如
https://example.com/app#/users/passwd
- 比如
PART 2.7 URL分析
来看看一个完整的URL 我们以刚刚的示例URL为例
https://www.example.com:8080/path?query=123#fragment
- 协议:https
- 域名:www.example.com
- 端口:8080
- 路径:/path
- 查询参数:?query=123
- 锚点:#fragment
事实上 我们只要满足 协议 域名(二级即可) 端口 这三个点就已经可以访问到一个网页了
在浏览器中只输入域名也可 协议与端口会由浏览器自动补全
PART 3 请求和响应
了解了URL 来看一看 HTTP 规定的 请求 和 响应
PART 3.1 请求
请求的方向为 客户端->服务端
我们来看看请求报文的格式
随便挑一个用BP抓包的请求报文
GET /favicon.ico HTTP/1.1
Host: node1.anna.nssctf.cn:28999
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://node1.anna.nssctf.cn:28999/?check=1
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=c26a83fa77cf39867938fcb6f0b7892b
Connection: keep-alive
我们来做个注释
<请求行>[请求方法]GET [请求路径]/favicon.ico [HTTP版本]HTTP/1.1
<请求头>Host: node1.anna.nssctf.cn:28999
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://node1.anna.nssctf.cn:28999/?check=1
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=c26a83fa77cf39867938fcb6f0b7892b
Connection: keep-alive
(空行 用于表示请求头的结束)
<请求体>(这条请求报文的请求体为空)
可以看出 请求报文由 请求行 请求头 请求体 这三大部分组成
请求行 又由 请求方法 请求头 请求体 这三部分组成
请求头 则有多个形如 XXX: xxxxxxx的 像列举属性一样的键值对组成
补充一下 请求体 中的内容是向服务端传输的数据 为空就是不需要传输额外数据
PART 3.1.1 请求行
由 请求方法 请求路径 HTTP版本 三个部分组成
请求路径的知识在前面 URL 的“路径”中
在 HTTP1.0 中 有 GET POST HEAD 三种请求方法
在 HTTP1.1 中 新增了 OPTIONS PUT PATCH DELETE TRACE CONNECT 这六种新方法
| 请求方法 | 描述 |
|---|---|
| GET | 请求指定的页面信息 并返回实体主体 |
| HEAD | 类似于 GET 但返回的响应中没有具体的内容 用于获取报头 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件) 数据被包含在请求体中 POST 可能会导致新的资源的建立和/或已有资源的修改 |
| PUT | 请求传送的数据取代指定的文档的内容 |
| DELETE | 请求服务器删除指定页面 |
| CONNECT | 预留给能够将连接改为管道方式的代理服务器 |
| OPTIONS | 允许客户端查看服务器的性能 |
| TRACE | 回显服务器收到的请求 用于测试或诊断 |
| PATCH | 对 PUT 方法的补充 用来对已知资源进行局部更新 |
其中 最重要的就是 GET 和 POST
一般认为 GET 就是从服务端“拿”数据
而 POST 则是向服务端“传”数据
我们可以通过以下几种方式发送 GET 请求
- 通过浏览器直接访问一个URL
- 浏览器运行网页时 HTML中标签的属性中访问URL
- 使用 Javascript 中的 ajax
- 各种编程语言编写的脚本(只要联网)
GET的请求体一般是空的
我们可以通过以下几种方式发送 POST 请求
- 利用表单(比如HTML的form)
- 使用 Javascript 中的 ajax
POST的请求体一般不为空(需要在请求体上传数据)
PART 3.1.2 请求头
请求头中有许多的键值对 可以理解为是在表示 属性:设定属性的内容
首部种类相当的多 所以我们只简单列举一些 不死记 真正要用到时直接查阅即可
| 首部 | 内容 |
|---|---|
| Host | 表示服务器主机的地址和端口(地址为域名或IP 端口可以省略) |
| Content-Length | 表示请求体的数据长度 计量单位为字节 |
| Content-Type | 表示请求体的数据格式 |
| User-Agent | 表示 浏览器/操作系统 的属性 |
| Referer | 表示当前页面是从哪个页面跳转过来的 |
| Cookie | 提供浏览器在本地存储数据的能力(HTTP协议中的服务端不会记录状态) |
PART 3.2 响应
响应的方向为 服务端->客户端
只有在客户端发出请求后 服务端才会发出响应
还是来看BP随便抓的一个响应报文
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Sun, 25 Jan 2026 08:32:22 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.3.33
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 12856
<!DOCTYPE html>
<html lang="zh-CN">
(返回的页面内容 因为过多 这里就不全写了)
我们做一点注释
<响应行>[HTTP版本]HTTP/1.1 [状态码]200 [原因短语]OK
<响应头>Server: nginx/1.20.2
Date: Sun, 25 Jan 2026 08:32:22 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.3.33
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 12856
(空一行表示响应头结束)
<响应体><!DOCTYPE html>
<html lang="zh-CN">
(返回的页面内容 因为过多 这里就不全写了)
可以看出 响应报文也是由三部分组成的 分别是 响应行 响应头 响应体
响应行由 HTTP版本 状态码 原因短语 组成
响应头与请求头类似 响应体则是服务端向客户端传输的数据
PART 3.2.1 响应行
状态码 顾名思义就是表示状态的数据 而原因短语则是表述产生这种状态的原因
注意 由于状态码已经可以表示足够的信息 所以在HTTP2中 原因短语已经被省略了
我们列举一些常见的状态码
| 状态码 | 原因短语 | 含义 |
|---|---|---|
| 200 | OK | 表示访问成功 |
| 301 | Moved Permanently | 表示永久重定向 当浏览器收到时 后续请求都会被改为新地址 |
| 302 | Move temporarily | 表示临时重定向 当浏览器收到时 当前请求会被改为新地址 |
| 403 | Forbidden | 表示访问被拒绝 |
| 404 | Not Found | 表示没有找到资源 |
| 405 | Method Not Allowed | 表示访问的服务器 不支持/不能使用 该请求中的方法 |
| 500 | Internal Server Error | 表示服务器故障 |
| 504 | Gateway Timeout | 表示当前服务器负载大 处理请求不及时 出现超时 |
由于状态码的种类相当的多 所以我们可以先记忆一个简单的规律
- 1xx 表示请求已接收
- 2xx 表示被正常处理
- 3xx 表示重定向
- 4xx 表示客户端错误
- 5xx 表示服务端错误
PART 3.2.2 响应头
与请求头基本雷同(首部种类是有不同的) 这里不多赘述

浙公网安备 33010602011771号