http和https协议

153 阅读10分钟

http 简介

hyper text transfer protocol 超文本传输协议

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接

  1. HTTP是无连接:处理完即断开连接,采用这种方式可以节省传输时间。

  2. HTTP是媒体独立的:任何类型的数据都可以通过HTTP发送。客户端以及服务器指定MIME-type内容类型。如:

content-type: text/html; charset=UTF-8 html文件
Content-Type: application/json 声明json
Content-Type: multipart/form-data 支持向服务器发送二进制数据
Content-Type: application/x-www-form-urlencoded

  1. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http 请求/响应消息结构

请求:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成 响应:状态行、消息报头、空行和响应正文。

http 请求方法 8种

HTTP1.0 :定义了三种请求方法: GET, POST 和 HEAD 方法。 HTTP1.1 :新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

OPTIONS:可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
PUT:新增
DELETE:删
POST:GET:

GET和POST的区别

get和post

  1. get通过url传参只支持asii字符编码,post通过request body,支持多种编码.
  2. get长度受浏览器url限制,post长度不受限制(受服务器配置,如ini限制)
  3. get可以被缓存,可以回退,post要主动缓存,回退回重新提交
  4. get三次握手后把header和body一起发送给服务器,post是先发送header,等待服务器返回100后进行发送body后返回200 (firefox浏览器例外,也是一起发送)
  5. get不安全,更快,POST较安全,2个数据包,较慢

http1.1

优点:长连接,100次请求只要1次握手和挥手,新增方法,缓存,host等 缺点:队头阻塞(服务器必须按顺序响应请求,容易阻塞)

队头阻塞: 如果一个响应返回发生了延迟,那么其后续的响应都会被延迟,直到队头的响应送达,HTTP/2废弃了管道化的方式

长连接:

http1.0是短连接,服务器响应后会关闭tcp连接。http1.1 添加 Connection: keep-alive,可以保持TCP连接,即1个TCP连接可以传输多个http请求。

请求管道化

基于HTTP1.1的长连接,使得请求管线化成为可能。HTTP管道化可以让我们把先进先出队列从客户端(请求队列)迁移到服务端(响应队列),容易造成阻塞。延迟与请求数量成倍增长

缓存处理

更多可供选择的缓存头来控制缓存策略

host

HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname),但随着虚拟主机技术的发展,多个服务器对应1个ip地址,因此添加host头域,如果确实报404

断点传输

将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。

http2.0 基本上只支持https协议

blog.csdn.net/m0_58013135… 特点:二进制传输,多路复用,头部压缩,服务器推送 缺点:tcp队头阻塞,因为所有请求使用同一个tcp连接,阻塞问题更严重

二进制传输

HTTP1.x的解析是基于文本,需要额外文本格式解析,二进制传输更高效。

头部压缩

HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

#### 服务器推送 在http2.0中,服务器在响应浏览器第一个请求的时候,就可以开始推送这些依赖的资源,而无需客户端明确的向其发起请求。

多路复用(连接共享)

同一个tcp连接的所有请求都是共享连接的,同一个域名只是用一个TCP连接。每个request对应一个id, 客户端和服务器可以把 HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

http2.0 的二进制帧技术解决了http头部阻塞的问题,但还是基于tcp协议,还是会发送tcp队头阻塞(tcp要按顺序组装数据)

tcp传输会把数据拆分为一个个按顺序排列的数据包,通过网络传输到接受端后,再按照顺序组合成原始数据,这样就完成了数据传输。

HTTP/1.1的管道化持久连接也是使得同一个TCP链接可以被多个HTTP使用,但是HTTP/1.1中规定一个域名可以有6个TCP连接。而HTTP/2中,同一个域名只是用一个TCP连接。

所以,在HTTP/2中,TCP队头阻塞造成的影响会更大,因为HTTP/2的多路复用技术使得多个请求其实是基于同一个TCP连接的,那如果某一个请求造成了TCP队头阻塞,那么多个请求都会受到影响。

https

背景:存储在浏览器上的 密钥,数据是不安全的,会被劫持和篡改,伪造请求和盗取数据。

http是明文传输,数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,

这就是中间人攻击。所以我们才需要对信息进行加密。最容易理解的就是 对称加密

