揭开HTTP网络协议神秘面纱系列(一)

1.了解Web及网络基础

TCP/IP协议族按层次可以分为下面四层:

应用层:决定了向用户提供应用服务时通信的活动,TCP/IP协议族内预存了各类通用的应用服务,比如:FTP(文件传输协议)和DNS(域名系统)服务就是其中两类,HTTP协议也处于该层。

传输层:对上层应用,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)

网络层:用来处理在网络上流动的数据包,数据包是网络的传输最小数据单位,该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

链路层:用来处理连接网络的硬件部分,包括控制操作系统,硬件的设备驱动,NIC,及光纤等物理可见部分(还包括连接器等一切传输媒介),硬件上的范畴均在链路层的作用范围之内。

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接收端则往应用层往上走,就拿发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTPP请求为例,如下图示:

这里写图片描述

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息,反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去,这种把数据信息包装起来的做法称为封装。

负责传输的IP协议:作用是把各种数据包传送给对方,其指明了节点被分配到的地址,而MAC地址是指网卡所属的固定地址,IP间的通信依赖MAC地址,在网络上,通信的双方在同一局域网内的情况较少,通常是经过多台计算机和网络设备中转才能连接到对方,在中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标,这时,会采用ARP协议(ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址)。例子如图:

这里写图片描述

TCP协议为了准确无误的将数据送达目标处,TCP协议采用了三次握手策略,其握手过程中用了三个标记:FLAG-SYN和ACK,该过程如图:

这里写图片描述

注意:若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。*

DNS服务是和HTTP协议一样位于应用层的协议,它提供域名到IP地址之间的解析服务其两者关系如图:

这里写图片描述

各种协议与HTTP协议的关系就如图所示:

这里写图片描述

URI用字符标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置),故URL是URI的子集。

URI格式通常包括以下几个:

登陆信息

服务器地址(IP或域名)

服务器端口号

带层次的文件路径

查询字符串

片段标识

URI格式例子如图:

这里写图片描述

黑色:协议方案名

红色:登陆信息(认证)

浅绿色:服务器地址

浅蓝色:服务器端口号

紫色:带层次的文件路径

深蓝色:查询字符串

深绿色:片段标识符

2.简单的HTTP协议

请求报文:是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成的。

响应报文:基本上由协议版本,状态码(表示请求成功或失败的数字代码),用以解释状态码的原因短语,可选的响应首部字段以及实体主体构成。

这里写图片描述

这里写图片描述

HTTP是一种不保存状态的协议,即不保留之前一切的请求或响应报文的信息,为了解决这问题,许多网站引入了Cookie技术,例如:许多登陆网站就是用Cookie技术来保持登陆状态。

告知服务器意图的HTTP方法有以下几个:

– GET:获取资源,如果请求的资源是文本,那就保持原样返回,如果是像CGI那样的程序,则返回经过执行后的输出结果。

– POST:主要用来传输实体的主体,而不是获取响应的主体内容。

– PUT:传输文件,要求请求报文中包含文件内容,但是HTTP/1.1PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,故一般有开发此功能的Web网站都会配合Web应用程序的验证机制,如:REST机制。

HEAD:不获取返回报文主体部分,而是获取其URI的有效性及资源更新的日期时间等首部字段。

DELETE:用来删除文件,但是HTTP/1.1Delete方法自身也不带验证机制,任何人都可以删除文件,存在安全性问题,故一般有开发此功能的Web网站都会配合Web应用程序的验证机制,如:REST机制。

OPTIONS:用来查询针对请求URI指定的资源。

TRACE:在用其发送请求时,在Max-Forwards首部字段中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200OK的响应,因此可以查询发送出去的请求是怎样被加工修改的。

CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL和TLS协议把通信内容加密后经网络隧道传输。

HTTP持久连接:keep-alive(持久连接)的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态,好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载,也减少了开销的那部分时间,是HTTP请求和响应能够更早的结束。

这里写图片描述

管管线化技术可以让客户端同时并行发送多个请求,而不需要一个接一个地等待响应。

