HTTP基本概念

2019-09-26  本文已影响0人  _半城

HTTP

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

HTTP 协议的特点

请求报文

响应报文

HTTP 方法

Post 和 Get 的区别

先引入副作用和幂等的概念。 副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。 幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致,比如注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次是幂等的。 在规范的应用场景上说,Get 多用于无副作用,幂等的场景,例如搜索关键字。Post 多用于副作用,不幂等的场景,例如注册。

常见状态码

1XX 指示信息

表示请求已接收,继续处理

2XX 成功

3XX 重定向

4XX 客户端错误

5XX 服务器错误

HTTP持久连接(HTTP1.1支持)

HTTP协议采用“请求-应答”模式,并且HTTP是基于TCP进行连接的。普通模式(非keep-alive)时,每个请求或应答都需要建立一个连接,完成之后立即断开。

当使用Conection: keep-alive模式(又称持久连接、连接重用)时,keep-alive使客户端道服务器端连接持续有效,即不关闭底层的TCP连接,当出现对服务器的后继请求时,keep-alive功能避免重新建立连接。

HTTP管线化 (HTTP1.1支持)

[图片上传失败...(image-e0197e-1569467184701)]

管线化后,请求和响应不再是依次交替的了。他可以支持一次性发送多个请求,并一次性接收多个响应。

HTTP数据协商

在客户端向服务端发送请求的时候,客户端会申明可以接受的数据格式和数据相关的一些限制是什么样的;服务端在接受到这个请求时他会根据这个信息进行判断到底返回怎样的数据。

请求

响应

form 表单中enctype数据类型

HTTP Redirect 重定向

HTTP CSP 内容安全策略

CSP Content-Security-Policy

例子:

HTTP2

HTTP 2.0 相比于 HTTP 1.X,可以说是大幅度提高了 web 的性能。

HTTP2采用二进制格式传输,取代了HTTP1.x的文本格式,二进制格式解析更高效。 多路复用代替了HTTP1.x的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完成。

二进制传输

HTTP 2.0 中所有加强性能的核心点在于此。在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP 2.0 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。

多路复用

HTTP1.x中,并发多个请求需要多个TCP连接,浏览器为了控制资源会有6-8个TCP连接都限制。 HTTP2中

在 HTTP 2.0 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。

帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。

多路复用,就是在一个 TCP 连接中可以存在多条流。 换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。

[图片上传失败...(image-f4755d-1569467184697)]

Header 压缩

在 HTTP 1.X 中,我们使用文本的形式传输 header,在 header 携带 cookie 的情况下,可能每次都需要重复传输几百到几千的字节。

在 HTTP 2.0 中,使用了 HPACK 压缩格式对传输的 header 进行编码,减少了 header 的大小。并在两端维护了索引表,用于记录出现过的 header ,后面在传输过程中就可以传输已经记录过的 header 的键名,对端收到数据后就可以通过键名找到对应的值。

服务端 Push

在 HTTP 2.0 中,服务端可以在客户端某个请求后,主动推送其他资源。

可以想象以下情况,某些资源客户端是一定会请求的,这时就可以采取服务端 push 的技术,提前给客户端推送必要的资源,这样就可以相对减少一点延迟时间。当然在浏览器兼容的情况下你也可以使用 prefetch。

HTTP首部

通用字段 作用
Cache-Control 控制缓存的行为
Connection 浏览器想要优先使用的连接类型,比如 keep-alive
Date 创建报文时间
Pragma 报文指令
Via 代理服务器相关信息
Transfer-Encoding 传输编码方式
Upgrade 要求客户端升级协议
Warning 在内容中可能存在错误
请求字段 作用
Accept 能正确接收的媒体类型
Accept-Charset 能正确接收的字符集
Accept-Encoding 能正确接收的编码格式列表
Accept-Language 能正确接收的语言列表
Expect 期待服务端的指定行为
From 请求方邮箱地址
Host 服务器的域名
If-Match 两端资源标记比较
If-Modified-Since 本地资源未修改返回 304(比较时间)
If-None-Match 本地资源未修改返回 304(比较标记)
User-Agent 客户端信息
Max-Forwards 限制可被代理及网关转发的次数
Proxy-Authorization 向代理服务器发送验证信息
Range 请求某个内容的一部分
Referer 表示浏览器所访问的前一个页面
TE 传输编码方式
响应字段 作用
Accept-Ranges 是否支持某些种类的范围
Age 资源在代理缓存中存在的时间
ETag 资源标识
Location 客户端重定向到某个 URL
Proxy-Authenticate 向代理服务器发送验证信息
Server 服务器名字
WWW-Authenticate 获取资源需要的验证信息
实体字段 作用
Allow 资源的正确请求方式
Content-Encoding 内容的编码格式
Content-Language 内容使用的语言
Content-Length request body 长度
Content-Location 返回数据的备用地址
Content-MD5 Base64加密格式的内容 MD5检验值
Content-Range 内容的位置范围
Content-Type 内容的媒体类型
Expires 内容的过期时间
Last_modified 内容的最后修改时间

HTTPS如何保证安全

这个过程比较复杂,首先要了解两个概念。对称加密和非对称加密

对称加密即通信双方使用同一个密钥进行加解密,对称加密虽然简单性能也好,但是无法解决首次将密钥发给对方的安全问题,容易被黑客拦截。

  1. 非对称加密使用一个密钥对,密钥对由公钥和私钥组成

  2. 用私钥加密的数据要用公钥解密,公钥加密的要用私钥加密

  3. 通信双方手里都有自己的一套公钥私钥,通信前将自己的公钥发给对方

  4. 然后对方拿着这个公钥来加密数据再发给对方,对方再用自己的私钥解密

非对称加密安全性更高,但带来的问题就是速度慢,影响性能

HTTPS则结合两种解密方式,将对称加密的密钥用非对称的公钥加密发给对方,对方再用私钥解密得到对称加密的密钥。之后双杠就可以通过对称加密来通信

此时又带来了新的问题,中间人问题。

如果此时客户端和服务器之间存在一个中间人,这个中间人只要将双方通信的公钥换成自己的,就可以轻松解密通信双方的所有数据

这个时候就要有个安全的第三方颁发证书(CA),证明中间人的身份。这个证书包含:

但是这也不够安全,万一中间人篡改了证书,那这个身份证明就白给了。于是有了个新技术,数字签名

数字签名就是用CA自带的hash算法对证书内容进行HASH得到一个摘要,再将这个摘要采用CA的私钥加密,最终组成数字签名

当别人把它的证书发过来,我用同样的hash算法,再次生成消息摘要,然后用CA公钥对数字签名进行解密,得到CA创建的消息摘要,两者一比就知道中间人有没有被人篡改了

这个时候就能最大程度保证通信的安全

上一篇 下一篇

猜你喜欢

热点阅读