13.HTTP协议
# 01.HTTP协议
# 1、概述
- HTTP(超文本传输协议)是一种用于在客户端和服务器之间传输超文本的通信协议
- 它是互联网最核心的协议之一,用于实现Web浏览器与Web服务器之间的交互
- HTTP协议规定了客户端如何请求服务器的资源,以及服务器如何响应客户端的请求
# 2、HTTP的特点
无状态:
- 每个HTTP请求都是独立的,服务器不会保留上一个请求的信息
- 即每个请求和响应都是完全独立的,服务器不会主动记住用户的状态
基于请求-响应模型:客户端发送请求(Request),服务器返回响应(Response)
简单性:HTTP报文的结构比较简单,容易理解和实现,开发者容易掌握
无连接:
- HTTP协议在默认情况下是无连接的,也就是说在一次请求之后,连接就会关闭
- 每次新的请求都需要重新建立连接
灵活性:
- HTTP协议支持不同类型的数据传输,除了文本,还可以传输图片、视频、音频等
# 3、HTTP协议的版本
① HTTP/1.0:
每次请求需要新建一个TCP连接,完成后立即关闭
头部信息简单,没有缓存、持久连接等高级特性
性能较差,尤其在加载包含多个资源(如图片、CSS、JS文件)的页面时,需要反复建立和关闭连接
② HTTP/1.1(广泛使用的版本):
持久连接(Persistent Connection):允许在同一个TCP连接上发送多个请求和响应,减少了频繁的TCP连接建立和断开
管线化(Pipelining):允许客户端在发送一个请求的同时不必等待上一个请求的响应,这提高了传输效率
缓存机制:引入了缓存控制(如
Cache-Control
)的头部字段,减少了不必要的服务器请求分块传输编码:允许服务器分块传输响应内容,使得客户端可以逐块接收数据,适合大文件的传输
③ HTTP/2:
二进制协议:相比HTTP/1.x的纯文本协议,HTTP/2采用二进制格式传输数据,提高了传输效率
多路复用(Multiplexing):
- 多个请求和响应可以在一个TCP连接上并行传输,无需排队等待
- 解决了HTTP/1.1中的队头阻塞(Head-of-Line Blocking)问题
头部压缩:通过HPACK算法对HTTP头部进行压缩,减少了数据传输量
服务器推送(Server Push):服务器可以主动推送资源给客户端,减少客户端的请求次数
④ HTTP/3:
基于QUIC协议:
- HTTP/3不再使用TCP,而是基于Google开发的QUIC协议
- QUIC集成了传输控制和TLS(加密)层,减少了延迟和连接建立时间
更快的传输速度:
- QUIC可以减少连接时的握手时间,提高了传输速度,尤其适用于不稳定的网络环境
# 4、HTTP的工作流程
① 客户端发送请求:用户通过浏览器或其他HTTP客户端发起请求
请求行:定义了请求方法(如GET、POST)、请求的URL、协议版本(如HTTP/1.1)
请求头(Headers):包括与请求相关的元数据,如
User-Agent
、Accept
、Host
等请求体(Body):
- 在某些请求方法(如POST、PUT)中,客户端可能会发送数据给服务器,这些数据会放在请求体中
② 服务器处理请求并发送响应:
响应行:包含HTTP版本、状态码(如200、404等)以及状态描述
响应头(Headers):包含与响应相关的元数据,如
Content-Type
、Content-Length
等响应体(Body):服务器返回的实际数据,如网页的HTML内容、图片、视频等
③ 客户端处理响应:
- 客户端收到服务器的响应后,根据响应的内容进行处理,显示网页或其他资源,或者进行进一步操作
# 5、常见的HTTP方法
- GET:请求指定的资源GET请求通常是幂等的,且不应包含请求体
- POST:向服务器提交数据,通常用于提交表单或上传文件
- PUT:向服务器上传指定资源,可以用来更新资源
- DELETE:请求服务器删除指定的资源
- HEAD:与GET类似,但服务器只返回响应头,不返回响应体,用于检查资源
- OPTIONS:请求服务器支持的通信选项,通常用于跨域请求的预检
- PATCH:用于局部更新资源
# 6、HTTP状态码
- 1xx(信息响应):请求已接收,正在继续处理
- 2xx(成功响应):请求已成功处理常见的有
200 OK
(请求成功)、204 No Content
(成功但无返回内容) - 3xx(重定向):需要进一步操作以完成请求常见的有
301 Moved Permanently
(永久重定向)、302 Found
(临时重定向) - 4xx(客户端错误):客户端请求错误常见的有
400 Bad Request
(请求无效)、401 Unauthorized
(未授权)、404 Not Found
(资源未找到) - 5xx(服务器错误):服务器处理请求时发生错误常见的有
500 Internal Server Error
(服务器内部错误)、503 Service Unavailable
(服务不可用)
# 7、HTTP与HTTPS
- HTTP是明文传输的,这意味着请求和响应的内容可以被第三方拦截和查看,存在安全隐患
- HTTPS是HTTP的安全版
- 它通过SSL/TLS协议加密传输的数据,确保数据的安全性和隐私性
- HTTPS通过在HTTP上添加加密层,防止数据在传输过程中被窃取或篡改
# 8、HTTP协议的安全性问题
- 数据窃听:由于HTTP是明文传输,攻击者可以通过拦截请求和响应获取敏感信息(如登录凭证、个人数据等)
- 中间人攻击:攻击者可以篡改传输的数据,改变请求或响应的内容
- 身份伪造:攻击者可以伪装成合法的服务器或客户端,获取敏感信息
# 02.常见问题
# 1、HTTP工作原理
HTTP是应用层的无状态、面向请求-响应的协议,工作流程如下
- 客户端(浏览器)发送HTTP请求:包含方法(如GET、POST)、URL、协议版本、头部信息和可选的请求体
- 服务器处理请求并返回响应:响应包括状态码、头部信息和可选的响应体(如HTML内容)
- 无状态性:每个请求都是独立的,服务器不保留任何之前请求的上下文
# 2. HTTP请求方法
- GET:请求获取指定资源,参数通常在URL中,不包含请求体
- POST:向服务器提交数据(如表单),包含请求体
- PUT:更新指定资源,数据包含在请求体中
- DELETE:删除指定资源
- HEAD:类似GET,但不返回响应体,只返回头部信息
- OPTIONS:请求查询服务器支持的HTTP方法
- PATCH:对资源进行部分更新
# 3. HTTP状态码
HTTP状态码表示服务器的响应状态,分为以下几类:
- 1xx(信息性状态):请求已接收,继续处理如:
100 Continue
- 2xx(成功):请求成功并被处理如:
200 OK
、201 Created
- 3xx(重定向):请求资源已被移动到新位置,客户端需重定向如:
301 Moved Permanently
、302 Found
- 4xx(客户端错误):请求有错误,客户端需修改如:
400 Bad Request
、401 Unauthorized
、403 Forbidden
、404 Not Found
- 5xx(服务器错误):服务器无法处理请求如:
500 Internal Server Error
、503 Service Unavailable
# 4. HTTP和HTTPS区别
- 安全性:HTTP是明文传输,数据容易被窃取或篡改;HTTPS通过SSL/TLS加密,确保数据传输的安全性和完整性
- 端口:HTTP使用80端口,HTTPS使用443端口
- 证书验证:HTTPS需要SSL/TLS证书,确保通信双方的身份验证
重要性:HTTPS能够有效防止中间人攻击、窃听和数据篡改,因此被广泛应用于安全敏感的场景,如在线支付和登录
# 5. HTTP的无状态性
- 无状态性:HTTP每个请求都是独立的,服务器不保留客户端的状态信息
- 会话管理:为了实现状态保持,可以通过以下方式
- Cookie:服务器通过响应头设置,客户端在后续请求中自动携带
- Session:服务器在会话期间为客户端分配一个唯一的Session ID,客户端通过Cookie携带这个ID
- Token:使用JWT等认证令牌,客户端每次请求时携带令牌,服务器验证令牌以识别客户端
# 6. HTTP1.1和HTTP2区别
- HTTP/1.1:逐个发送请求,建立多个TCP连接
- HTTP/2:多路复用、头部压缩和二进制帧传输,提升性能和效率
- 多路复用:允许同一连接上并发多个请求-响应,不需要为每个请求建立新连接
- 头部压缩:使用HPACK压缩请求和响应的头部,减少带宽消耗
- 优先级和依赖关系:可以为请求分配优先级,以优化资源调度
- 服务器推送:服务器可以在客户端请求前主动发送资源
# 7. 跨域(CORS)问题
- 跨域问题:浏览器出于安全考虑,限制从一个域向另一个域发起的请求
- 解决方案:
- CORS(跨域资源共享):通过设置响应头
Access-Control-Allow-Origin
,服务器明确允许哪些域名可以跨域访问 - JSONP:利用
<script>
标签不受跨域限制,服务器返回一个JavaScript回调函数,但仅支持GET请求 - 代理服务器:通过代理服务器转发请求,客户端向同域服务器请求,代理服务器再向目标服务器发起请求
- CORS(跨域资源共享):通过设置响应头
# 8. HTTP缓存机制
HTTP缓存机制通过缓存头来控制资源的缓存和更新
- 强缓存:
Expires
:指定资源过期时间,但依赖客户端时间,易出错Cache-Control
:更常用,通过max-age
设置资源有效期
- 协商缓存:
Last-Modified
和If-Modified-Since
:通过资源的最后修改时间进行比较,如果未修改则返回304ETag
和If-None-Match
:通过资源的哈希值或版本号验证,如果匹配则返回304
缓存的重要性:缓存能够减少服务器负载,提升客户端响应速度,特别是对于静态资源
# 9. 长连接和短连接的区别
- 短连接:每次请求-响应后立即断开连接,适用于频繁但低流量的场景
- 长连接:使用
Connection: keep-alive
,保持连接在多次请求中不关闭,适用于需要多次请求的场景,减少连接建立和关闭的开销
应用场景:长连接在高频请求的场景下更有效率,如WebSockets、视频流媒体等
# 10. RESTful架构是什么?
RESTful架构是一种基于HTTP的设计风格,遵循以下原则
- 资源的URI标识:每个资源都有唯一的URI表示,如
/users/1
- 使用标准HTTP方法:GET、POST、PUT、DELETE等方法对应不同的CRUD操作
- 无状态性:每次请求应包含所有必要的信息,服务器不保留状态
- 表现层的统一性:服务器返回标准化的资源表示形式(如JSON、XML)
- 客户端-服务器分离:客户端和服务器的职责明确,互不依赖