HTTP是无状态协议优势在于它减少服务器的CPU及内存资源的消耗,但它不能保持之前的状态进行请求处理,这样需要在登陆认证的Web页面中那个,每次请求 跳转页面都需要再次认证登陆或附上请求认证参数,因此为了解决这个问题,可以引用Cookie技术,该过程如图:

这里写图片描述

这里写图片描述

HTTP报文内的HTTP信息

HTTP协议交互的信息被称为HTTP报文,请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。

这里写图片描述

HTTP为了提升传输速率,其在传输数据时,按照数据原样进行压缩传输,相应地客户端会接受并解析内容编码后的实体。

在HTTP通信过程中,可以让大容量的数据进行分块分割传输,这方式能够让浏览器逐步显示页面。

HTTP采纳了多部分对象集合,故发送的一份报文主体内可含有多类型实体,不过需要在首部字段里加Content-type,并使用boundary字符串来划分多部分对象集合指明的各类实体,boundary字符串指定的各个实体的起始之前插入”–”标记,而在多部分对象集合对应的字符串的最后插入”–”标记作为结束,示例:

这里写图片描述

HTTP可以在请求首部那里指定范围来获取指定的内容。

Range:byte=5001-10000,获取从5001到10000这段字节。

Range:byte=5001,获取从5001之后全部的字节。

Range:byte=-3000,5000-7000,获取从0到3000这段字节,获取从5000到7000这段字节

返回结果的HTTP状态码

这里写图片描述

以下会列出常见的几个HTTP状态码:

200表示正常处理请求,并成功返回正常的数据。

204表示正常处理请求,但没有资源可返回。

206表示正常处理请求,并返回请求那部分的资源数据。

301永久性的给请求资源分配了新的URI,故以后使用该资源需要现在所指的新URI。

302临时性的给请求资源分配了新的URI,这只是通知这次请求使用该新URI。

303明确通知请求采用GET方法且用该资源另一个URI发送。

304表示客户端发送附带条件的请求时(附带条件指的是If-Match,If-Modified-Since等),服务器允许请求访问资源,但未满足条件的请况。

307与302类似,是临时重定向。

400表示请求报文中存在语法错误。

401表示发送的请求需要有通过HTTP认证的认证信息,如果之前已进行过一次请求,则表示用户认证失败。

403表示请求资源的访问被服务器拒绝了(一般都是权限问题)。

404表示服务器上无法找到请求的资源。

500表示服务器端在执行请求时发生了错误。

503表示服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。

与HTTP协作的Web服务器

HTTP允许一台HTTP服务器搭建多个Web站点,例如在相同的IP地址下,可以用虚拟主机寄存多个不同主机名和域名的Web网站,这样一台服务器可以托管www.tricorder.jp和www.hackrj.jp两个域名。

代理:代理是一种具有转发功能的应用程序,它能接受客户端的请求后转发给服务器,同样能接受服务器返回的响应转发给客户端,代理可以分为下面两类:

缓存代理:代理转发响应时,会预先将资源的副本保存在代理服务器上。

透明代理:转发请求或响应时,不对报文做任何加工。

这里写图片描述

网关:是转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理,网关能是通信线路上的服务器提供非HTTP协议服务。

这里写图片描述

隧道:是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序,这过程可以使用SSL等手段进行加密。

这里写图片描述

缓存一般有两种方式:客户端缓存和代理服务器缓存,客户端一般缓存在本地磁盘中,代理服务器一般缓存在本地服务器存储空间中,不过这两种缓存会根据有效期限,请求要求,服务器该资源更新等情况来判断缓存是否失效,一旦缓存失效,再次请求则会重新拉取源服务器的该资源并对其缓存。

 

HTTP首部字段有四种类型:通用首部字段,请求首部字段,响应首部字段,实体首部字段。

通用首部字段:

首部字段 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段:

首部字段 说明
Accept 用户代理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户的电子邮件
Host 请求资源所在服务器
if-Match 比较实体标记(ETag)
if-Modified-Since 比较资源的更新时间
if-None-Match 比较实体标记(与if-Match相反)
if-Range 资源未更新时发送实体Byte的范围请求
if-Unmodified-Since 比较资源的更新时间(与if-Modified-Since想法)
Max-Forwards 最大传输逐跳
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Refer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP客户端的信息

