网络 http https
http
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
http1.0
HTTP 1.0规定浏览器与服务器只保持短暂的连接, 浏览器的每次请求都需要与服务器建立一个TCP连接, 服务器完成请求处理后立即断开TCP连接, 服务器不跟踪每个客户也不记录过去的请求
http1.1
在1.0的基础上变动了以下特性:
缓存处理 , 在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准, HTTP1.1则引入了更多的缓存控制策略例如Entity tag, If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化及网络连接的使用, HTTP1.0中, 存在一些浪费带宽的现象, 例如客户端只是需要某个对象的一部分, 而服务器却将整个对象送过来了, 并且不支持断点续传功能, HTTP1.1则在请求头引入了range头域, 它允许只请求资源的某个部分, 即返回码是206(Partial Content), 这样就方便了开发者自由的选择以便于充分利用带宽和连接。
错误通知的管理, 在HTTP1.1中新增了24个错误状态响应码, 如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
Host头处理, 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址, 因此, 请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展, 在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers), 并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域, 且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
长连接, HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理, 在一个TCP连接上可以传送多个HTTP请求和响应, 减少了建立和关闭连接的消耗和延迟, 在HTTP1.1中默认开启Connection: keep-alive, 一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点
http2.0
什么是SPDY协议
SPDY是Speedy的昵音, 意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能, 通过压缩、多路复用和优先级等技术, 缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议, 而是对HTTP协议的增强
HTTP2.0:SPDY的升级版
HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的), 但是, HTTP2.0 跟 SPDY 仍有不同的地方, 如下:
HTTP2.0和SPDY的区别:
HTTP2.0 支持明文 HTTP 传输, 而 SPDY 强制使用 HTTPS
HTTP2.0 消息头的压缩算法采用 HPACK http://http2.github.io/http2-spec/compression.html, 而非 SPDY 采用的 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE
HTTP2.0和HTTP1.X相比的新特性
新的二进制格式(Binary Format), HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷, 文本的表现形式有多样性, 要做到健壮性考虑的场景必然很多, 二进制则不同, 只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式, 实现方便且健壮。
多路复用(MultiPlexing), 即连接共享, 即每一个request都是是用作连接共享机制的。一个request对应一个id, 这样一个连接上可以有多个request, 每个连接的request可以随机的混杂在一起, 接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
header压缩, 如上文中所言, 对前面提到过HTTP1.x的header带有大量信息, 而且每次都要重复发送, HTTP2.0使用encoder来减少需要传输的header大小, 通讯双方各自cache一份header fields表, 既避免了重复header的传输, 又减小了需要传输的大小。
服务端推送(server push), 同SPDY一样, HTTP2.0也具有server push功能
幂等 Idempotence
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用
get 是幂等的, post不是(不一定是)
https
HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议, 主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密, 实现互联网传输安全保护。设计目标主要有三个。
(1)数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样, 都进行了封装, 别人无法获知里面装了什么
(2)数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西, 但他有可能中途掉包, 数据完整性就是指如果被掉包, 我们能轻松发现并拒收
(3)身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时, 虽然是一个封装好的未掉包的包裹, 但必须确定这个包裹不会送错地方, 通过身份校验来确保送对了地方
双向的身份认证
-
客户端和服务端在传输数据之前,会通过基于证书对双方进行身份认证 。具体过程如下 :
-
客户端发起 SSL 握手消息给服务端要求连接。
-
服务端将证书发送给客户端。
-
客户端检查服务端证书, 确认是否由自己信任的证书签发机构签发。 如果不是, 将是否继续通讯的决定权交给用户选择 ( 注意, 这里将是一个安全缺陷 )。如果检查无误或者用户选择继续, 则客户端认可服务端的身份。
-
服务端要求客户端发送证书, 并检查是否通过验证。失败则关闭连接, 认证成功则从客户端证书中获得客户端的公钥, 一般为1024位或者 2048位。到此, 服务器客户端双方的身份认证结束, 双方确保身份都是真实可靠的
cookie和session
Cookie | Session | |
---|---|---|
储存位置 | 客户端 | 服务器端 |
目的 | 跟踪会话, 也可以保存用户偏好设置或者保存用户名密码等 | 跟踪会话 |
安全性 | 不安全 | 安全 |
session技术是要使用到cookie的, 之所以出现session技术, 主要是为了安全
GET和POST
- url可见性
- get, 参数url可见
- post, url参数不可见
- 数据传输上
- get 通过拼接url进行传递参数;
- post 通过body体传输参数
- 缓存性
- get请求是可以缓存的
- post请求不可以缓存
- 传输数据的大小
- get一般传输数据大小不超过2k-4k(根据浏览器不同, 限制不一样, 但相差不大)
- post请求传输数据的大小不限制情况下可以无限大
- 安全性
- 这个也是最不好分析的, 原则上post肯定要比get安全, 毕竟传输参数时url不可见, 但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的, 防君子不防小人就是这个道理。对传递的参数进行加密, 其实都一样