HTTP协议
HTTP简介
HTTP(HyperText Transfer Protocol)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是Web的基础。
HTTP版本
HTTP/1.0
- 发布时间:1996年
- 特点:每个请求都需要建立新的TCP连接
- 缺点:连接开销大,性能差
HTTP/1.1
- 发布时间:1997年
- 特点:
- 支持持久连接(Keep-Alive)
- 支持管道化(Pipelining)
- 支持分块传输编码(Chunked Transfer Encoding)
- 新增请求方法:OPTIONS、PUT、DELETE、TRACE、CONNECT
- 缺点:队头阻塞(Head-of-Line Blocking)
HTTP/2
- 发布时间:2015年
- 特点:
- 多路复用(Multiplexing)
- 头部压缩(HPACK)
- 服务器推送(Server Push)
- 二进制协议
- 缺点:仍基于TCP,存在队头阻塞
HTTP/3
- 发布时间:2022年
- 特点:
- 基于QUIC协议
- 更快的连接建立
- 更好的多路复用
- 内置加密
- 优点:彻底解决队头阻塞问题
HTTP请求方法
常用请求方法
| 方法 | 描述 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ |
| POST | 创建资源 | ❌ | ❌ |
| PUT | 更新资源 | ✅ | ❌ |
| DELETE | 删除资源 | ✅ | ❌ |
| PATCH | 部分更新 | ❌ | ❌ |
| HEAD | 获取头部信息 | ✅ | ✅ |
| OPTIONS | 获取服务器支持的方法 | ✅ | ✅ |
| CONNECT | 建立隧道连接 | ❌ | ❌ |
| TRACE | 追踪请求-响应路径 | ✅ | ✅ |
请求方法示例
javascript
// GET请求
fetch('https://api.example.com/data', {
method: 'GET'
});
// POST请求
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'John' })
});
// PUT请求
fetch('https://api.example.com/data/1', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: 'Jane' })
});
// DELETE请求
fetch('https://api.example.com/data/1', {
method: 'DELETE'
});
// PATCH请求
fetch('https://api.example.com/data/1', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ age: 30 })
});HTTP状态码
状态码分类
| 类别 | 范围 | 描述 |
|---|---|---|
| 1xx | 100-199 | 信息性状态码 |
| 2xx | 200-299 | 成功状态码 |
| 3xx | 300-399 | 重定向状态码 |
| 4xx | 400-499 | 客户端错误状态码 |
| 5xx | 500-599 | 服务器错误状态码 |
常见状态码
2xx 成功
- 200 OK:请求成功
- 201 Created:资源创建成功
- 202 Accepted:请求已接受,处理中
- 204 No Content:请求成功,无响应体
- 206 Partial Content:部分内容请求成功
3xx 重定向
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
- 303 See Other:查看其他位置
- 304 Not Modified:资源未修改
- 307 Temporary Redirect:临时重定向(保持方法)
- 308 Permanent Redirect:永久重定向(保持方法)
4xx 客户端错误
- 400 Bad Request:请求参数错误
- 401 Unauthorized:未授权
- 403 Forbidden:禁止访问
- 404 Not Found:资源不存在
- 405 Method Not Allowed:方法不允许
- 406 Not Acceptable:不可接受的内容类型
- 408 Request Timeout:请求超时
- 409 Conflict:资源冲突
- 413 Payload Too Large:请求体过大
- 414 URI Too Long:URI过长
- 415 Unsupported Media Type:不支持的媒体类型
- 429 Too Many Requests:请求过多
5xx 服务器错误
- 500 Internal Server Error:服务器内部错误
- 501 Not Implemented:未实现
- 502 Bad Gateway:网关错误
- 503 Service Unavailable:服务不可用
- 504 Gateway Timeout:网关超时
- 505 HTTP Version Not Supported:HTTP版本不支持
HTTP头部
请求头部
| 头部 | 描述 | 示例 |
|---|---|---|
| Host | 请求的主机名 | Host: api.example.com |
| User-Agent | 客户端信息 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 |
| Accept | 可接受的内容类型 | Accept: application/json |
| Accept-Language | 可接受的语言 | Accept-Language: zh-CN,zh;q=0.9 |
| Accept-Encoding | 可接受的编码 | Accept-Encoding: gzip, deflate, br |
| Content-Type | 请求体的内容类型 | Content-Type: application/json |
| Content-Length | 请求体的长度 | Content-Length: 23 |
| Authorization | 认证信息 | Authorization: Bearer token123 |
| Cache-Control | 缓存控制 | Cache-Control: no-cache |
| If-None-Match | 资源的ETag | If-None-Match: "abc123" |
| If-Modified-Since | 资源的最后修改时间 | If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT |
响应头部
| 头部 | 描述 | 示例 |
|---|---|---|
| Content-Type | 响应体的内容类型 | Content-Type: application/json |
| Content-Length | 响应体的长度 | Content-Length: 42 |
| Content-Encoding | 响应体的编码 | Content-Encoding: gzip |
| Content-Language | 响应体的语言 | Content-Language: zh-CN |
| Date | 响应的日期 | Date: Wed, 21 Oct 2024 07:28:00 GMT |
| ETag | 资源的ETag | ETag: "abc123" |
| Last-Modified | 资源的最后修改时间 | Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT |
| Cache-Control | 缓存控制 | Cache-Control: max-age=3600 |
| Expires | 过期时间 | Expires: Wed, 21 Oct 2024 08:28:00 GMT |
| Location | 重定向的位置 | Location: https://example.com/new |
| Set-Cookie | 设置Cookie | Set-Cookie: sessionId=abc123; Path=/; HttpOnly |
| Access-Control-Allow-Origin | 允许的源 | Access-Control-Allow-Origin: * |
HTTP/2特性
多路复用
- 在一个TCP连接上同时发送多个请求和响应
- 解决了HTTP/1.1的队头阻塞问题
- 提高了网络利用率
头部压缩
- 使用HPACK算法压缩头部
- 减少了头部传输的大小
- 提高了传输效率
服务器推送
- 服务器可以主动推送资源到客户端
- 减少了请求延迟
- 提高了页面加载速度
二进制协议
- 使用二进制格式传输数据
- 更高效的解析
- 减少了错误率
HTTP/3特性
基于QUIC协议
- 基于UDP协议
- 更快的连接建立
- 更好的多路复用
0-RTT连接建立
- 首次连接后,后续连接可以0-RTT建立
- 减少了连接延迟
内置加密
- 基于TLS 1.3
- 提供端到端加密
- 提高了安全性
更好的拥塞控制
- 使用BBR拥塞控制算法
- 提高了网络吞吐量
- 减少了延迟
HTTPS
HTTPS简介
HTTPS(HTTP Secure)是HTTP的安全版本,通过SSL/TLS协议提供加密通信和身份验证。
HTTPS工作原理
- 客户端发起HTTPS请求
- 服务器返回证书
- 客户端验证证书
- 客户端生成随机对称密钥
- 客户端使用服务器公钥加密密钥
- 服务器使用私钥解密密钥
- 双方使用对称密钥加密通信
HTTPS与HTTP的区别
| 特性 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 安全性 | 明文传输 | 加密传输 |
| 证书 | 不需要 | 需要 |
| 性能 | 更快 | 稍慢(加密开销) |
| 搜索引擎 | 无特殊待遇 | 排名更靠前 |
面试常见问题
1. HTTP和HTTPS的区别?
- HTTP:明文传输,端口80,不安全,不需要证书
- HTTPS:加密传输,端口443,安全,需要证书
2. GET和POST的区别?
- GET:获取资源,参数在URL中,有长度限制,可缓存,幂等
- POST:创建资源,参数在请求体中,无长度限制,不可缓存,非幂等
3. HTTP/1.1和HTTP/2的区别?
- HTTP/1.1:基于文本,队头阻塞,单路复用
- HTTP/2:基于二进制,多路复用,头部压缩,服务器推送
4. 什么是HTTP的幂等性?
幂等性是指多次请求产生的结果相同,不会改变服务器状态。GET、PUT、DELETE方法是幂等的,POST、PATCH方法是非幂等的。
5. 什么是CORS?
CORS(跨域资源共享)是一种机制,允许服务器声明哪些源可以访问资源。
6. 什么是预检请求?
预检请求(OPTIONS)是在发送实际请求前,浏览器先发送的一种请求,用于验证服务器是否允许实际请求。
7. 什么是HTTP缓存?
HTTP缓存是一种机制,通过存储资源的副本减少网络请求,提高性能。包括强缓存和协商缓存。
8. 什么是HTTP的长连接?
HTTP长连接(Keep-Alive)是指多个请求可以复用同一个TCP连接,减少连接建立的开销。
9. 什么是HTTP的管道化?
HTTP管道化是指在同一个TCP连接上,客户端可以连续发送多个请求,而不需要等待前一个响应。
10. 什么是HTTP的分块传输编码?
分块传输编码(Chunked Transfer Encoding)是一种HTTP传输机制,允许服务器分块发送数据,而不需要预先知道数据的总大小。
通过理解HTTP协议的各种特性和最佳实践,可以更好地构建高性能、可靠的Web应用。