文章目录
- 一、HTTP协议:互联网的基础通信协议
- 1.1 什么是HTTP?
- 1.2 HTTP的发展历程
- 1.3 HTTP的特性
- 二、HTTP协议的组成
- 2.1 HTTP报文格式
- 2.1.1 请求报文
- 2.1.2 响应报文
- 2.2 URL:资源的唯一标识
- 2.3 HTTP请求方法
- 2.4 报头(Header)
- 2.5 HTTP状态码
- 三、HTTP的实际应用
- 3.1 浏览器地址栏 + HTML标签
- 3.2 HTML表单(form)
- 四、HTTPS
- 4.1 为什么需要HTTPS?
- 4.2 HTTPS的加密机制
- 4.2.1 对称加密
- 4.2.2 非对称加密
- 4.2.3 证书与CA认证
- 4.3 HTTPS的完整工作流程
- 4.4 HTTP与HTTPS的区别
一、HTTP协议:互联网的基础通信协议
1.1 什么是HTTP?
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层协议,诞生于1991年,如今已发展为互联网最主流的通信协议。它基于TCP/IP协议族工作,负责规范客户端与服务器之间的数据传输格式和交互流程。
这里的“超文本”不仅指文本数据(如HTML、CSS),还包括图片、视频、音频等二进制资源。我们打开一个网站时,浏览器通过HTTP协议向服务器发送请求,服务器返回响应,响应内容经浏览器解析后,就变成了我们看到的网页界面。
1.2 HTTP的发展历程
HTTP协议历经多次迭代,不断优化性能和功能:
- HTTP/0.9(1991):最初版本,仅支持GET方法,只能传输纯文本HTML。
- HTTP/1.0(1997):新增POST、HEAD等方法,支持多种数据类型(图片、音频等),引入HTTP头部字段。
- HTTP/1.1(1999):目前应用最广泛的版本,支持长连接(Keep-Alive)、管道化请求、Chunked编码等,解决了1.0版本的性能瓶颈。
- HTTP/2.0:基于二进制帧传输,支持多路复用、头部压缩、服务器推送,大幅提升传输效率。
- HTTP/3.0:正在完善中,基于UDP协议实现,解决了TCP协议的队头阻塞问题,Google、Facebook等大厂已率先支持。
1.3 HTTP的特性
- 无状态:协议本身不记录客户端的历史交互信息,每次请求都是独立的。如需保持状态(如登录状态),需通过Cookie、Session等机制实现。
- 基于请求-响应模式:客户端主动发送请求,服务器被动返回响应,不存在服务器主动向客户端推送数据的情况。
- 文本协议:HTTP报文是明文的文本格式,便于调试和理解,但也存在安全隐患。
二、HTTP协议的组成
2.1 HTTP报文格式
HTTP通信的基本单位是报文,分为请求报文和响应报文,两者结构相似,均由“首行+头部+空行+正文”四部分组成。
2.1.1 请求报文
以访问CSDN页面为例:
- 首行:格式为
方法 + URL + 协议版本 - 请求头(Header):由多个键值对组成,每个键值对占一行,键和值用
: (空格)分隔,头部用于描述请求的属性,如数据类型、缓存策略等。
http请求头中键的取值和值的取值都是固定的 - 空行:用于分隔头部和正文,是HTTP协议的强制要求,避免出现“粘包问题”。
- 正文(Body):可选部分,用于传输请求数据(如POST请求的表单数据),长度由
Content-Length头部字段指定。
2.1.2 响应报文
- 首行:格式为
协议版本 + 状态码 + 状态码描述 - 响应头(Header):与请求头部格式一致,包含响应的属性
- 空行:分隔头部和正文。
- 正文(Body):服务器返回的实际数据,可以是HTML页面、JSON数据、图片等。
2.2 URL:资源的唯一标识
我们俗称的“网址”其实是URL(Uniform Resource Locator,统一资源定位符),它唯一标识互联网上的一个资源。URL的完整格式如下:
http://www.example.com:80/dir/index.htm?uid=1#ch1各部分含义:
- 协议方案名:如http、https,也可以是jdbc:mysql(访问MySQL数据库)等。
- 服务器地址(
www.example.com):可以是域名或IP地址,域名会通过DNS解析为IP。 - 服务器端口号(
:80):HTTP默认端口80,HTTPS默认443,省略时使用默认端口。 - 带层次的文件路径(
/dir/index.htm):想要访问的是某个主机(IP确定)上某个程序(端口号确定)管理的某个资源在服务器上的存储路径。层次可以理解为目录。 - 查询字符串[
Querry String](?uid=1):键值对结构,用于向服务器传递额外参数,键值对之间用&分隔,键与值用=分割。 - 片段标识(
#ch1):用于页面内跳转,不会发送到服务器。常用于文档类网站。
2.3 HTTP请求方法
| 方法 | 说明 | 特点 |
|---|---|---|
| GET | 获取资源 | 无请求正文,参数通过URL传递,可缓存,幂等 |
| POST | 提交数据 | 有请求正文,参数通过正文传递,不可缓存,非幂等 |
| PUT | 更新资源 | 用于全量更新资源,幂等 |
| DELETE | 删除资源 | 用于删除服务器资源,幂等 |
| HEAD | 获取响应头部 | 与GET类似,但仅返回响应头部,无正文 |
| OPTIONS | 询问支持的方法 | 用于获取服务器支持的HTTP方法 |
GET与POST的区别:
GET和POST没有本质区别,大多数情况都可以混用
- 语义不同:GET用于“获取”资源,POST用于“提交”数据。
- 数据传输方式:GET一般没有body,通过Query String传递数据,POST通过正文传递。
- 缓存特性:GET请求可被浏览器缓存,POST请求不可缓存。
- 幂等性:GET请求建议设计为多次执行结果一致(幂等),POST请求多次执行可能产生不同结果(如重复提交订单)。
- POST典型使用场景:登录、上传。请求中带有正文的,正文就是保存了当前上传的数据内容
2.4 报头(Header)
报头中常见的键值对:
Host:表示服务器主机的地址和端口号。绝大情况下Host与URL中的IP地址和端口号属性是一致的。在HTTPS协议中,传输过程涉及到加密,url部分不会被加密,而header和body部分会被加密
Content-Length:表示body中数据长度,单位是字节。对于TCP来说,一个链接可以发送多个请求,而服务器收到的数据需要区分:
- 没有body的http请求:读到空行就可以认为是结束了
- 有body的http请求:先读取首行和header,读到空行;解析header中Content-Length的值,再读固定的字节长度
Content-Type:表示body中数据格式。
| 类型 | 取值 | 浏览器解析方式 |
|---|---|---|
| HTML | text/html | 解析其中的标签,把标签转换为界面显示 |
| CSS | text/css | 解析其中的选择器和属性,把指定内容应用到页面样式上 |
| JS | application/javascript | 通过JS引擎执行JS中的逻辑 |
| JSON | application/json | 浏览器不会做任何处理,由对应的JS,也就是程序员写的逻辑来处理 |
| 图片 | image/png(jpg) | 按照图片的二进制格式解析出来处理 |
2.5 HTTP状态码
状态码用于表示服务器对请求的处理结果,分为5大类:
| 类别 | 含义 | 常见状态码 |
|---|---|---|
| 1XX | 信息性状态码 | 100 Continue(继续) |
| 2XX | 成功状态码 | 200 OK(请求成功)、204 No Content(无内容) |
| 3XX | 重定向状态码 | 301 永久重定向、302 临时重定向、304 Not Modified(缓存命中) |
| 4XX | 客户端错误状态码 | 400 Bad Request(请求参数错误)、403 Forbidden(访问拒绝)、404 Not Found(资源不存在) |
| 5XX | 服务器错误状态码 | 500 Internal Server Error(服务器内部错误)、504 Gateway Timeout(网关超时) |
常见状态码场景:
- 200 OK:最常见,表明请求成功,服务器返回了请求的资源。
- 302 临时重定向:常用于登录成功后跳转到主页。
- 404 Not Found:URL对应的资源不存在,可能是地址输入错误。
- 403 Forbidden:服务器拒绝访问,通常是未登录或无权限。
- 418 I am a teapot:我是一个茶壶🤪 彩蛋
- 500 Internal Server Error:服务器代码执行出错(如程序bug)。
三、HTTP的实际应用
在实际开发中,我们可以通过多种方式构造HTTP请求,以下是常见场景:
3.1 浏览器地址栏 + HTML标签
- 浏览器地址栏输入URL:直接发送GET请求。
- HTML标签:
<link>(加载CSS)、<img>(加载图片)、<script>(加载JS)等标签会自动发送GET请求。
3.2 HTML表单(form)
form标签是HTML中用于提交数据的标签,支持GET和POST方法:
- GET 请求
<formaction="https://www.example.com/api"method="GET"><inputtype="text"name="username"placeholder="用户名"><inputtype="password"name="password"placeholder="密码"><inputtype="submit"value="登录"></form>- POST 请求
<formaction="https://www.example.com/api"method="POST"><inputtype="text"name="username"placeholder="用户名"><inputtype="password"name="password"placeholder="密码"><inputtype="submit"value="登录"></form>- action:指定请求的URL。
- method:指定请求方法(GET/POST)。
- input标签的name属性:作为请求参数的key,value为用户输入的内容。
四、HTTPS
4.1 为什么需要HTTPS?
HTTP协议的最大问题是明文传输,数据在传输过程中可能被篡改、窃取或劫持,如运营商劫持、黑客攻击。
HTTPS(HTTP Secure)正是为解决HTTP的安全问题而生,它在HTTP基础上增加了SSL/TLS加密层,实现数据传输的机密性、完整性和身份认证。
4.2 HTTPS的加密机制
HTTPS结合了对称加密和非对称加密的优点,既保证安全性,又兼顾传输效率。
4.2.1 对称加密
- 特点:使用同一个密钥进行加密和解密,运算速度快,但密钥传输存在安全风险:密钥被窃取则加密失效。
- 示例:按位异或运算,明文
a=1234与密钥key=8888异或得到密文9834,密文再与密钥异或可还原明文。
4.2.2 非对称加密
- 特点:使用一对密钥(公钥+私钥),公钥可公开,私钥仅持有者拥有。公钥加密的密文只能用私钥解密,私钥加密的密文只能用公钥解密。运算速度慢,但密钥传输安全。
- 应用场景:用于协商对称加密的密钥,避免密钥明文传输。
4.2.3 证书与CA认证
为解决“公钥伪造”问题(中间人替换服务器公钥),HTTPS引入了数字证书和CA(Certificate Authority)认证:
- 服务器向CA机构申请数字证书,证书包含服务器公钥、域名、有效期等信息,并由CA机构用私钥签名。
- 客户端获取证书后,通过操作系统内置的CA公钥验证签名,确认证书合法性(未篡改、未过期)。
- 只有验证通过的证书,客户端才会使用证书中的公钥进行后续通信。
4.3 HTTPS的完整工作流程
- 客户端向服务器发送HTTPS请求,请求中包含支持的加密算法和哈希算法。
- 服务器返回数字证书(包含公钥)和选定的加密/哈希算法。
- 客户端验证证书合法性:
- 检查证书有效期是否过期。
- 检查证书发布机构是否受信任(操作系统内置信任的CA)。
- 用CA公钥解密证书签名,与本地计算的证书哈希值对比,确认证书未被篡改。
- 证书验证通过后,客户端生成随机对称密钥R,用服务器公钥加密R,发送给服务器。
- 服务器用私钥解密,获取对称密钥R。
- 后续通信:客户端和服务器均使用对称密钥R加密/解密数据,实现安全传输。
4.4 HTTP与HTTPS的区别
| 特性 | HTTP | HTTPS |
|---|---|---|
| 传输方式 | 明文传输 | SSL/TLS加密传输 |
| 端口 | 80 | 443 |
| 安全性 | 无身份认证、数据易被篡改/窃取 | 有身份认证、数据机密性和完整性保障 |
| 性能 | 无加密开销,性能略高 | 加密/解密有开销,性能略低 |
| 证书 | 无需证书 | 需向CA申请数字证书 |