http协议(二)
1 深入了解http
1.1 常用的请求方式
常用的请求方式是GET和POST.
l GET方式:是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过 程的描述。
l POST方式:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:
- 对现有资源的解释;
- 向电子公告栏、新闻组、邮件列表或类似讨论组发信息;
- 提交数据块;
- 通过附加操作来扩展数据库 。
从上面描述可以看出,Get是向服务器发索取数据的一种请求;而Post是向服务器提交数 据的一种请求,要提交的数据位于信息头后面的实体中。
GET与POST方法有以下区别:
(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2)GET方式提交的数据最多只能有1024字节(这个数字与浏览器有关),而POST则没有此限制。
(3)安全性问题。正如在(1)中提到,使用Get的时候,参数会显示在地址栏上,而Post不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。
(4)安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一URL的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST请求就不那么轻松了。POST表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过POST请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
1.2 Cookie和Session
Cookie和Session都 为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。
Session可以用Cookie来实现,也可以用URL回写的机制来实现。用Cookie来实现的Session可以认为是对Cookie更高级的应用。
1.2.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机制更安全些,因为它不会任意读取客户存储的信息。
1.3 Session机制
Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识称 session_id,如果已包含一个session_id则说明以前已经为此客户端创建过session,服务器就按照session_id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session_id,则为此客户端创建一个session并且生成一个与此session相关联的session_id,session_id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session_id将被在本次响应中返回给客户端保存。
1.3.1 Session的实现方式
1.3.1.1 使用Cookie来实现
服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发 送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。流程如图 2‑1所示:

图 2‑1 使用Cookie来实现Session
1.3.1.2 使用URL回显来实现
URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带会服务器。如果直接在浏览器输入服务端资源的url来请求该资源,那么Session是匹配不到的。
Tomcat对Session的实现,一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用response.encodeURL()。
1.3.2 在J2EE项目中Session失效的几种情况
1)Session超时:Session在指定时间内失效,例如30分钟,若在30分钟内没有操作,则Session会失效,例如在web.xml中进行了如下设置:
<session-config>
<session-timeout>30</session-timeout> //单位:分钟
</session-config>
2)使用session.invalidate()明确的去掉Session。
1.3.3 与Cookie相关的HTTP扩展头
1)Cookie:客户端将服务器设置的Cookie返回到服务器;
2)Set-Cookie:服务器向客户端设置Cookie;
3)Cookie2 (RFC2965)):客户端指示服务器支持Cookie的版本;
4)Set-Cookie2 (RFC2965):服务器向客户端设置Cookie。
1.3.4 Cookie的流程
服务器在响应消息中用Set-Cookie头将Cookie的 内容回送给客户端,客户端在新的请求中将相同的内容携带在Cookie头 中发送给服务器。从而实现会话的保持。流程如图 2‑2所示:

图 2‑2 Cookie的流程
1.4 缓存的实现原理
1.4.1 什么是Web缓存
WEB缓存(cache)位于Web服务器和客户端之间。缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。HTTP协议定义了相关的消息头来使WEB缓存尽可能好的工作。
1.4.2 缓存的优点
l 减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源 服务器被相应,这个过程耗时更少,让web服务器看上去相应更快。
l 减少网络 带宽消耗:当副本被重用时会减低客户端的带宽消耗;客 户可以节省带宽费用,控制带宽的需求的增长并更易于管理。
1.4.3 与缓存相关的HTTP扩展消息头
l Expires:指示响应内容过期的时间,格林威治时间GMT
l Cache-Control:更细致的控制缓存的内容
l Last-Modified:响应中资源最后一次修改的时间
l ETag:响应中资源的校验值,在服务器上某个时段是唯一标识的。
l Date:服务器的时间
l If-Modified-Since:客户端存取的该资源最后一次修改的时间,同Last-Modified。
l If-None-Match:客户端存取的该资源的检验值,同ETag。
1.4.4 客户端缓存生效的常见流程
服务器收到请求时,会在200OK中回送该资源的Last-Modified和ETag头,客户端将该资源保存在cache中,并记录这两个属性。当客户端需要发送相同的请求时,会在请求中携带If-Modified-Since和If-None-Match两个头。两个头的值分别是响应中Last-Modified和ETag头的值。服务器通过这两个头判断本地资源未发生变化,客户端不需要重新下载,返回304响应。常见流程如下图所示:

图 2‑3 缓存生效的常见流程
1.4.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的请求的话,缓存就会过期。
1.5 断点续传和多线程下载的实现原理
1.5.1 断点续传的实现原理
1、 HTTP协议的GET方法,支持只请求某个资源的某一部分;
2、 206 Partial Content部分内容响应;
3、 Range请求的资源范围;
4、 Content-Range 响应的资源范围;
5、 在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
分块请求资源实例:
Eg1:Range: bytes=306302-:请求这个资源从306302个字节到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;
客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。
1.5.2 多线程下载的原理:
1、 下载工具开启多个发出HTTP请求的线程;
2、 每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000;
3、 合并每个线程下载的文件。
1.6 https通信过程
1.6.1 什么是https
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。https所用的端口号是443。见下图:

1.6.2 https的实现原理
有两种基本的加解密算法类型:
1)对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES等;
2)非对称加密:密钥成对出现(且根据公钥无法推知私钥,根据私钥 也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
下面看一下https的通信过程:
https通信的优点:
1)客户端产生的密钥只有客户端和服务器端能得到;
2)加密的数据只有客户端和服务器端才能得到明文;
3)客户端到服务端的通信是安全的。
1.7 http代理
1.7.1 http代理服务器
代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。
代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服 务器去取回网页而是向代理服务器发出请求,Request信号会先送到代 理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机 的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据, 而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。
更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。
1.7.2 http代理服务器的主要功能
主要功能如下:
1)突破自身IP访问 限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国 外网站;
2)访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;
3)突破中国电信的IP封 锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国 外的代理 服务器试试;
4)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存 到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信 息,传给用户,以提高访问速度;
5)隐藏真实IP:上 网者也可以通过这种方法隐藏自己的IP,免受攻击。
1.7.3 http代理图示
http代理的图示见下图:
对于客户端浏览器而言,http代理服务器相当于服务器。而对于Web服务器而言,http代理服务器又担当了客户端的角色。
1.8 虚拟主机的实现
1.8.1 什么是虚拟主机
虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组 件等,提供必要的站点功能与数据存放、传输功能。所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每 一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支 持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。
1.8.2 虚拟主机的实现原理
虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。Apache、Tomcat等均可通过配置实现这个功能。相关的HTTP消息头:Host。例如:Host:www.baidu.com。客户端发送HTTP请求的时候,会携带Host头,Host头记录的是客户端输入的域名。这样服务器可以根据Host头确认客户要访问的是哪一个域名。
1.9 附 录:参考资料
《理解Cookie和Session机制》:http://sumongh.javaeye.com/blog/82498
《http代理_百度百科》:http://baike.baidu.com/view/1159398.htm
《虚拟主机_百度百科》:http://baike.baidu.com/view/7383.htm
《https_百度 百科》:http://baike.baidu.com/view/14121.htm

浙公网安备 33010602011771号