Skip to content

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状态码

状态码分类

类别范围描述
1xx100-199信息性状态码
2xx200-299成功状态码
3xx300-399重定向状态码
4xx400-499客户端错误状态码
5xx500-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资源的ETagIf-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资源的ETagETag: "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设置CookieSet-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工作原理

  1. 客户端发起HTTPS请求
  2. 服务器返回证书
  3. 客户端验证证书
  4. 客户端生成随机对称密钥
  5. 客户端使用服务器公钥加密密钥
  6. 服务器使用私钥解密密钥
  7. 双方使用对称密钥加密通信

HTTPS与HTTP的区别

特性HTTPHTTPS
端口80443
安全性明文传输加密传输
证书不需要需要
性能更快稍慢(加密开销)
搜索引擎无特殊待遇排名更靠前

面试常见问题

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应用。

好好学习,天天向上