响应首部字段:

首部字段 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息

实体首部字段:

首部字段 说明
Allow 资源可支持的HTTP方法
Content-Encod 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小
Content-Location 替代对饮资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

HTTP首部字段将定义成缓存代理和非缓存代理两种类型:

端到端(End-to-end Header):此类中的首部字段会转发给请求/响应对应的最终接受目标,且必须在由缓存生成的响应中,另外规定它必须被转发。

逐跳首部(Hop-by-hop Header):此类中的首部只对单次转发有效,会因通过缓存或代理而不再转发。如:Connection,Keep-Alive,Upgrade,Proxy-Authenticate,Proxy-Authorization等。

当有多个指令参数时,多个指令之间可通过”,”分隔,例如首部字段Cache-Control:

Cache-Control: private,max-age=0,no-cache

Cache-Control指令一览:

缓存请求指令:

指令 参数 说明
no-cache 强制向源服务器再次验证
no-store 不缓存请求或响应的任何内容
max-age=[秒] 必需 响应的最大Age值
max-stale=[秒] 可省略 接受已过的响应
min-fresh=[秒] 必需 期望在指定时间内的响应仍有效
no-transform 代理不可更改媒体类型
only-if-cache 从缓存获取资源
cache-extension 新指令标记

缓存响应指令:

指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
msut-revalidate 可缓存但必须再向源服务器进行确认
proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
max-age=[秒] 必需 响应的最大Age值
s-maxage=[秒] 必需 公共缓存服务器响应的最大Age值
cache-extension 新指令标记[token]

Connection首部字段有两个作用:

控制不再转发给代理的首部字段,如:Connection:不再转发的首部字段名.

管理持久化连接,HTTP/1.1默认是持久连接,如果想断开连接,可以用Connection: Close.

这里写图片描述

首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议,不过产生对象仅限于客户端和邻接服务器之间。

首部字段Warning来告知用户一些与缓存相关的问题的警告,其格式:Warning:[警告码][警告的主机:端口号][警告内容]([日期时间])。

警告码:

警告码 警告内容 说明
110 Response is stale(响应已过期) 代理返回已过期的资源
111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation(断开连接操作) 代理与互联网连接被故意切断
113 Heuristic expiration(试探性过期) 响应的使用其超过24小时(有效缓存的设定时间大于24小时的情况下)
199 Miscellaneous warning(杂项警告) 任意的警告内容
214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning(持久杂项警告) 任意的警告内容

首部字段Accept可以指定媒体类型以及优先级,如:Accept: text/html;q=0.9,text/css;q=0.3.

常见几种媒体类型:

文件文本:

text/html,text/plain,text/css,application/xhtml+xml,application/xml…

图片文件:

image/jpeg,image/gif,image/png…

视频文件:

video/mpeg,video/quicktime…

应用程序使用的二进制文件:

application/octet-stream,application/zip…

若想要给Accept开头的首部字段的参数增加优先级,可以使用q=来额外表示,用分号(;)进行分隔,权重值q的范围是0~1,默认权重为1,权重越大就越优先。

If-Match首部字段它会告知服务器匹配资源所用的实体标记ETag值,只有两者一致才会执行请求,而ETag值会随服务器资源更新而更新。

If-Modified-Since首部字段指定的日期时间之后,如果请求的资源有更新则接受请求,没有则返回304状态码。

If-None-Match首部字段指定的标记值若与请求资源的ETag值不一致时,服务器就接受请求。

If-Range首部字段指定的值若是跟ETag值一致时,那么就根据范围返回请求资源,否则返回全体请求资源(这相当于指定范围无效)。

If-Unmodified-Since首部字段告知请求资源在其字段指定的值时间之后,为发生更新的情况下,才能处理请求。

Referer首部字段会告知服务器请求的原始资源的URI,其实就是从某个网站向服务器资源请求的URI,比如:你在百度URIwww.baidu.com点击链接http://blog.csdn.net/xuguoli_beyondboy跳转到这个页面,那么Referer首部字段就是指定这个www.baidu.comURI。

