序:看完《图解HTTP》对 HTTP 的用法又有了新的认识,这本书讲的比较简单但是比较全面,本篇读书笔记把在看本书过程中感觉需要记录的点加以扩充罗列一下。
一、URI 和 URL
在大学的时候就经常提到这两个概念,后来工作中跟同事交流也是把这两个概念混着用,所以要明确的区分下。
1、URI,uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
2、URL,uniform resource locator,统一资源定位器,URL可以用来标识一个资源,而且还指明了如何locate这个资源,比如 http://www.baidu.com。
3、URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
一句话:URL和URN都是一种URI。URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。
二、HTTP常用方法
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
三、首部配置
1、持久化连接KeepAlive
非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个TCP连接,完成 之后立即断开连接;当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的TCP连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
http 1.0中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入”Connection: close “,才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。
2、KeepAlive与 http2.0多路复用的区别
KeepAlive 是一条TCP链路串行复用,http2.0 是真正的一条链路并行复用。
KeepAlive为什么不在一个socket上连续发送多个request。原因是因为HTTP1.1 及更低版本的协议,并没有一个字段用来区分一个response是归属于哪一个request的。但HTTP 2 就有这个字段了。因此在HTTP1.1 及更低版本,你只能在发送一个request之后,等待response的到来。
https://www.zhihu.com/question/26515427
3、压缩
1、Accept-Encoding 头告诉 Web 服务器它接收用 gzip 压缩的输出。
2、Content-Encoding 通常用于对实体内容进行压缩编码,目的是优化传输,例如用 gzip 压缩文本文件,能大幅减小体积。当服务器发送回生成的内容时,Content-Encoding 头向浏览器说明压缩内容所用的格式。发送Request时,也可以对其进行压缩Content-Encoding 头向服务器说明压缩内容所用的格式。
3、Transfer-Encoding 则是用来改变报文格式,它不但不会减少实体内容传输大小,甚至还会使传输变大,最新的 HTTP 规范里,只定义了一种编码传输:分块编码(chunked)。
分块编码相当简单,在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,报文中的实体需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行。
4、Content-Encoding 和 Transfer-Encoding 二者是相辅相成的,对于一个 HTTP 报文,很可能同时进行了内容编码和传输编码,Content-Encoding是对传输的内容进行编码,Transfer-Encoding是规定了内容传输的格式。
https://imququ.com/post/transfer-encoding-header-in-http.html
http://www.cnblogs.com/TankXiao/archive/2012/11/13/2749055.html#encodingType
四、HTTPS
1、通讯数据加密
客户端和服务端先使用非对称加密算法传递一个对称加密算法的密钥。之后的通信使用改密钥加密解密。
2、身份验证:
通过ssl pinning来验证服务器的身份,防止中间人攻击。ssl pinning也可以绕过,为了避免绕过,可以在对请求做 apk 签名验证, apk 签名验证可以参考AndroidUltimateEncrypt的思路。
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.wtoutiao.com/p/h9bca6.html
四、WEB 服务中的 CGI
通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
五、 HTTP2.0
1、HTTP瓶颈
一条 TCP 连接同一时刻只能发送一个请求
服务端不能向客户端发请求
首部不压缩
2、Ajax
局部 Web页面请求,提高效率
3、Comet
http 长连接,服务器收到请求后先 hold 住,等有内容返回时再返回给客户端
4、SPDY
没有直接修改 HTTP 介于 TCP(SSL) 和 HTTP 层之间。
多路复用、压缩头部、推送功能
5、WebSocket
新的一套协议,但是在一开始建立连接时使用的还是 HTTP
实现推送功能
6、HTTP2.0
目前 HTTP2.0的讨论基于一下技术,实现 多路复用、流量控制、推送。
SPDY
HTTP Speed + Mobility(基于 SPDY、WebSocket)
Network-friendly HTTP Upgrade