HTTP
http全名超文本传输协议,允许客户端和服务端通信。
HTTP1.0
基于TCP、短链接,每次请求都需要关闭当前连接,下次请求时需要再次经历三次握手过程,半双工协议。不允许服务端主动给客户端发请求,只允许服务端响应客户端请求。
HTTP1.1
基于TCP、keep-alive默认为true,建立一次连接后,连接会存在一段时间,在这段时间内通信,不需要再次经历三次握手过程,即多次请求复用一个TCP连接。半双工协议。不允许服务端主动给客户端发请求,只允许服务端响应客户端请求。不应该把keep-alive看成是长链接,只有websocket才是真正意义的长链接。
keep-alive的断开
- 单个请求:请求完成后,在timeout时间内没第二个请求进来则会关闭。
- 多个请求:在一个请求响应之后,在 timeout 时间内有另一个请求进来,就会利用相同的 TCP 连接继续响应这个请求,直到没有更多请求进来,可以通过 max 字段设定最多响应的请求数。
HTTP2.0
基于SPDY协议,意为“更快”。全双工、不允许服务端主动给客户端发请求,只允许服务端响应客户端请求,但是一次客户端请求,允许服务端响应多次。
头部压缩
像HTTP1.1版本,请求头会出现很多重复的信息 ,比如 / HTTP1.1 GET、Content-Type:application-json等,可以用一个数字表示这个含义,占用更少的字符数。其他的还有比如响应头,200,用一个数字8表示。
多路复用
HTTP2.0之前,会一个文件一个文件的传输给服务端,如果前面一个文件由于服务端处理慢等原因阻塞了,后面的文件跟着阻塞。此时,keep-alive本质上是串行的。
HTTP2.0将多个文件切成一个个小文件,然后一起发送给服务端,可能第一个第三个小文件属于原文件A的,第二个小文件属于原文件B的,并且是全双工的,只要一个文件处理完成了,服务端就会马上响应。 实际上还是一个一个小文件顺序地传输,但是由于全双工和事先允许把不同的大文件切成小文件并不保证发送顺序,看起来就像多个文件并发传输给服务端。所以多路复用本质上是并行的。
误区:keep-alive传输文件,如果文件太大也会切成小文件,只是会等待一个大文件传输完成,下一个大文件才能开始被传输。
HTTP3.0
为了使得网络通信更加高效,HTTP3.0基于UDP协议,在应用中保证消息的可靠传输。
websocket
长连接,提供在HTTP协议退化成TCP协议的方式。让客户端和服务器之间保持很长时间的连接且不中断
链接过程仍然采用http协议建立连接。第三次握手时,服务端会询问客户端是否升级协议到websocket (upgrade),如果客户端同意了,后续通信过程采用websocket协议通信,此时服务端和客户端身份是对等的,允许服务端主动发送消息给客户端,适合聊天等场景。
HTTP缓存
客户端在请求服务端资源的时候,考虑到访问速度,也会有缓存策略。HTTP缓存最重要的配置项为Cache-Control HTTP 返回头。 不仅浏览器可以缓存,浏览器和服务器之间的HTTP代理服务器也可以缓存。
强制缓存
强制客户端优先使用缓存。如果不希望代理服务器等缓存自己的请求内容,需要将public改为private。
协商缓存
协商缓存的行为是基于变更协商的。在缓存条目对应的资源发生生变化前,都使用浏览器缓存。因此协商缓存必须每次都请求服务端,需要浏览器告诉客户端缓存是否有变化。
强制缓存和协商缓存的区别
- 强制缓存强制执行,强制缓存不需要再发送请求给服务端。
- 协商缓存需要发送请求给服务端验数据版本,如果有新版本的数据就需要重新下发数据,如果没有就返回304 Not Modified。
缓存淘汰策略
存满了后,每次创建新的缓存条目,就会格努LRU算法,删除时间上最早的条目。
HTTPS协议
HTTPS是在TCP协议之上,包装了SSL/TLS协议,这两个协议仍然属于传输层协议。
HTTPS协议总的来说,需要在握手阶段,使用非对称加密算法协商对称加密算法,并确定对称密钥,在之后的通信过程中,使用对称密钥加密信息。本质上是使用非对称密钥的高安全性,确立对称密钥的过程。
HTTPS依赖公认的、受用户信任的第三方机构,这些机构有自己的证书,称为根证书(嵌入到操作系统内),并且允许有下级普通的CA机构。CA机构有自己的信任链,首先给网站颁发证书的一般是普通的CA机构,CA机构有自己的证书,是经过上级机构签名的,而上级机构的证书是经过CA根机构签名的。所以在一次HTTPS请求过程中,对方会拿到请求方的证书,并做验签操作,证明对方身份是否是真实的(公钥解密的过程)。如果验签通过,则允许通信,否则浏览器会报风险。
HTTPS加密的过程还会依赖其他类型的算法,比如摘要算法,摘要算法是不可逆算法,可以判断通信内容是否被篡改。
HTTPS风险
整个HTTPS的安全性,从根本上来说是依赖根证书的可信任性。如果安装了盗版操作系统,黑客可以在操作系统内嵌入假的CA根证书,这时候到HTTPS通信就不能保证安全。
比如中间人攻击,黑客可以伪造证书,在用户和真实服务端之间,做一个中间人的角色。前提是用户的操作系统有黑客伪造的根证书,证明黑客的身份是可靠的,中间人攻击才能成立。
HTTPS协议握手阶段比HTTP多了三个过程
如果一次过程的网络延迟是30ms,那么HTTPS建立连接的过程需要180ms。
访问外部域名的一次HTTP请求过程
我们知道,一个域名实际上对应了网络上的一个ip地址,需要域名是因为好记。域名需要经过DNS服务器解析,才能得到真实的ip地址。但是,全世界网站已有21亿+,如果每次解析域名都打在少数DNS服务器上,这些DNS服务器扛不住,因此,网络实际上使用的是分级缓存策略 。
例如访问域名:www.baidu.com
- 先查询浏览器的本地缓存(通常在内存中)
- 本地没缓存,查找操作系统的hosts文件,该文件在linux 中在 /etc/hosts里
- 上述步骤没有找到,DNS会查询本地服务提供商(ISP)
- ISP没找到,请求指向Root根服务器,返回域名所在的顶级域名服务器地址(.com)
- 浏览器发送请求给顶级域名服务器,返回对应的权威域名服务器地址(顶级域名服务器下存在多级权威域名服务器)
- 浏览器发送Lookup请求给权威域名服务器,找到具体DNS记录(www.xxx.com对应的真实ip地址),返回给浏览器
|