HTTP-HTTP协议特性和使用方法(三)
目录
一、HTTP的长连接和短连接
- HTTP协议是基于请求/响应模式的,因为只要服务端给了响应,本次HTTP请求就结束了
- HTTP的长连接和短连接本质上是TCP长连接和短连接
1. 不同版本协议的差异
- HTTP1.0中,默认使用的是短连接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,结束就中断
- HTTP1.1中,默认使用长连接,用以保持连接特性
二、HTTP缓存
一般对于服务器响应的css静态文件和js、图片等不太换的文件会缓存在浏览器本地,就不需要重复的去请求,增大效率
1.HTTP缓存头部字段
- Cache-Control:请求/响应头,缓存控制字段
字段值 | 含义 |
---|---|
no-store | 所有内容都不缓存 |
no-cache | 缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新 |
max-age=x(单位:秒) | 请求缓存后的X秒不再发起请求 |
s-maxage=x(单位:秒) | 代理服务器请求源站资源缓存后的X秒不再发起请求,只对CDN缓存有效 |
public | 客户端和代理服务器(CDN)都可缓存 |
private | 只有客户端可以缓存 |
- Expires:响应头,代表资源过期时间,由服务器返回提供,是http1.0的属性,在与max-age共存的情况下,优先级要低
- Last-Modified:响应头,资源最新修改时间,由服务器告诉浏览器
- if-Modified-Since:请求头,资源最新修改时间,由浏览器告诉服务器,和Last-Modified是一对,他两会进行对比
- Etag:响应头,资源标识,由服务器告诉浏览器
- if-None-Match:请求头,缓存资源标识,由浏览器告诉服务器(其实就是上次服务器给的Etag),和Etag是一对,他两会进行对比
2.HTTP缓存工作方式
场景一:让服务器与浏览器约定一个文件过期时间-Expires
- 浏览器向服务器请求资源,服务器响应资源并设置过期时间
- 浏览器下次还请求这个资源时,会判断过期时间是否已过期
- 若未过期,则直接使用本地缓存的资源
- 若已过期,则去访问服务器资源
场景二:让服务器与浏览器在约定文件过期时间的基础上,再加一个文件最新修改时间的对比——Last-Modified与if-Modified-Since
在场景一中,服务器最开始响应了资源并且设置了时间,当过期时间过了之后,浏览器再次向服务器请求资源,而此资源并未修改,则又会造成资源浪费,那么就加了Last-Modified和if-Modified-Since一对字段,工作原理如下:
- 浏览器向服务器请求资源,服务器相应资源并设置过期时间,而且给了一个资源修改时间
- 浏览器下次还请求这个资源时,会判断过期时间是否已过期
- 若未过期,则直接使用本地缓存的资源
- 若已过期,则访问服务器,并且带上请求头中的if-Modified-Since(这个其实就是上次服务器发给浏览器的Last-Modified),服务器会将自己的Last-Modified和浏览器的if-Modified-Since进行对比
- 若服务器的Last-Modified和浏览器的if-Modified-Since不同,则服务器会查找最新的资源并返回(回到了第一步)
- 若服务器的Last-Modified和浏览器的if-Modified-Since相同,服务器就会响应304,文件未修改过,浏览器就会继续用本地缓存
三、缓存改进方案
1.md5/hash缓存
通过不缓存html,为静态文件添加MD5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题
2.CDN缓存
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度鞥功能模块,使用户就近索取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
通俗来讲,当某一个主服务器只有一台,用户所在地区离主服务器所在地区太远,访问速度太慢,那么就会让用户去访问离其较近的一个节点服务器,从而加快访问速率。
3.CDN缓存工作方式
- 浏览器第一次访问主服务器,服务器会将资源返回给浏览器,并且通知浏览器以后访问此资源直接访问节点服务器就好
- 后续浏览器访问此资源,就不会去找主服务器,而是直接访问节点服务器
四、内容协商机制
内容协商机制就是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准
1.内容协商方式
- 客户端驱动:客户端发起请求,服务器发送可选项列表,客户端作出选择后在发送第二次请求
- 服务器驱动:服务器检查客户端的请求头部集并决定提供哪个版本的页面
- 透明协商:某个中间设备(通常是缓存代理)代理客户端进行协商
2.服务器驱动-请求首部集
客户端发送的请求头
- Accept:告知服务器发送何种媒体类型
- Accept-Language:告知服务器发送何种语言
- Accept-Charset:告知服务器发送何种字符集
- Accept-Encoding:告知服务器采用何种编码
服务器响应的响应头
- Content-Type:内容类型
- Content-Language:内容语言
- Content-Encoding:内容编码格式
3.断点续传和多线程下载
HTTP是通过在Header里两个参数实现的,客户端发请求时对应的是Range,服务器响应时对应的是Content-range。
3.1 Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:(unit=first byte pos)-[last byte pos]
例如:
Range:bytes=0-499 表示0-499字节的数据
Range:bytes=500-999 表示50-999字节的数据
Range:bytes=-500 表示最后500字节的数据
Range:bytes=500- 表示从500字节开始,到最后一个字节的数据
Range:bytes=500-600,601-999 表示分成两块下载,500-600和601-999部分数据
3.2 Content-Range
用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小,一般格式:
Content-Range:bytes(unit first byte pos)-[last byte pos]/[entity length]
在响应完成后,返回的响应内容也不相同:
- 不使用断点续传:HTTP/1.1 200 OK
- 使用断点续传:HTTP/1.1 206 Partial Content
3.3 断点续传过程
- 客户端下载一个1024K的文件,已经下载了其中512K
- 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:Range:bytes=512000-,这个头通知服务器从文件的512K位置开始传输文件
- 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:Content-Range:bytes 512000/1024000,并且此时服务端返回的HTTP状态码应该是206,而不是200