{"action":"opened","issue":{"url":"https://api.github.com/repos/ToPeas/blog/issues/3","repository_url":"https://api.github.com/repos/ToPeas/blog","labels_url":"https://api.github.com/repos/ToPeas/blog/issues/3/labels{/name}","comments_url":"https://api.github.com/repos/ToPeas/blog/issues/3/comments","events_url":"https://api.github.com/repos/ToPeas/blog/issues/3/events","html_url":"https://github.com/ToPeas/blog/issues/3","id":266328896,"number":3,"title":"Http2.0和Https 笔记","user":{"login":"ToPeas","id":13310553,"avatar_url":"https://avatars2.githubusercontent.com/u/13310553?v=4","gravatar_id":"","url":"https://api.github.com/users/ToPeas","html_url":"https://github.com/ToPeas","followers_url":"https://api.github.com/users/ToPeas/followers","following_url":"https://api.github.com/users/ToPeas/following{/other_user}","gists_url":"https://api.github.com/users/ToPeas/gists{/gist_id}","starred_url":"https://api.github.com/users/ToPeas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ToPeas/subscriptions","organizations_url":"https://api.github.com/users/ToPeas/orgs","repos_url":"https://api.github.com/users/ToPeas/repos","events_url":"https://api.github.com/users/ToPeas/events{/privacy}","received_events_url":"https://api.github.com/users/ToPeas/received_events","type":"User","site_admin":false},"labels":[{"id":722677810,"url":"https://api.github.com/repos/ToPeas/blog/labels/https","name":"https","color":"fef2c0","default":false},{"id":718624489,"url":"https://api.github.com/repos/ToPeas/blog/labels/http%E5%8D%8F%E8%AE%AE","name":"http协议","color":"e05769","default":false}],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2017-10-18T01:08:54Z","updated_at":"2017-10-18T01:08:54Z","closed_at":null,"author_association":"OWNER","body":"# HTTPS\r\n是以安全为目标的HTTP通道，简单讲是HTTP的安全版。即HTTP下加入SSL层，HTTPS的安全基础是SSL，因此加密的详细内容就需要SSL。\r\n\r\n## https和http的区别\r\n* HTTP 是明文传输，HTTPS 通过 SSL\\TLS 进行了加密\r\n* HTTP 的端口号是 80，HTTPS 是 443\r\n* HTTPS 需要到 CA 申请证书，一般免费证书很少，需要交费\r\n* HTTPS 的连接很简单，是无状态的；HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议，比 HTTP 协议安全。\r\n\r\n## https的主要好处\r\n\r\n* 建立一个信息安全的通道，保证信息传输的安全\r\n* 确保网站的真是性，防止钓鱼\r\n\r\n\r\n## 加密算法\r\n\r\n* 对称加密：对称加密加密与解密使用的是同样的密钥。所以速度快，但由于需要将密钥在网络传输，所以安全性不高。\r\n* 非对称加密：非对称加密使用了一对密钥，公钥与私钥，所以安全性高，但加密与解密速度慢。RSA（非对称加密算法），双方必须协商一对密钥，一个私钥一个公钥。用私钥加密的数据，只有对应的公钥才能解密，用公钥加密的数据， 只有对应的私钥才能解密。\r\n\r\n## 所以https协议采用的对称加密和非对称加密结合的形式\r\n使用对称密钥的好处是速度比较快，使用非对称密钥的好处是可以使得传输的内容不能被破解，因为就算你拦截到了数据，但是没有 私钥，也是不能破解内容的。就比如说你抢了一个保险柜，但是没有保险柜的钥匙也不能打开保险柜。所以我们要结合两者的优点。使用 RSA 的方法将加密算法的对称密钥发送过去，之后就可以使用使用这个密钥，利用对称密钥来通信了。就比如说我将钥匙放进了保险柜，然后将保险柜寄给对方。\r\n\r\n## 最后一步。验证公钥\r\n\r\n所以以上的步骤都是可行的，只需要最后一点就可以了，要确定服务器 给浏览器的公钥确实是 浏览器。 的公钥，而不是别人的。这个时候就需要CA(认证机构)。服务器先用个人信息 + Hash算法 + CA的私钥  生成数字签名 。然后数字信息和原始信息合在一起称为数字证书，服务器 只需将数字证书发送给浏览器就可以了。在拿到数字证书之后，就用同样的Hash 算法， 再次生成消息摘要，然后用CA的公钥对数字签名解密，得到CA创建的消息摘要，两者一比，就知道有没有人篡改了！\r\n\r\n\r\n参考\r\n---\r\n[https简介](https://juejin.im/post/59e4c02151882578d02f4aca)\r\n\r\n# HTTP 的发展历史\r\n\r\n下面的一张图简要的介绍\r\n\r\n![](https://user-gold-cdn.xitu.io/2017/10/16/2326bd8549c7d83e2127d4d603b6eb14?imageView2/0/w/1280/h/960/ignore-error/1)\r\n\r\n## http 0.9 (1991)\r\n只支持get post head\r\n没有请求头。只有文本，连接结束就关闭\r\n\r\n## http 1.0 (1996)\r\n\r\n传输格式\r\n```\r\n请求方式 路径 协议\r\n请求头部消息\r\n\r\n请求内容\r\n```\r\n## http  1.1 (1997)\r\n\r\n相对于 1.0增加了 \r\n*  持久传输\r\n*  分块传输\r\n*  字节范围请求\r\n*  传输编码\r\n*  增强的缓存\r\n*  管道\r\n\r\n持久传输keep-alive：\r\n\r\n* HTTP Keep-Alive 简单说就是保持当前的TCP连接，避免了重新建立连接。\r\n\r\n* HTTP 长连接不可能一直保持，例如 Keep-Alive: timeout=5, max=100，表示这个TCP通道可以保持5秒，max=100，表示这个长连接最多接收100次请求就断开。\r\n\r\n* HTTP是一个无状态协议，这意味着每个请求都是独立的，Keep-Alive没能改变这个结果。另外，Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的，在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知，所以不应该让程序依赖于Keep-Alive的保持连接特性，否则会有意想不到的后果。\r\n\r\n* 使用长连接之后，客户端、服务端怎么知道本次传输结束呢？两部分：1. 判断传输数据是否达到了Content-Length 指示的大小；2. 动态生成的文件没有 Content-Length ，它是分块传输（chunked），这时候就要根据 chunked 编码来判断，chunked 编码的数据在最后有一个空 chunked 块，表明本次传输数据结束。\r\n\r\nTransfer-Encoding 是一个用来标示 HTTP 报文传输格式的头部值：\r\n\r\n尽管这个取值理论上可以有很多，但是当前的 HTTP 规范里实际上之定义了一种传输取值——chunked。\r\n\r\nHTTP Pipelining\r\n\r\n默认情况下 HTTP 协议中每个传输层连接只能承载一个 HTTP 请求和响应，浏览器会在收到上一个请求的响应之后，再发送下一个请求。在使用持久连接的情况下，某个连接上消息的传递类似于请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3。\r\n\r\nHTTP Pipelining（管线化）是将多个 HTTP 请求整批提交的技术，在传送过程中不需等待服务端的回应。使用 HTTP Pipelining 技术之后，某个连接上的消息变成了类似这样请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3。\r\n\r\n如果一个HTTP消息（请求消息或应答消息）的Transfer-Encoding消息头的值为chunked，那么，消息体由数量未定的块组成，并以最后一个大小为0的块为结束。\r\n\r\nhttp 2\r\n\r\n主要为了解决几个个问题\r\n\r\n* 头阻塞：HTTP/1.1中只有该请求响应后才能重用当前连接发送下一次请求，即使管道化技术使得可以在本次响应完成之前发送下次请求，但响应依然严格按照顺序返回，也就是如果前一个响应被阻塞，后边的响应将不会到来。\r\n* 重复的未压缩头数据传输：自HTTP/1.0以后，HTTP请求中通常带有大量以ASCII编码的头部，这些头部通常大部分都不会变化，每次请求都会携带，这给本就拥挤不堪的网络带来了更多的压力（尤其是像User Agent、Cookie这种值比较长的头部字段）。\r\n\r\nhttp2 的主要特点：\r\n\r\n* 与HTTP/1.x采用ASCII码明文传输的方式不同，HTTP/2在服务器和客户端之间采用传输效率更高的二进制的形式。HTTP/2中报文二进制帧被分为头部帧（Header Frame）和数据帧（Data Frame）。\r\n* 在HTTP/2中，所有数据的传输可以分为连接（Connection）、流（Stream）和帧（Frame）三个层次。与HTTP/1.1中采用的并行连接不同，HTTP/2在客户端和服务器的整个会话都会复用一条连接。在这个连接中一组完整地请求、响应被称为流。流中的每段数据（头部、数据段）被称为帧。帧是HTTP/2中通信的最小单位，其中包含了其属于那条流的“身份”信息。 \r\n* 前面已经提到，HTTP/1.x会在请求和响应中中重复地携带不常改变的、冗长的头部数据，给网络带来不必要地负担。HTTP/2除了将ASCII明文转化为二进制帧以提高网络传输的有效性外，还提出了一种专门针对报文头部数据进行压缩的方案——Hpack。其主要思想是，通过重用当前连接中之前发送请求中的头部，仅发送新加或更改的头部信息，以降低报文中头部字段大小。\r\n* 在HTTP/2中，请求和响应是可以乱序传输的，因此我们需要一个机制可以确保哪些被其他响应数据所依赖的或者关键资源被优先传输，以使网页的呈现和使用具有最好的体验。HTTP/2中在流的层面，采用了“优先级树”的形式确保响应数据能够按照依赖关系和优先级顺序来传输。\r\n* 简单来讲，Server Push就是允许Server对还没有发出的请求进行响应。如下图所示，在第一个请求中，客户端发出了一条对index.html的请求。通过对index.html的分析，服务器可以推测出其该html的加载还需要style.css和script.js，因此在第一条请求的响应中可以将这些内容一并发送过去，避免了接下来两条请求、响应带来的延迟（RTT, Round-trip Time）。\r\n\r\n> l需要注意的是，在升级HTTP/2之前要确认服务器支持SSL（支持HTTPS）。HTTP/2自身并不要求必须底层支持SSL，但当服务器不支持SSL时，几乎所有的浏览器会无视HTTP/2连接。 \r\n"}}
{"actor":{"display_login":"ToPeas"}}