HTTP协议中的编码和解码
字符集与编码
编码和解码的方式不一致,就会产生乱码。
URL的编码与解码
URL是采用ASCII字符集进行编码的,所以如果URL中含有非ASCII字符集中的字符,要对其进行编码。
URL中一些保留字符,如 "&" 表示参数分隔符,如果想要在URL中使用这些保留字,那就需要编码。
“%编码”规范:对 URL 中属于 ASCII 字符集的非保留字不做编码;对URL中的保留字需要取其ASCII内码,然后加上“%”前缀将该字符进行编码;对于URL中的非ASCII字符需要取其Unicode内码,然后加上"%"前缀将该字符进行编码。
HTTP协议的基本认证
身份认证信息:
密码
动态令牌
数字证书
生物认证
IC卡等
常见认证方式
BASIC认证 (基本认证)
DIGEST认证 (摘要认证)
SSL 客户端认证
FromBase认证 (基于表单认证)
BASIC认证
DIGEST认证
为弥补BASIC认证存在的弱点,从 HTTP/1.1 起就有了 DIGEST 认证。
DIGEST认证同样使用 质询/响应 的方式,但不会像 BASIC 认证那样直接发送明文密码。
SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登陆的客户端。
基于表单的认证
基于表单的认证方法并不是在HTTP协议中定义的。
使用由Web应用程序各自实现基于表单的认证方式。
通过Cookie和Session的方式来保持用户的状态。
HTTP的长连接与短连接
HTTP 协议是基于 请求/响应 模式的,因此只要服务端给了响应,本次 HTTP 请求就结束了。
HTTP 的长连接和短连接本质上是TCP长连接和短连接。
HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,结束就中断。
HTTP/1.1 起,默认使用长连接,用以保持连接特性。
短连接:建立连接 - 数据传输 - 关闭连接 ... 建立连接 - 数据传输 - 关闭连接
长连接:建立连接 - 数据传输 ... (保持连接) ... 数据传输 - 关闭连接
HTTP 中介之代理
代理的作用
抓包
拦截服务器
匿名访问
过滤器
HTTP 中介之网关
网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。
网关扮演的是 “协议转换器” 的角色。
/
Web 网关在一侧使用 HTTP 协议,在另一侧使用另一种协议。
<客户端协议> / <服务端器协议>
(HTTP/) 服务器端网关:通过 HTTP协议与客户端对话,通过其他协议与服务器通信。
(/HTTP) 客户端网关:通过其他协议与客户端对话,通过HTTP协议与服务器通信。
常见的网关类型
(HTTP/*) 服务器端 Web 网关
(HTTP/HTTPS) 服务器端安全网关
(HTTPS/HTTP) 客户端安全加速器网关
资源网关
HTTP缓存
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是一对,它两会进行对比。
HTTP 缓存工作方式
场景一:让服务器与浏览器约定一个文件过期时间 --- Expires
场景二:让服务器与浏览器在约定文件过期时间时间的基础上,再加一个文件最新修改时间的对比 --- Last-Modified 与 if-Modified-Since
场景三:让服务器与浏览器在过期时间 Expires + Last-Modified 的基础上,增加一个文件内容唯一对比标记 --- Etag 与 If-None-Match。Expires不稳定,再加入一个 max-age 来加以代替。
缓存改进方案
md5/hash 缓存
通过不缓存 html, 为静态文件添加 MD5 或者 hash 标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题。
CDN 缓存
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
内容协商机制
指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准。
内容协商方式
客户端驱动
客户端发起请求,服务器发送可选项列表,客户端做出选择后再发送第二次请求。
服务器驱动
服务器检查客户端的请求头部集并决定提供哪个版本的页面。
透明协商
某个中间设备(通常是缓存代理)代表客户端进行协商。
服务器驱动内容协商 - 请求首部集
Accept:告知服务器发送何种媒体类型。
Accept-Language:告知服务器发送何种语言。
Accept-Charset:告知服务器发送何种字符集。
Accept-Encoding:告知服务器采用何种编码。
服务器驱动内容协商 - 近似匹配
Accept-Language:en;q=0.5,fr;q=0.0,nl;q=1.0,tr;q=0.0
断点续传和多线程下载
HTTP是通过在 Header 里两个参数实现的,客户端发请求时对应的是Range,服务器端响应时,对应的是Content-Range。
Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置。
一般格式:Range:(unit=first byte pos)-[last byte pos]
Range:bytes=0-499
Range:bytes=500-999
Range:bytes=-500 // 最后500字节的内容
Range:bytes=500- // 从第500个字节的内容一直到最后的内容
Range:bytes=500-600,601-999
Content-Range
而在响应完成后,返回的响应头内容也不同:
HTTP/1.1 200 OK (不使用断点续传方式)
HTTP/1.1 206 Partial Content (使用断点续传方式)
断点续传过程
1.客户端下载一个1024K的文件,已经下载了其中512K。
2.网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:Range:bytes=512000- 。这个头通知服务端从文件的512K位置开始传输文件。
3.服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:Content-Range:bytes 512000-/1024000 。并且此时服务端返回的HTTP状态码应该是206,而不是200。
1