最近由于看http的请求报文,在报文的请求行里面,有协议版本一说,所以就大致了解了一下http的协议版本,下面就记录一下我学习到的知识.
1.HTTP是无连接无状态协议
HTTP无连接很好理解,其实就是短连接,下面也会说到短连接
HTTP无状态协议是指协议本身对于事务处理没有任何记忆能力。
个人觉得,其实HTTP无状态的设计目的,其实很像一句矫情的话 -- “懂得越多,活得越不快乐。”
人脑储存的东西越少其实活得越轻松。
HTTP使用这种协议的本质其实就是减轻服务端的负担,无需储存请求间的状态使服务器端可以很快释放资源并简化实现,同时也增加了公正性,
就是无论请求方式什么身份,服务器都只会根据URL请求从而返回响应的内容。(我卖的商品不会因为你是我亲戚我就打折)
所以服务器只活在当前,不会记录上一次请求它做了什么,因此不同的请求之间其实是没有任何关联的。
只不过后来发现这样其实对于用户操作来说非常繁琐,比如登录状态,HTTP是肯定不会记录的,没发起一次新的请求,都必须得重新输入登录信息并且重新验证。
也正是这样,人们发现网络请求需要一套技术去管理状态,因此也有了会话技术(Cookie&Session),但是这个技术并不是HTTP协议本身拥有的,所以HTTP协议本身就是无状态的。
2.HTTP协议目前有三个主要版本,HTTP1.0 , HTTP1.1 , HTTP2.0
(1)HTTP1.0
这个版本是相对较早的版本了,所以请求方式只有GET、POST、HEAD这三种。
而且在性能方面,HTTP1.0版本是默认不使用长连接的,所以多数的TCP连接都是短连接,这样浏览器在解析HTML文件时,每次遇
到需要加加载的资源,就会重新与服务器建立一个连接,大大的增加了性能的消耗,不过可以通过设置Connection: keep-alive 使用长连接模式。
下面还有一些性能方面的问题,是copy过来的,还没理解清楚
我们都知道在三次握手建立TCP连接的过程中,通信双方会在SYN报文段(前两次握手)中“选项”字段的MSS(最大报文段长度)值来协商数据传输最大传输数据大小。
HTTP请求是封装在TCP报文段中进行传输的,但是如果客户端发送的HTTP请求报文的长度大于MSS时,缓慢的建立使每一个TCP连接增加了额外的时延。
当服务器发送完对客户端的响应报文后,服务器会发送FIN报文,结束TCP连接。
也就是说HTTP协议中,由服务器端发起释放TCP连接的报文。那么服务器所在的主机会产生TIME_WAIT时延,在一台繁忙的服务器上很多控制块处于这种状态。
(2)HTTP1.1
HTTP1.1协议是目前使用最多最普遍的HTTP协议,它新增了许多请求方式:PUT、DELETE、OPTIONS、CONNECT、TRACE,同时默认使用长连接
长连接的实现
在HTTP1.1请求头中新加入了一个字段Connection。例如,当一个HTTP请求头中Connection字段值为Keep-Alive时(Connection: Keep-Alive),
用来告诉服务器对这个请求返回后客户端与服务器端继续保持TCP连接。如果HTTP请求头中Connection字段值为Close时(Connection: Close),
用来告诉服务器对这个请求返回后断开客户端与服务器端继续保持TCP连接。
而且HTTP1.1支持只发送header信息,这样做的好处是
100-continue响应码
100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用只含header的request试探一下server,
看server是否允许接收这个request,再决定要不要发request body。
客户端的request的header中有"Expect: 100-continue"字段,server看到这request后返回响应报文。
如果客户端收到100响应码的响应报文,客户端发送完整request。
服务器可以在header信息中,判断客户端是否有权限请求服务器,若有权限,服务器会返回100(继续请求码),客户端才会继续把body发送给服务器。
若没有权限,则服务器会返回401(未授权),客户端就可以不用发送请求body了,节约了带宽。
host
http1.1协议要求必须加上host,如果没有Host头域会报告一个错误(400 Bad Request)
我们浏览器的url可以是一个IP,也可以是一个域名网址
一个IP地址可以对应多个域名: 一台虚拟主机(服务器)只有一个ip,上面可以放成千上万个网站。
当对这些网站的请求到来时,服务器根据Host这一行中的值来确定本次请求的是哪个具体的网站
IP地址与域名的关系
IP地址如202.108.22.5就相当于现实生活中的通信地址,在网络中所有通信的实质其实都是全凭这个地址来达到目的。
但是这种IP地址都是由数字组成的,不方便人们记忆,所以定义域名来解决IP地址的麻烦性,如访问百度只需敲入www.baidu.com就行了,
而不用费力地写出202.108.22.5
但是电脑并不知道www.baidu.com 就等于202.108.22.5,他们之间有对应关系。
这种IP地址和域名的对应数据放在公网的服务器里,叫DNS服务器。电脑访问网络时,会首先到这个服务器里,根据域名找到对应的IP地址,
然后才真正去往目的地,不过这个过程很快的,根本感觉不到罢了。这个过程,叫IP地址解析。
DNS服务器:负责将域名解析成为IP地址的服务器,叫做域名解析服务器,英文简称就是DNS。
(3)HTTP2.0
HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提升了 web 性能。
因为网络通信会产生线头阻塞(Head of line blocking),所以人们后来使用了Pipelining想解决阻塞问题,但是Pipelining不能完全做到这一点,Pipelining能做到的是,不需要等待服务器处理完上个请求即可再发送请求,但实际上依然是在同一个TCP连接队列中,请求的顺序是不会变的,响应的顺序也不会变,因为客户端接收响应的顺序跟按照发送请求的顺序是一直的,并没有解决多个请求的异步处理。
就好比,跟去超市买东西后需要排队付款一样,超市的收银通道就是一个TCP连接,顾客就是一个客户端,服务器就是收银员。
当然,超市付款有多个收银通道,所以可以有多个TCP队列,但是多个收银通道就代表多份成本,TCP也是一样的,新开TCP连接的开销非常大。
这也是为什么多数浏览器会默认关闭 Pipelining.
1.多路复用 (Multiplexing)
多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。
对性能优化有了解过的都知道,浏览器的请求在同一时间同一域名是有限制的,所以在多个静态资源同时下载的时候,会有一些静态资源进入等待状态,所以一般我们会用有多个静态资源 CDN 域名去处理静态资源的请求,目的就是变相的解决浏览器针对同一域名的请求限制阻塞问题,以达到性能的优化
HTTP2.0允许同时通过单一的 连接发起多重的请求-响应消息。
其实就是HTTP2.0允许浏览器同时发出多个并行的请求,比如有两个CSS文件需要下载,可以同时发出两个并行的下载请求,并且得到两个并行的相应。这种方法也叫双向交换。
2.二进制分帧
查找的资料,二进制分帧就是对HTTP1.X的Header信息与body信息分别用二级制帧的方式封装成两块。
HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。
还涉及到了TCP的调谐,也就是TCP的慢启动。意思大概就是TCP的连接传输速度首先是慢速的,只有连接成功之后,TCP才会慢慢提高传输速度。但是由于HTTP的连接多数是短时性和突发性的,所以TCP的了这种调谐机制就会让连接变得十分低效。
而HTTP2.0共享一个连接,就有效的解决了TCP的慢启动机制。
这个我不是太懂。
3.首部压缩(Header Compression)
这个我太懂,所以不清楚对前端有何影响,暂时不记录。
4.服务端推送(Server Push)
查了下资料,好像挺厉害的,就是客户端通过一个地址向服务端发送响应,服务端响应请求,并且可以主动将HTML需要的相关资源推送给客户端,因为服务器知道客户端可能需要这些资源,还有个很重要的是,服务端推送可以缓存,这样就可以在同源的情况下,让不同页面共享信息。
另外复制了HTTPS的相关内容
HTTPS
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS(HTTPS = HTTP + SSL)。
1、https协议需要申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
3、http和https端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTPS的缺点
虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:
(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。