对称加密: 有一个密钥,它可以加密一段信息,也可以对加密后的信息进行解密,和我们日常生活中用的钥匙作用差不多。

通信双方都各自持有同一个密钥,且没有别人知道既可以实现密文传输,然后用同一个密钥使用对称加密形式解密。但是浏览器存储的密钥是不受安全保障的,随时会泄露密钥。所以要使用 非对称加密

非对称加密: (比较消耗性能)有两把密钥,通常一把叫做公钥、一把叫私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。

服务器->浏览器:服务器数据使用私钥加密,传输给浏览器用公钥解密,安全的传输数据。 浏览器->服务器:公钥是服务器明文发送给浏览器,会被劫持到,就能解密服务器传输过来的信息,不安全!!!

用2对公钥私钥似乎可行(还是有漏洞),但是非对称加密的效率非常低下,所以也没有采取

https使用非对称加密+对称加密

  1. 服务器有非对称加密的公钥A,私钥A
  2. 浏览器请求时,服务器将公钥A给浏览器
  3. 浏览器随机生成 对称加密的 密钥X ,用公钥加密后给服务器
  4. 服务器用私钥解密后得到 密钥X
  5. 服务器和浏览器 都用 对称加密的 密钥X 加密解密数据即可

这里的非对称加密的作用是为了安全告诉服务器 对称加密的 密钥X,双方都知道密钥X后就不用非对称加密了。

中间人攻击

使用非对称加密+对称加密的方法其实还是有 漏洞

中间人劫获 真公钥 ,然后把 假公钥 给浏览器,浏览器将内容用假公钥加密,中间人再次劫持 内容 得到用户的内容后修改内容,再将修改后内容用 真公钥 加密传输给服务器,篡改成功。

CA机构 数字证书

前提: 浏览器是信任CA机构的

网站在使用HTTPS前,需要向CA机构申领一份数字证书,证书中包含 公钥 等信息。 Certificate Authority,简称 CA 。服务器将证书穿给浏览器,获取公钥等信息

如何保证ca证书不被篡改

数字签名s : ca机构对证书明文数据进行hash, 然后用私钥加密,得到

证书明文 + 数字签名s 组成了数字证书,浏览器对数字签名进行校验,判断是否被篡改

浏览器步骤:

  1. 得到明文 + 数字签名s
  2. 用公钥解密 数字签名s 得到hash值,将明文进行hash(证书中指定算法) ,这2个hash相同则未篡改

为什么要hash摘要算法:hash值比较短,提高非对称加密解密的效率

CA证书链

  1. A->B->C,其中A是Root CA(内置在操作系统中),B是二级CA,C是用户访问的网站。
  2. 首先A会签发一张证书a给B,其中包括B的名称,B的公钥,签发人A的名称,A的公钥,证书有效期等元数据,然后A计算所有元数据的哈希值,并使用自己的私钥对哈希值进行加密,生成数字签名。
  3. C获得证书b后,再从公开途径获得B的证书a(例如从B的官网下载,或者B直接提供给C),然后将a和b封装为一个证书文件,形成证书链。最后,将证书文件配置到服务器,当用户访问时,就将这个证书文件提供给用户。
  4. C网站访问时校验B是否合法,然后在校验B证书是否合法。

所以不能随便安装根证书,抓包软件可以看到明文数据也是应为替换了证书。

HTTPS 过程总结

HTTPS 无非就是 HTTP + SSL/TLS。而 SSL/TLS,TLS的全称是Transport Layer Security,即安全传输层协议,由SSL改名而来 的功能其实本质上是:如何协商出安全的对称加密密钥,以利用此密钥进行后续通讯的过程。

TCP三次握手,进行安全层握手:

  1. 浏览器发送 clent hello请求,包含随机数,TLS版本,支持加密套件等
  2. 服务器返回server hello,附带随机数,选择一种合适的加密方式,把配置好的数字证书发给client
  3. 判断域名,有效期等,通过摘要算法,算出签名比对用公钥解密后的数字签名校验证书是否被篡改
  4. 生成随机数,用公钥加密传给服务器
  5. 服务器用私钥解密,然后用对称加密双向传输