为何get比post更快

引言

  get和post在面试过程当中通常都会问到,通常的区别:html

  1.post更安全(不会做为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)面试

  2.post发送的数据量更大(get有url长度限制)ajax

  3.post能发送更多的数据类型(get只能发送ASCII字符)chrome

  4.post比get慢浏览器

  

  我相信不止一我的跟我同样有这种疑惑,既然post有这么多优势,那咱们为何要使用get?甚至有个同事说,我们封装一个ajax底层,直接不用get算了……缓存

  可是,get比post更快,那究竟快多少呢?表如今哪些方面?安全

1.post请求包含更多的请求头

  由于post须要在请求的body部分包含数据,因此会多了几个数据描述部分的首部字段(如content-type),这实际上是微乎其微的服务器

2.最重要的一条,post在真正接受数据以前会先将请求头发送给服务器进行确认,而后才真正发送数据并发

  post请求的过程:
tcp

  1.浏览器请求tcp链接(第一次握手)

  2.服务器答应进行tcp链接(第二次握手)

  3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,因此http会在此时进行第一次数据发送

  4.服务器返回100 continue响应

  5.浏览器开始发送数据

  6.服务器返回200 ok响应

 

  get请求的过程

    1.浏览器请求tcp链接(第一次握手)

  2.服务器答应进行tcp链接(第二次握手)

  3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,因此http会在此时进行第一次数据发送)

  4.服务器返回200 ok响应

 

  也就是说,目测get的总耗是post的2/3左右

  口说无凭,已经有网友进行测试了

  寻根究底:Ajax请求的GET与POST方式比较

3.get会将数据缓存起来,而post不会

  能够作个简短的测试,使用ajax采用get方式请求静态数据(好比html页面,图片)的时候,若是两次传输的数据相同,第二次之后耗费的时间将在10ms之内(chrome测试),而post每次耗费的时间都差很少……

  经测试,chrome下和firefox下若是检测到get请求的是静态资源,则会缓存,若是是数据,则不缓存,可是IE这个傻X啥都会缓存起来

  固然,应该没人会用post去获取静态数据吧,反正我是没看到过。

4.post不能进行管道化传输

  http权威指南中是这样说的:

  http在的一次会话须要先创建tcp链接(大部分是tcp,可是其余安全协议也是能够的),而后才能通讯,若是每次链接都只进行一次http会话,那这个链接过程占的比例太大了!

  因而出现了持久链接:在http/1.0+中是connection首部中添加keep-alive值,在http/1.1中是在connection首部中添加persistent值,固然二者不只仅是命名上的差异,http/1.1中,持久链接是默认的,除非显示在connection中添加close,不然持久链接不会关闭,而http/1.0+中则刚好相反,除非显示在connection首部中添加keep-alive,不然在接收数据包后链接就断开了。

  出现了持久链接还不够,在http/1.1中,还有一种称为管道通讯的方式进行速度优化:把须要发送到服务器上的全部请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去,可是这样的方式有一个问题:不安全,若是一个管道中有10个链接,在发送出9个后,忽然服务器告诉你,链接关闭了,此时客户端即便收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求须要从新发送。这对于幂等请求还好(好比get,多发送几回都不要紧,每次都是相同的结果),若是是post这样的非幂等请求(好比支付的时候,多发送几回就惨了),确定是行不通的。

  因此,post请求不能经过管道的方式进行通讯!

  颇有可能,post请求须要从新创建链接,这个过程不跟彻底没优化的时候同样了么?

  因此,在可使用get请求通讯的时候,不要使用post请求,这样用户体验会更好,固然,若是有安全性要求的话,post会更好。

  管道化传输在浏览器端的实现还需考证,貌似默认状况下大部分浏览器(除了opera)是不进行管道化传输的,除非手动开启!!

 :

相关文章
相关标签/搜索