目录
HTTP1.0 和 HTTP1.1 以及 HTTP2.0的特性及区别
HTTP
HTTP是什么
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
HTTP是基于TCP/IP通信协议来传递数据
HTTP
协议⼯作于客户端
-
服务端架构为上。浏览器作为
HTTP
客户端通过
URL
向
HTTP
服务端即
WEB
服务器发送所有请求。
Web
服务器根据接收到的请求后,向客
户端发送响应信息。
HTTP五大特点:
- 支持客户/服务器模式
- 简单快速:请求常用方法GET,POST,HEAD。程序规模小,通信速度快
- 灵活:允许任何类型数据传输。正在传输的类型由Content-Type加以标记
- 无连接:限制每次只处理一个请求,服务器处理完客户的请求,收到客户应答后,断开连接。后来可以通过Connection:Keep-Alive实现长连接
- 无状态:对于处理事务没有记忆能力,这样可能导致每次重新连接数据量增大
URL
HTTP
使⽤统⼀资源标识符(
Uniform Resource Identifiers, URI
)来传输数据和建⽴连接,
URL(UniformResourceLocator)统一资源定位符
格式如下:
https://www.xxx.com:8080/news/1.html?a=1&b=2#name
包含以下部分:
- 协议部分:https:,后面采用//分隔符
- 域名部分:www.xxx.com,也可以是ip地址
- 端口部分:不是必须部分,:8080
- 虚拟目录部分:如上面的 /news/
- 锚部分:从“#”开始到最后,都是锚部分。
-
参数部分 :从 “ ? ” 开始到 “#” 为⽌之间的部分为参数部分,⼜称搜索部分、查询部分。参数之间用&分隔符
URL和URI区别
- URI,是uniform resource identifier,统⼀资源标识符,⽤来唯⼀的标识 ⼀个资源。
- URL是uniform resource locator,统⼀资源定位器,它是⼀种具体的URI, 即URL可以⽤来标识⼀个资源,⽽且还指明了如何locate这个资源。
- URN,uniform resource name,统⼀资源命名,是通过名字来标识资源,⽐ 如 mailto:java-net@java.mjj.com 。
HTTP请求状态行
GET /example.html HTTP/1.1 (CRLF)
请求行由请求Method,URL字段,和HTTP Version三部分组成总的来说请求行就是定义了本次请求的请求方式,请求的地址,以及所遵循的HTTP协议版本。
HTTP
协议的⽅法有:
- GET : 请求获取Request-URI所标识的资源
- POST : 在Request-URI所标识的资源后增加新的数据
- HEAD : 请求获取由Request-URI所标识的资源的响应消息报头
- PUT : 请求服务器存储或修改⼀个资源,并⽤Request-URI作为其标识
- DELETE : 请求服务器删除Request-URI所标识的资源
- TRACE : 请求服务器回送收到的请求信息,主要⽤于测试或诊断
- CONNECT : 保留将来使⽤
- OPTIONS : 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP请求头
消息报头由⼀系列的键值对组成,允许客户端向服务器端发送⼀些附加信息或者
客户端⾃身的信息,详情自行搜索。
HTTP请求正文
只有在发送
POST
请求时才会有请求正⽂,
GET
⽅法并没有请求正⽂。
HTTP响应
HTTP
响应也由三部分组成,包括状态⾏,消息报头,响应正⽂。
HTTP/1.1 200 OK (CRLF)
HTTP响应状态码
- 1xx :指示信息 - 表示请求已接收,继续处理
- 2xx :成功 - 表示请求已被成功接收、理解、接受
- 3xx :重定向 - 要完成请求必须进⾏更进⼀步的操作
- 4xx :客户端错误 - 请求有语法错误或请求⽆法实现
- 5xx :服务器端错误 - 服务器未能实现合法的请求
常⻅状态代码、状态描述、说明:
- 200 : OK - 客户端请求成功
- 400 : Bad Request - 客户端请求有语法错误,不能被服务器所理解
- 401 : Unauthorized - 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域⼀起使⽤
- 403 : Forbidden - 服务器收到请求,但是拒绝提供服务
- 404 : Not Found - 请求资源不存在,eg:输⼊了错误的URL
- 500 : Internal Server Error - 服务器发⽣不可预期的错误
- 503 : Server Unavailable - 服务器当前不能处理客户端的请求,⼀段时间后,可能恢复正常
HTTP响应报文
HTTP和HTTPS
HTTP的不足
- 通信使用明文(不加密),内容可能被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭受篡改
HTTPS
采⽤
共享密钥加密
(对称)和
公开密钥加密
(⾮对称)两者并⽤的
混合 加密机制。若密钥能够实现安全交换,
那么有可能会考虑仅使⽤公开密钥加密来通信。但是公开密钥加密与共享密钥加密相⽐,
其处理速度要慢。
所以应充分利⽤两者各⾃的优势
,
将多种⽅法组合起来⽤于通信。 在
交换
密钥
阶段使⽤
公开密钥加密
⽅式
,
之后的建⽴通信
交换报⽂
阶段 则使⽤
共享
密钥加密
⽅式。
下图为
混合加密机制:
HTTP握手过程的简单描述如下图
HTTPS的不足:
加密解密过程复杂,导致访问过程速度慢
加密需要向认证机构付费
整个页面的请求都要使用HTTPS
HTTP1.0 和 HTTP1.1 以及 HTTP2.0的特性及区别
http1.0特性:
- 无状态:服务器不跟踪不记录请求过的状态
- 无连接:浏览器每次请求都需要再次建立TCP连接
对于无状态的特性可以借助cookie/session来做身份认证和状态记录
对于无连接导致的性能有两种
- 无法复用连接:每次发送请求,都需要进行依次TCP连接(三挥四握),使得网络的利用率非常低
- 对头阻塞:http1.0规定前一个请求响应到达,下一个请求才能发送。如果前一个阻塞,后面的请求也会阻塞。
http1.1特性:
为了解决http1.0的性能缺陷,http1.1出现了解决方案:
- 长连接:新增Connection字段,可以设置keep-alive保持连接不断开
- 管道化:可以发送多个请求,但是响应还是依次处理。响应的顺序还是按照请求的顺序返回。
- 缓存处理:新增字段cache-control
- 断点传输
http1.1默认长连接,数据传输完成保持tcp连接不断开
- 管道化虽然可以一次性发送多个请求,但是依旧按顺序返回,无法解决对头阻塞
- 缓存处理在浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
- 断点传输则是在上传/下载资源时,如果资源过⼤,将其分割为多个部分,分别上传/下载,如 果遇到⽹络故障,可以从已经上传/下载好的地⽅继续请求,不⽤从头开始,提⾼效率。Header ⾥两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的Content-Range
http2.0特性
- 二进制分帧
- 多路复用:在共享TCP连接的基础上同时发送请求和响应
- 头部压缩
- 服务器推送:服务器可以额外向客户端推送资源,而无需客户端明确的需求
- 二进制分帧将所有的传输信息分割成更小的消息和帧,对他们采用二进制格式的编码
- 多路复用基于二进制分帧,在同一域名下多有访问都是同一个tcp连接中走,http消息被分解成独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装
区别:
- http1.0 到http1.1的主要区别,就是从⽆连接到⻓连接
- http2.0对⽐1.X版本主要区别就是多路复⽤