Age首部字段告知客户端,源服务器在多久前创建了响应,单位为秒,但若创建该响应的服务器是缓存服务器,Age就是指缓存后的响应再次发起认证到认证完成的时间值。

Retry-After首部字段会告知客户端应该在多久之后再次发送请求。

Vary首部字段:从代理服务器接收到源服务器返回包含Vary指定项的响应之后,仅对请求中含有相同Vary指定首部字段的请求返回缓存,否则代理服务器需先从源服务器端获取资源后才能作为响应返回(即使对相同资源发起请求)。

这里写图片描述

首部字段WWW-Authenticate用于HTTP访问认证,它会告知客户端适用于访问请求URI所指定资源的认证方案(Basic或Digest)和带参数提示的质询。

Content-Loaction首部字段表示的是报文主体返回资源对应的URI。

Content-MD5首部字段在于检查报文主体在传输过程中是否保持完整,以及确认传输到达,其过程如下:

服务器对报文主体执行MD5算法获得的128位二进制数,再通过Base64编码后将结果写入Content-MD5字段值,为确保报文的有效性,客户端对报文主体再执行一次相同的MD5算法,计算出的值与Content-MD5首部字段的值相比较,即可判断出报文主体的准确性。

Expires首部字段:如果请求还在Expires字段值指定的时间之前,则会返回缓存的该资源,当超过其时间之后,发送来的请求将会转向源服务器请求资源。

Cookie首部字段:

首部字段 说明 首部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应首部字段
Cookie 服务器接收到的Cookie信息 请求首部字段

Set-Cookie字段属性:

属性 说明
NAME=VALUE 赋予Cookie的名称和值(必需项 )
expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录为Cookie的使用对象(若不指定则默认为文档所在的文件目录)
domain=域名 作为Cookie使用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问

X-Frame-Options首部字段用于控制网站内容在其他Web网站的Frame标签内的显示问题,不过目的主要是为了防止点击劫持攻击,其两个属性:

DENT:拒绝

SAMEORIGN:仅同源域名下的页面匹配时许可,比如:当指定http:/hackr.jp/sample.html页面为SAMEORIGN时,那么hackr .jp上所有的页面的frame都被许可加载该页面,而example.com等其他域名的页面就不行了。

X-XSS-Protection首部字段是针对跨站脚本攻击的一种对策,用于控制浏览器XSS防护机制的开关,属性值如下:

0:将XSS过滤设置成无效状态。

1:将XSS过滤设置成有效状态。

DNT首部字段用来拒绝个人信息被收集,常表示拒绝被精准广告追踪的一种方法,属性值如下:

0:同意被追踪

1:拒绝被追踪

P3P首部字段可用来保护用户隐私。

确保Web安全的HTTPS

HTTP存在三个比较明显的缺点:

通信使用明文(不加密),内容可能会被窃听。

不验证通信方的身份,因此有可能遭遇伪装。

无法证明报文的完整性,所以可能已遭篡改。

尽管HTTP协议中没有加密机制,但可以通过和SSL或TLS的组合使用加密HTTP的通信内容,组合在一起通常被称为HTTPS。

HTTP协议在通信过程会存在以下隐患:

无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器,有可能是已伪装的Web服务器。

无法确定响应返回到的客户端是否是按真实意图接受响应的那个客户端,有可能是已伪装的客户端。

无法确定正在通信的对方是否具备访问权限,因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。

无法判断请求是来自何方,出自谁手。

即使是无意义的请求也会照单全收,无法阻止海量请求下的Dos攻击(拒绝服务攻击)。

请求或响应内容可能会在传输途中遭攻击者拦截并篡改内容。

HTTPS即使HTTP加上加密处理和认证以及报文完整性保护(完整性是指信息的准确度),其通信层次区别如图:

这里写图片描述

SSL采用一种叫做公开密匙加密的加密处理方式,其加密算法是公开的,但密匙是保密的,加密和解密过程中都需要用到密匙。

加密和解密同用一个密钥的方式称为共享密钥加密,也叫做对称密钥加密。

公开密钥加密使用一对非对称的密钥,一把叫做私有密钥,另一把叫做公开密钥,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何都可以获得,使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到加密的信息后,再使用自己的私有密钥进行解密,这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走,其整个过程如图:

