HTTP协议详解文章
HTTP协议详解(三)
一.通过Session来保存状态信息
Session机制是一种服务器的机制,服务器使用一种类似散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先会检查这个客户端是否已经包含一个session标识,称为session id。如果已经包含一个session id,则说明以前已经为此客户端创建过session,服务器就按照这个session id把这个session 检索出来使用。
如果客户端请求不包行session id,则为此客户端创建一个session并且生成一个与此session 相关的session id。
Session实现方式:
1.使用cookie来实现
服务器给每个session分配唯一一个JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在cookie头中携带这个JSESSIONID,这样服务器就能够找到这个客户端对应的Session。
2.使用URL回写来实现
URL回写指在服务器发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带回服务器。
二.Session与Cookie的区别
1.Cookie将状态保存在客户端,Session将状态保存在服务器。
2.Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送给同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户端浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一个服务器的任何请求缚上这些cookies。
3.Cookie是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候会返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。
4.就安全性来说,访问一个使用session的站点,同时在自己机子上建立一个cookie,建议在服务器的session机制更安全些,因为它不会任意读取客户存储的信息。
三.缓存的实现原理
cache位于WEB服务器和客户端之间。cache会根据请求保存输出内容的脚本,例如:html页面、文件等。当下一个请求来到的时候,如果是相同的URL,cache会直接使用副本响应访问请求,而不是向源服务器再次发出请求。
缓存的有点:减少相应延迟,因为请求从缓存服务器而不是源服务器被响应,这个过程耗时更少,让web服务器看上去响应更快。减少网络带宽消耗,当副本被重用时,会降低客户端的带宽消耗。
cache生存期:服务器收到请求时,会在200 OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-Modified-Match两个头,两个头的值分别对应Last-Modified和ETag头的值。服务器通过这两个头判断本地资源是否发生变化,客户端不需要重新下载,返回304响应。
HTTP 1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。
减少发送请求:减少了网络回路的数量,HTTP利用一个“过期”机制来实现此目的。
不需要发送完整响应:减少网络应用的带宽,HTTP利用“验证”机制来实现此目的。
1.Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如:Expires回应头给了一个文档不可用的时间,Cache-Control中的max-age标识指明了缓存的最长时间。
2.Validation:用来检查以一个缓存的回应是否仍然可用,例如:如果一个回应有一个Last-Modified的回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求。
3.Invalidation:在另一个请求通过缓存的时候,常常有一个副作用。例如:如果一个URL关联到一个缓存回应,但是其后跟着POST、PUT或DELETE的请求的时候,缓存就会过期。
四.断点续传的实现原理
HTTP协议的GET方法,支持只请求某个资源的某一部分。206 Partial Content部分内容响应,Range请求的资源范围,Content-Range 响应的资源范围。
在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
分块请求资源示例:
Eg1:Range:bytes=306302- 请求这个资源从306302个字节到末尾的部分
Eg2:Content-Range:bytes 306302-604047/604408 响应中指示携带的是该资源的第306302-604607的字节,该资源共有604608个字节。
客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载,从而达到快速下载的目的。目前流行的FlashGet和迅雷都是这个道理。