一、HTTP 协议
HTTP 协议:超文本传输协议
是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。 HTTP 是基于 TCP 的应用层协议 (OSI 网络七层协议从上到下分别是 应用层、表示层、会话层 、传输层、网络层 、数据链路层、物理层)
请求/响应报文
连接建立流程
HTTP 的特点
A、请求报文和响应报文
1、请求报文
如下:
Host:指明了该对象所在的主机
Connection:Keep-Alive 首部行用来表明该浏览器告诉服务器使用持续连接
Content-Type: x-www-form-urlencoded 首部行用来表明 HTTP 会将请求参数用 key1=val1&key2=val2 的方式进行组织,并放到请求实体里面
User-agent:首部行用来指明用户代理,即向服务器发送请求的浏览器类型
Accept-lauguage:首部行表示用户想得到该对象的法语版本(如果服务器中有这样的对象的话),否则, 服务器应发送它的默认版本
2、响应报文
状态码及其相应的短语指示了请求的结果
200 OK:请求成功,信息在返回的响应报文中
301 Moved Permanently:请求的对象已经被永久转移了,新的 URL 定义在响应报文中的 Location:首部行中。客户软件将自动获取新的 URL
400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解
404 Not Found:被请求的文件不在服务器上
505 HTTP Version Not Supported:服务器不支持请求报文使用的 HTTP 协议版本 <4 开头的状态码通常是客户端的问题,5 开头的则通常是服务端的问题>
Connection:close 首部行告诉客户,发送完报文后将关闭 TCP 连接。
Date:指的不是对象创建或最后修改的时间,而是服务器从文件系统中检索到该对象,插入到响应报文, 并发送该响应报文的时间。
Server: 首部行指示该报文是由一台 Apache Web 服务器产生的,类似于 HTTP 请求报文里的User-agent
Content-Length:首部行指示了被发送对象中的字节数Content-
Type:首部行指示了实体体中的对象是 HTML 文本
二、HTTP 的请求方式
GET、POST、PUT、DELETE、HEAD、OPTIONS
1、GET 和 POST 方式的区别
从语法角度来看,最直观的区别就是:
GET 的请求参数一般以?分割拼接到 URL 后面,POST 请求参数在 Body 里面 GET 参数长度限制为 2048 个字符,POST 一般是没限制的 GET 请求由于参数裸露在 URL 中, 是不安全的,POST 请求则是相对安全 之所以说是相对安全,是因为,如果 POST 虽然参数非明文,但如果被抓包,GET 和 POST 一样都 是不安全的。(HTTPS 该用还是得用)
而从语义的角度来看:
GET:获取资源是 安全的,幂等的(只读的,纯粹的), 可缓存的
POST:获取资源是 非安全的,非幂等的,不可缓存的
这里的安全是指不应引起 Server 端的任何状态变化
安全:GET 的语义就是获取数据,是不会引起服务器的状态变化的,即是安全的。(HEAD,OPTIONS 也 是安全的)
而 POST 语义则是提交数据,是可能会引起服务器状态变化的,即是不安全的
幂等:同一个请求方法执行多次和执行一次的效果完全相同
显然 GET 请求是幂等而 POST 请求是非幂等的。 这里用幂等形容 GET 还不够,因为 GET 不止是执行多次和执行一次的效果完全相同,而且是执行一 次和执行零次的效果也是完全相同的。
可缓存:请求是否可以被缓存。 GET 请求会主动进行 Cache
以上特性,并非并列,正是因为 GET 是幂等的只读的,即 GET 请求除了返回数据不会有其他副作用,所 以 GET 才是安全的,从而可以直接由 CDN 缓存,大大减轻服务器的负担,也就是可缓存的。 而 POST 是非幂等的,即除了返回数据还会有其他副作用,所以 POST 是不安全的,必须交由 web 服务 器处理,即是不可缓存的
GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他 们在应用过程中体现出一些不同。
在响应时,GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包:
对于 GET 方式的请求,浏览器会把 Header 和实体主体一并发送出去,服务器响应 200(返回数据); 而对于 POST,浏览器先发送 Header,服务器响应 100 Continue,浏览器再发送实体主体,服务器响应 200 OK(返回数据)
2、GET 相对 POST 的优势是什么?
1、最大的优势就是方便。GET 的 URL 可以直接手输,从而 GET 请求中的 URL 可以被存在书签里,或者历史记录里
2、可以被缓存,大大减轻服务器的负担 所以大多数情况下,还是用 GET 比较好。
三、HTTP 的特点
无连接、 无状态
HTTP 的持久连接、Cookie/Session
1、HTTP 的无状态
即协议对于事务处理没有记忆能力。 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求时无直接关系的,它不会受前面 的请求应答情况直接影响,也不会直接影响后面的请求应答情况 也就是说服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
标准的 HTTP 协议指的是不包括 cookies,session,application 的 HTTP 协议
2、HTTP 的持久连接
非持久连接:每个连接处理一个请求-响应事务。
持久连接:每个连接可以处理多个请求-响应事务。
持久连接情况下,服务器发出响应后让 TCP 连接继续打开着。同一对客户/服务器之间的后续请求和响应 可以通过这个连接发送。 HTTP/1.0 使用非持久连接。HTTP/1.1 默认使用持久连接<keep-alive>。
非持久连接的每个连接,TCP 得在客户端和服务端分配 TCP 缓冲区,并维持 TCP 变量,会严重增加服务 器负担。而且每个对象都有 2 个 RTT(Round Trip Time,也就是一个数据包从发出去到回来的时间)的延迟, 由于 TCP 的拥塞控制方案,每个对象都遭受 TCP 缓启动,因为每个 TCP 连接都起始于缓启动阶段
HTTP 持久连接怎么判断一个请求是否结束的?
Content-length:根据所接收字节数是否达到 Content-length 值
chunked(分块传输):Transfer-Encoding。当选择分块传输时,响应头中可以不包含 Content-Length,服务器会先回复一个不带数据的报文(只有响应行和响应头和\r\n),然后开始 传输若干个数据块。当传输完若干个数据块后,需要再传输一个空的数据块,当客户端收到空的数据 块时,则客户端知道数据接收完毕。
四、HTTPS、对称加密、非对称加密
1、HTTPS 和 HTTP 的区别
HTTPS 协议 = HTTP 协议 + SSL/TLS 协议 SSL 的全称是 Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协 议。
TLS 的全称是 Transport Layer Security,即安全传输层协议。 即 HTTPS 是安全的 HTTP。
2、HTTPS 的连接建立流程
HTTPS 为了兼顾安全与效率,同时使用了对称加密和非对称加密。在传输的过程中会涉及到三个密钥:
客户端生成的随机密钥,用来进行对称加密
服务器端的公钥和私钥,用来进行非对称加密
1、客户端访问 HTTPS 连接。
客户端会把安全协议版本号、客户端支持的加密算法列表、随机数 C 发给服务端。
2、服务端发送证书给客户端
服务端接收密钥算法配件后,会和自己支持的加密算法列表进行比对,如果不符合,则断开连接。否则, 服务端会在该算法列表中,选择一种对称算法(如 AES)、一种公钥算法(如具有特定秘钥长度的 RSA) 和一种 MAC 算法发给客户端。 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其 泄露,公钥可以发送给任何人。 在发送加密算法的同时还会把数字证书和随机数 S 发送给客户端
3、客户端验证 server 证书
会对 server 公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么 HTTPS 传输就无法继续。
4、客户端组装会话秘钥
如果公钥合格,那么客户端会用服务器公钥来生成一个前主秘钥(Pre-Master Secret,PMS),并通过该前主秘钥和随机数 C、S 来组装成会话秘钥
5、客户端将前主秘钥加密发送给服务端
是通过服务端的公钥来对前主秘钥进行非对称加密,发送给服务端
6、服务端通过私钥解密得到前主秘钥
服务端接收到加密信息后,用私钥解密得到主秘钥。
7、服务端组装会话秘钥
服务端通过前主秘钥和随机数 C、S 来组装会话秘钥。 至此,服务端和客户端都已经知道了用于此次会话的主秘钥。
8、数据传输
客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。 同理,服务端收到客户端发送来的密文,用服务端密钥对其进行对称解密,得到客户端发送的数据。
总结:
会话秘钥 = random S + random C + 前主秘钥
HTTPS 连接建立过程使用非对称加密,而非对称加密是很耗时的一种加密方式
后续通信过程使用对称加密,减少耗时所带来的性能损耗 其中,对称加密加密的是实际的数据,非对称加密加密的是对称加密所需要的客户端的密钥。