这里写图片描述

HTTPS结合上面两种加密方式采用混合加密机制,因为公开密使加密处理比共享密匙加密方式更复杂,效率较低,结合两者的优势,HTTPS在交换密匙环节使用公开密钥加密方式,之后的建立通信交换报文加段则使用共享密钥加密方式,过程如图:

这里写图片描述

为了认证你访问的服务器就是原本预想的那台服务器,这就需要客户端和服务器双方都可信赖的第三方机构——数字证书认证机构,服务器会将这份由数字认证机构颁发的公钥证书(也叫数字证书)发送给客户端,以进行公开密钥加密方式通信,接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书书上的数字签名进行验证,以但验证通过,就说明服务器的公开密钥是值得信赖以及服务器是你预想访问的那个服务,其整个过程如图:

这里写图片描述

HTTPS通信大致步骤如下:

客户端通过发送Client Hello报文开始SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件列表。

服务器可进行SSL通信时,会以Sever Hello报文作为响应,和客户端一样,在报文中包含SSL版本以及加密组件,服务器的加密组件内容是从接收到的客户端加密组件内选帅出来的。

之后服务器发送 Certificate报文,报文中包含公开密钥 证书。

最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。

SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应,报文中包含通信加密中使用的一种称为Pre-master secret的随机密码串,其过程用了来自服务器公开密钥进行加密。

接着客户单继续发送Change Cipher Spec报文,该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。

客户端发送Finished报文,该报文包含连接至今全部报文的整体校验值,这次握手协商是否成功,要以服务器是否能够正确加密该报文作为判定标准。

服务器同样发送Change Cipher Spec报文。

服务器同样发送Finished报文。

服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成,当然,通信会受到SSL的保护,从此处开始进行应用层协议的通信,即发送HTTP请求。

应用层协议通信,即发送HTTP响应。

最后由客户端断开连接。

整个HTTPS通信大致过程如图:

这里写图片描述

HTTPS由于使用SSL独立协议,根据上面的处理过程,我们知道该协议需要大量消耗CPU及内存资源等资源,故通信较慢,网络负载较大。

确认访问用户身份的认证

HTTP协议通信过程会通过各种认证方式来确定其身份,通常涉及到的核对信息有以下几点:

密码:只有本人才会知道的字符串信息。

动态令牌:仅限本人持有的设备内显示的一次性密码。

数字认证:仅限本人持有的信息。

生物认证:指纹和虹膜等本人的生理信息。

IC 卡等:仅限本人持有的信息。

HTTPS一般的认证方式:BASIC认证(基本认证),DIGEST认证(摘要认证),SSL客户端认证,FormBase认证(基于表单认证)。

BASIC认证步骤:

当请求的资源需要BASIC认证时,服务器会随状态码401,返回带WWW-Authenticate首部字段的响应,该字段内包含认证的方式(BASIC)及Request-URI安全域字符串(realm)。

接收到状态码401的客户端为了通过BASIC认证,需要将用户ID及密码发送给服务器,发送的字符串内容是由用户ID和密码构成,两者中间以冒号(:)连接后,再经过Base64编码处理,如:用户ID为guest,密码是guest,连接起来就是guest:guest,然后会经过浏览器Base64编码后,发送请求。

接收到包含首部字段Authorization请求的服务器,会对认证信息的正确性进行验证,验证通过,则返回一条包含Request-URI资源的响应。

整个认证过程如图:

这里写图片描述

BASIC认证缺点:

在HTTP等非加密通信的线路上进行这种认证,容易被拦截窃听。(注:Base64编码用来加密,而是为能在通信传输信息)

浏览器无法实现认证注销操作。

DIGEST认证步骤:

请求需认证的资源时,服务器会随状态码401,返回带WWW-Authenticate首部字段的响应,该字段内包含质问响应方式认证所需的临时质询码(随机数,nonce).其中首部字段WWW-Authenticate内必须包含realm和nonce这两个字段(nonce是一种每次随返回的401响应生成的任意随机字符串)。

