课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
http协议与缓存技术是程序员在学习计算机网络的时候需要重点掌握的两个编程概念,而本文我们就通过案例分析来简单了解一下,入门计算机网络基础知识分享。
一、HTTP/HTTPS协议
什么是HTTP协议
HTTP是超文本传输协议,也就是HyperTextTransferProtocol。
HTTP的名字「超文本协议传输」,它可以拆成三个部分:
超文本
传输
协议
GET和POST
GET用于获取资源,而POST用于传输实体主体。
get是获取数据,post是修改数据
get把请求的数据放在url上,以?分割URL和传输数据,参数之间以&相连,所以get不太安全。而post把数据放在HTTP的包体内(requestbody相对安全)
get提交的数据大是2k(限制实际上取决于浏览器),post理论上没有限制。
GET产生一个TCP数据包,浏览器会把httpheader和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,浏览器先发送header,服务器响应100continue,浏览器再发送data,服务器响应200ok(返回数据)。
GET请求会被浏览器主动缓存,而POST不会,除非手动设置。
本质区别:GET是幂等的,而POST不是幂等的
这里的幂等性:幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。
正因为它们有这样的区别,所以不应该且不能用get请求做数据的增删改这些有副作用的操作。因为get请求是幂等的,在网络不好的隧道中会尝试重试。如果用get请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用(浏览器和操作系统并不知道你会用get请求去做增操作)。
二、HTTP缓存技术
对于一些具有重复性的HTTP请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话HTTP/1.1的性能肯定肉眼可见的提升。
所以,避免发送HTTP请求的方法就是通过缓存技术,HTTP缓存有两种实现方式,分别是强制缓存和协商缓存。
强制缓存
强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。
强缓存是利用下面这两个HTTP响应头部(ResponseHeader)字段实现的,它们都用来表示资源在客户端缓存的有效期:
Cache-Control,是一个相对时间;
Expires,是一个绝对时间;
如果HTTP响应头部同时有Cache-Control和Expires字段的话,Cache-Control的优先级高于Expires。
Cache-control选项更多一些,设置更加精细,所以建议使用Cache-Control来实现强缓存。具体的实现流程如下:
当浏览器一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response头部加上Cache-Control,Cache-Control中设置了过期时间大小;
浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
服务器再次收到请求后,会再次更新Response头部的Cache-Control。
协商缓存
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
协商缓存可以基于两种头部来实现。
一种:请求头部中的If-Modified-Since字段与响应头部中的Last-Modified字段实现,这两个字段的意思是:
响应头部中的Last-Modified:标示这个响应资源的后修改时间;
请求头部中的If-Modified-Since:当资源过期了,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间,服务器收到请求后发现有If-Modified-Since则与被请求资源的后修改时间进行对比(Last-Modified),如果后修改时间较新(大),说明资源又被改过,则返回新资源,HTTP200OK;如果后修改时间较旧(小),说明资源无新修改,响应HTTP304走缓存。
二种:请求头部中的If-None-Match字段与响应头部中的ETag字段,这两个字段的意思是:
响应头部中Etag:标识响应资源;
请求头部中的If-None-Match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值。服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。
一种实现方式是基于时间实现的,二种实现方式是基于一个标识实现的,相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。
当使用ETag字段实现的协商缓存的过程:
当浏览器一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response头部加上ETag标识,这个标识的值是根据当前请求的资源生成的;
当浏览器再次请求访问服务器中的该资源时,先会先检查强制缓存是否过期:
如果没有过期,则直接使用本地缓存;
如果缓存过期了,会在Request头部加上If-None-Match字段,该字段的值就是ETag标识;
服务器再次收到请求后,
会根据请求中的If-None-Match值与当前请求的资源生成的标识进行比较:
如果值相等,则返回304NotModified,不会返回资源;
如果不相等,则返回200状态码和返回资源,并在Response头部加上新的ETag标识;
如果浏览器收到304的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。