如何全面掌握HTML协议及其Cookie与Session的深层差异与应用?
- 内容介绍
- 文章标签
- 相关推荐
本文共计4716个文字,预计阅读时间需要19分钟。
HTTP协议学习系列:基础概念篇 1.1 介绍HTTP是Hy+协议的学习系列,转自:http://www.360doc.com/content/100930/17366821_57590979.s
1. 基础概念篇
1.1 介绍HTTP协议
www.360doc.com/content/10/0930/17/3668821_57590979.shtml1.1 介绍
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。 HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。1.2 在TCP/IP协议栈中的位置
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示: 1.6.4 Cache-Control头域Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。 在图5中的该头域为:1.6.5 Date头域
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。 图5中,该头域如下图所示:1.7 HTTP的几个重要概念
1.7.1连接:Connection
一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。 在baike.baidu.com/view/9472.htm 《结果编码和blog.tieniu1980.cn/archives/377 《分析TCP的三次握手》:cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763104c8c711923d030678197027fa3c215cc7905141130a8e5747e0d548d98297a5ae91e03f7f63772315477e3cacdd94cdbbdc42225d82c36734f844315c419d891007a9f34d507a9f916a2e1b065d2f48193864353bb15543897f1fb4d711edd1b86033093b1e94e022e67adec40728e2e605f983431c5508fe4RFC822,updatedbyRFC1123Sunday,06-Nov-9408:49:37GMT;RFC850,obsoletedbyRFC1036SunNov608:49:371994;ANSIC'sasctime()format (发送方向) HTTP1.0要求不能生成第三种asctime格式的date/time stamp; HTTP1.1则要求只生成RFC 1123(第一种)格式的date/time stamp。2.1.4状态响应码
状态响应码100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。 客户端在Request头部中包含Expect:100-continue Server看到之后呢如果回100 (Continue) 这个状态代码,客户端就继续发request body。这个是HTTP1.1才有的。 另外在HTTP/1.1中还增加了101、203、205等等性状态响应码2.1.5请求方式
HTTP1.1增加了OPTIONS, PUT, DELETE, TRACE, CONNECT这些Request方法. Method = "OPTIONS" ; Section 9.2 | "GET" ; Section 9.3 | "HEAD" ; Section 9.4 | "POST" ; Section 9.5 | "PUT" ; Section 9.6 | "DELETE" ; Section 9.7 | "TRACE" ; Section 9.8 | "CONNECT" ; Section 9.9 | extension-method extension-method = token2.2 HTTP请求消息
2.2.1请求消息格式
请求消息格式如下所示: 请求行 通用信息头|请求头|实体头 CRLF(回车换行) 实体内容 其中“请求行”为:请求行 = 方法 [空格] 请求URI [空格] 版本号 [回车换行] 请求行实例: Eg1:GET/index.htmlHTTP/1.1 Eg2: POST 192.168.2.217:8080/index.jsp HTTP/1.1 HTTP请求消息实例:GET/hello.htmHTTP/1.1Accept:*/*Accept-Language:zh-cnAccept-Encoding:gzip,deflateIf-Modified-Since:Wed,17Oct200702:15:55GMTIf-None-Match:W/"158-1192587355000"User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)Host:192.168.2.162:8080Connection:Keep-Alive2.2.2请求方法
HTTP的请求方法包括如下几种: q GET q POST q HEAD q PUT q DELETE q OPTIONS q TRACE q CONNECT2.3 HTTP响应消息
2.3.1响应消息格式
HTTP响应消息的格式如下所示: 状态行 通用信息头|响应头|实体头 CRLF 实体内容 其中:状态行 = 版本号 [空格] 状态码 [空格] 原因 [回车换行] 状态行举例: Eg1:HTTP/1.0200OK Eg2:HTTP/1.1400BadRequest HTTP响应消息实例如下所示:HTTP/1.1200OKETag:W/"158-1192590101000"Last-Modified:Wed,17Oct200703:01:41GMTContent-Type:text/htmlContent-Length:158Date:Wed,17Oct200703:01:59GMTServer:Apache-Coyote/1.12.3.2 host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。2.8实体头
实体头用坐实体内容的元信息,描述了实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。 l Allow:GET,POST l Content-Encoding:文档的编码(Encode)方法,例如:gzip,见“2.5 响应头”; l Content-Language:内容的语言类型,例如:zh-cn; l Content-Length:表示内容长度,eg:80,可参考“2.5响应头”; l Content-Location:表示客户应当到哪里去提取文档,例如:www.dfdf.org/dfdf.html,可参考“2.5响应头”; l Content-MD5:MD5 实体的一种MD5摘要,用作校验和。发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。Eg1:Content-MD5: 。Eg2:dfdfdfdfdfdfdff==; l Content-Range:随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。Eg1:Content-Range: 1001-2000/5000,eg2:bytes 2543-4532/7898 l Content-Type:标明发送或者接收的实体的MIME类型。Eg:text/html; charset=GB2312 主类型/子类型; l Expires:为0证明不缓存; l Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT.2.8扩展头
在HTTP消息中,也可以使用一些再HTTP1.1正式规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或者扩展头,他们通常被当作是一种实体头处理。 现在流行的浏览器实际上都支持COOKIE,Set-COOKIE,Refresh和Content-Disposition等几个常用的扩展头字段。 l Refresh:1;url=www.dfdf.org //过1秒跳转到指定位置; l Content-Disposition:头字段,可参考“2.5响应头”; l Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型。 eg1:Content-Type:application/xml ; eg2:applicaiton/octet-stream; Content-Disposition:attachment; filename=aaa.zip。 附录:参考资料 《HTTP1.1和HTTP1.0的区别》: blog.csdn.net/yanghehong/archive/2009/05/28/4222594.aspx 《HTTP请求(GET和POST区别)和响应》:www.blogjava.net/honeybee/articles/164008.html 《HTTP请求头概述_百度知道》: zhidao.baidu.com/question/32517427.html 《实体头和扩展头》: www.cnblogs.com/tongzhiyong/archive/2008/03/16/1108776.html 3.深入了解篇3.1 COOKIE和Session
COOKIE和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。 Session可以用COOKIE来实现,也可以用URL回写的机制来实现。用COOKIE来实现的Session可以认为是对COOKIE更高级的应用。3.1.1两者比较
COOKIE和Session有以下明显的不同点: 1)COOKIE将状态保存在客户端,Session将状态保存在服务器端; 2)COOKIEs是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。COOKIE最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送COOKIEs,在客户终端,浏览器解析这些COOKIEs并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些COOKIEs。Session并没有在HTTP的协议中定义; 3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用COOKIE时,这个值也可能设置为由get来返回给服务器; 4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个COOKIE,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。3.1.2 Session机制
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为 sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 sessionid将被在本次响应中返回给客户端保存。3.1.6 Session的实现方式
3.1.6.1 使用COOKIE来实现
服务器给每个Session分配一个唯一的JSESSIONID,并通过COOKIE发送给客户端。 当客户端发起新的请求的时候,将在COOKIE头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。 流程如下图所示:3.1.6.2 使用URL回显来实现
URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。 如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。 Tomcat对Session的实现,是一开始同时使用COOKIE和URL回写机制,如果发现客户端支持COOKIE,就继续使用COOKIE,停止使用URL回写。如果发现COOKIE被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL() 。3.1.3在J2EE项目中Session失效的几种情况
1)Session超时:Session在指定时间内失效,例如30分钟,若在30分钟内没有操作,则Session会失效,例如在web.xml中进行了如下设置: 30 //单位:分钟 2)使用session.invalidate()明确的去掉Session。3.1.4与COOKIE相关的HTTP扩展头
1)COOKIE:客户端将服务器设置的COOKIE返回到服务器; 2)Set-COOKIE:服务器向客户端设置COOKIE; 3)COOKIE2 (RFC2965)):客户端指示服务器支持COOKIE的版本; 4)Set-COOKIE2 (RFC2965):服务器向客户端设置COOKIE。3.1.5COOKIE的流程
服务器在响应消息中用Set-COOKIE头将COOKIE的内容回送给客户端,客户端在新的请求中将相同的内容携带在COOKIE头中发送给服务器。从而实现会话的保持。 流程如下图所示:3.2 缓存的实现原理
3.2.1什么是Web缓存
WEB缓存(cache)位于Web服务器和客户端之间。 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。 HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。3.2.2缓存的优点
q 减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。 q 减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。3.2.3与缓存相关的HTTP扩展消息头
q Expires:指示响应内容过期的时间,格林威治时间GMT q Cache-Control:更细致的控制缓存的内容 q Last-Modified:响应中资源最后一次修改的时间 q ETag:响应中资源的校验值,在服务器上某个时段是唯一标识的。 q Date:服务器的时间 q If-Modified-Since:客户端存取的该资源最后一次修改的时间,同Last-Modified。 q If-None-Match:客户端存取的该资源的检验值,同ETag。3.2.4客户端缓存生效的常见流程
服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。常见流程如下图所示:3.2.5 Web缓存机制
HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量;HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽;HTTP用“验证(validation)”机制来为此目的。 HTTP定义了3种缓存机制: 1)Freshness:允许一个回应消息可以在源服务器不被重新检查,并且可以由服务器和客户端来控制。例如,Expires回应头给了一个文档不可用的时间。Cache-Control中的max-age标识指明了缓存的最长时间; 2)Validation:用来检查以一个缓存的回应是否仍然可用。例如,如果一个回应有一个Last-Modified回应头,缓存能够使用If-Modified-Since来判断是否已改变,以便判断根据情况发送请求; 3)Invalidation: 在另一个请求通过缓存的时候,常常有一个副作用。例如,如果一个URL关联到一个缓存回应,但是其后跟着POST、PUT和DELETE的请求的话,缓存就会过期。3.3 断点续传和多线程下载的实现原理
q HTTP协议的GET方法,支持只请求某个资源的某一部分; q 206 Partial Content 部分内容响应; q Range 请求的资源范围; q Content-Range 响应的资源范围; q 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。 分块请求资源实例: Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分; Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节; 客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。 多线程下载的原理: q 下载工具开启多个发出HTTP请求的线程; q 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000; q 合并每个线程下载的文件。3.4 https通信过程
3.4.1什么是https
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。 见下图:https所用的端口号是443。3.4.2 https的实现原理
有两种基本的加解密算法类型: 1)对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等; 2)非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。 下面看一下https的通信过程: https通信的优点: 1)客户端产生的密钥只有客户端和服务器端能得到; 2)加密的数据只有客户端和服务器端才能得到明文; 3)客户端到服务端的通信是安全的。3.5 http代理
3.5.1 http代理服务器
代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。 代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。 而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。 更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。3.5.2 http代理服务器的主要功能
主要功能如下: 1)突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站; 2)访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务; 3)突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国 外的代理服务器试试; 4)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度; 5)隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。3.5.3 http代理图示
http代理的图示见下图:对于客户端浏览器而言,http代理服务器相当于服务器。 而对于Web服务器而言,http代理服务器又担当了客户端的角色。3.6 虚拟主机的实现
3.6.1什么是虚拟主机
虚拟主机:是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等,提供必要的站点功能与数据存放、传输功能。 所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。3.6.2虚拟主机的实现原理
虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。Apache、Tomcat等均可通过配置实现这个功能。 相关的HTTP消息头:Host。 例如:Host:www.baidu.com 客户端发送HTTP请求的时候,会携带Host头,Host头记录的是客户端输入的域名。这样服务器可以根据Host头确认客户要访问的是哪一个域名。本文共计4716个文字,预计阅读时间需要19分钟。
HTTP协议学习系列:基础概念篇 1.1 介绍HTTP是Hy+协议的学习系列,转自:http://www.360doc.com/content/100930/17366821_57590979.s
1. 基础概念篇
1.1 介绍HTTP协议
www.360doc.com/content/10/0930/17/3668821_57590979.shtml