接收到状态码401的客户端,提取返回响应中首部字段Authorization信息,并在自己的首部字段Authorization还必须加上usename,uri,response的字段信息(response也叫做Request-Digest,存放经过MD5运算后的密码字符串,形成响应码。)

接收到包含首部字段Authorization请求的服务器,会对认证信息的正确性进行验证,验证通过,则返回一条包含Request-URI资源的响应。

整个认证过程如图:

这里写图片描述

DIGEST认证比BASCI认证安全性等级要高,能提供防止密码被窃听的保护机制,但是并不存在防止用户伪装的保护机制。

SSL客户端认证步骤:

接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书(需要向认证机构购买)

用户选择将发送的客户端证书,客户端会把客户端证书信息以Client Certificate报文方式发送给服务器。

服务器验证客户端证书,验证通过后方可领取证书内的客户端的公开密钥,然后开始HTTPS加密通信。

SSL客户端认证需要客户持有客户端证书才能完成认证,因此客户需要在证书上支出费用。

表单认证:

客户端吧用户ID和密码等登陆信息放入报文的实体部分,通常是以POST方法把请求发送给服务器,这时,会使用HTTPS通信来进行HTML表单画面的显示和用户输入数据的发送。

服务器会发放用以识别用户的SessionID,通过验证从客户端发送过来的登陆信息进行身份认证,然后把用户的认证状态与SessionID绑定后记录在服务器端(向客户端返回响应时,会在首部字段Set-Cookie内写入SessionID)。

客户端接收到从服务器端发来的SessionID后,会将其作为Cookie保存在本地,下次向服务器发送请求时,浏览器会自动发送Cookie,所以SessionID也随之发送到服务器,服务器端通过此ID来验证用户。

表单认证:表单认证是最常见的认证方式,该认证方法并不是在HTTP协议中定义,它一般是由Web应用提供登陆信息界面,使其更友好和用户交互,用户在其表单界面按提示和指导填写完信息后,才提交到Web那边应用进行验证。

基于HTTP瓶颈

HTTP通信协议有下面几点瓶颈:

一条连接上只可发送一个请求。

请求只能从客户端开始,客户端不可以接收除响应外的指令。

请求/响应首部未经压缩就发送,首部信息越多延迟越大。

发送冗长的首部,每次互相发送相同的首部造成的浪费较多。

可任意选择数据压缩格式,非强制压缩发送。

引入Ajax技术来解决页面局部更新,减少响应中传输的数据(Ajax是一种有效利用JavaScript和DOM的操作,实现局部Web页面替换加载的异步通信手段。)

引入Comet技术手段来解决实时更新问题,它通过延迟应答,模拟实现服务器端向客户端推送的功能,大致通信如下:

通常,服务器端接收到请求,在处理完毕后就会立即返回响应,但为了实现推送功能,Comet会先将响应置于挂起状态,当服务器有内容更新时,再返回该响应,因此,服务器端一有更新,就可以立即反馈给客户端。(因要保留响应,一次连接持续时间更长,故消耗更多的资源)。

SPDY技术引入可以让HTTP获得额外几点功能,如下:

多路复用流:通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率提高。

赋予请求优先级:SPDY通过给请求逐个分配优先级顺序,可以解决在同时刻发送多个请求,带宽低而导致响应慢的问题。

压缩HTTP首部:压缩HTTP请求和响应的首部,能使通信产生的数据包数量和发送的字节数减少。

推送功能:支持服务器主动向客户端推送数据的功能,这样服务器就可以不用再等客户端发送请求才返回数据了。

服务器提示功能:服务器可以主动提示客户端请求所需资源的额更新情况,因此在客户端对请求资源已缓存等情况下,可以避免发送不必要的请求。

引入WebSocket协议来解决HTTP一些瓶颈,该协议有主要特点如下:

*推送功能:支持服务器主动向客户端推送数据的功能。

减少通信量:只要建立起WebSocket连接,就希望一直保持连接状态,和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也减少了。

不过实现WebSocket通信是建立在HTTP基础上,因此需要用HTTP的Upgrade首部字段告知服务器通信协议的改变,以达到握手的目的,整个过程如图:

这里写图片描述

 

此条目发表在未分类分类目录。将固定链接加入收藏夹。