网络
HTTPS原理
一句话概括:
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题
HTTP状态码
HTTP状态码分类
1**:信息,服务器收到请求,需要请求者继续执行操作
2**:成功,操作被成功接收并处理
3**:重定向,需要进一步的操作以完成请求
4**:客户端错误,请求包含语法错误或无法完成请求(通常API名称写错或者后台代码没有部署导致找不到接口)
5**:服务器错误,服务器在处理请求的过程中发生了错误
| 状态码 | 英文名称 | 中文描述 |
|---|---|---|
| 100 | Continue | 继续。客户端赢继续其请求 |
| 200 | OK | 请求成功。一般用于get与post请求 |
| 204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
| 300 | Multiple Choices | 多种选择。请求的资源可报货多个位置,相应可返回一个资源特征与地址的列表用于用户终端选择 |
| 301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
| 304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。 |
| 400 | Bad Request | 客户端请求语法错误,服务器无法理解 |
| 401 | Unauthorized | 请求要求你用户的身份认证 |
| 403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
| 404 | Not Found | 服务器无法根据客户端的请求找到资源。 |
| 408 | Request Time-out | 服务器等待客户端发送的请求你时间过长,超时。 |
| 500 | Internal Server Error | 服务器内部错误,无法完成请求 |
| 502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
| 503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
| 504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
一次完整的HTTP请求过程
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
HTTPS页面与HTTP页面混用
https页面不可以嵌入http页面会报出错误提示或者忽略http资源
解决办法:
1.当两种https和http的资源都存在的时候,可以使用相对链接来进行资源定义,即(//resource),这样可以无缝匹配两种资源
2.可以使用ifream结构,在https的层内嵌套一层http的资源,也可是实现访问
HTTP1.0、HTTP1.1、HTTP2.0
HTTP基本优化
影响HTTP速度的主要有两个因素:带宽和延迟
- 带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。
- 延迟:
- 浏览器阻塞:浏览器会由于一些原因阻塞请求。浏览器对于同一个域名,同时只能有4个链接,超过浏览器最大连接数限制,后续请求就会被阻塞
- DNS查询:浏览器需要知道目标服务器IP才能捡来链接。将域名解析为IP的这个系统就是DNS。通常可以用DNS缓存来达到减少这个时间的目的
- 建立链接:HTTP是基于TCP协议的,浏览器最快也要第三次握手才能捎带HTTP请求报文,达到真正的建立链接。但是这些链接无法复用,导致每次请求都会经历3次握手和慢启动
HTTP1.0和HTTP1.1的区别
- 缓存处理:http1.0主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,而http1.1引入了更多的缓存控制策略如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
- 错误通知管理:http1.1中增加了24个错误状态响应码,如409 表示请求的资源与资源当前状态发生冲突;410 表示服务器上的某个资源呗永久性删除
- 带宽优化及网络连接的使用:http1.0中存在浪费带宽的现象,如客户端只想要某个对象的一部分,而服务器却将整个对象传过来了,并且不支持断点续传。http1.1在请求头引入了range头域,允许只请求资源的某个部分,即返回206,方便了开发者自由的选择以便于充分利用带宽和链接
- Host头处理:http1.0中认为每台服务器都绑定唯一的IP地址,因此请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,一台物理服务器可以存在多个虚拟主机,并且共享一个IP。http1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host会报400错误
- 长连接:http1.1支持长连接,和请求的流水线处理,在一个tcp连接上可以传送多个HTTP请求你和响应,减少了建立和关闭连接的消耗和延迟。默认开启connection:keep-alive
HTTP 和 HTTPS 的区别
- https需要CA申请证书
- HTTP协议运行在TCP上,所有传输都是明文的;HTTPS运行在ssl/tls之上,ssl/tls运行在tcp之上,所有传输都是经过加密的
- https和http完全不同的链接方式,端口也不一样http80,https443
- https有效防止运营商劫持
SPDY
- 降低延迟:针对http高延迟问题,spdy采用了多路复用。
- 请求优先级:多路复用带来的问题,在连接共享的基础上可能导致关键请求被阻塞。SPDY允许给每个request设置优先级,重要的请求会优先得到响应
- header压缩:选择合适的压缩算法可以减少包的大小和数量
- 基于https的加密协议传输:提高传输数据可靠性
- 服务端推送(server push):
HTTP2.0:SPDY升级版
http2.0是基于spdy设计的,但略有不同
- 首先http2.0可以接受明文http传输、但spdy强制使用https
- http2.0头部压缩算法用的是HPACK,spdy用的是DEFLATE
HTTP2.0 和HTTP1.x 相比的新特性
- 新的二进制格式:http1.x解析是基于文本。文本表现形式多种多样,要做到健壮性考虑的场景太多,但是二进制只认0和1,更加健壮方便
- 多路复用:即连接共享。一个request对应一个id,这样一个链接上可以有多个request,每个链接的request可以随机混在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面
- header压缩:对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
- 服务端推送
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
- HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
- HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
- HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;
为什么服务端推送会很快?
因为省去了客户端重复请求的步骤,由于没有发起请求,建立连接等操作,所以静态资源通过服务器推送的方式可以极大的提升速度
普通客户端请求:
服务端推送:
为什么要头部压缩?
假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。具体参考:HTTP/2 头部压缩技术介绍
HTTP2.0多路复用有多好?
HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。 HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。
http主要由于慢启动影响效率,而多路复用可以充分利用带宽