1、TIPS
(1)HTTP协议包括:
建立连接
HTTP请求消息:请求方法 URI 协议/版本(即请求行)、消息头、空行(只有CRLF的行)、消息体;
HTTP响应消息:协议 状态码 描述(即状态行)、消息头、空行(只有CRLF的行)、消息体;
断开连接
一次连接可以有多个请求。如页面中的图片、js、css等都是单独的请求。
(2)http头包括通用头、请求头、响应头、实体头。每个报头域都是由名字+":"+空格+值组成。消息报头域的名字是大小写无关的。
a、general-header:在普通报头中,有少数报头域用于所有的请求和响应消息,不用于被传输的实体,只用于传输的消息。
cache-control:用于指定缓存指令。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现)且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、only-if-cached等。
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、max-age等。
如:为了指示浏览器不要缓存页面,可以写response.setHeader("Cache-Control" , "no-cache");作用于相当于response.setHeader("Pragma", "no-cache");通常两者合用。
connection:Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。
Date:Date普通报头域表示消息产生的日期和时间。
paragma
Transfer-Encoding
upgrade
b、request-header:请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
accept:accept请求报头域用于指定客户端希望接受哪些类型的信息。如:accpet: image/gif。
accept-charset:用于指定客户端接受的字符集。缺省是任何字符集都可以接受。
accept-Encoding:类似于accept,用于指定可接受的内容编码。缺省是服务器认为客户端对各种内容编码都接受。
accept-language:类似于accept,用于指定一种自然语言。缺省是服务器认为客户端对各种语言都接受。如:accept-language: zh-cn。
Authorization:用于证明客户端有权查看某个资源。当浏览器访问一个页面时,若收到服务器的响应代码为401(未授权),可以发送一个包含authorization请求报头域的请求,要求服务器对其进行验证。
Except
Form
Host:发送请求时,该报头域是必须的。用于指定被请求资源的主机和端口号,通常从HTTP URL中提取出来的。
If-match
If-modified-
If-range
Range
Refer
user-Agent:允许客户端将它的操作系统、浏览器和其他属性告诉服务器。这个报头域不是必须的。
c、response-header:响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对URI所标识的资源进行下一步访问的信息。
Accept-Range
Age
ETag
location:用于重定向接受者到一个新的位置。location响应报头域常用在更换域名的时候。
server:server响应报头域包含了服务器用来处理请求的软件信息。与user-agent请求报头域是相对应的。
proxy-Authenticate
www-Authenticate:此响应报头域必须被包含在401响应消息中。客户端收到401响应消息时,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。如:www-Authenticate:Basic realm="Test!",可以看出服务器对请求资源采用的是基本验证机制。
d、entity-header:请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成。但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(如:有无实体正文)和请求所标识的资源的元信息。
Allow:
content-Encoding:用于媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码。因此要获得content-type报头域中所引用的媒体类型,必须采用相应的解码机制。
content-language:描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读。
content-length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
content-location
content-Range
content-Type:指明发送给接收者的实体正文的媒体类型。如:content-type: text/html;charset=GB2312
Expires:给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间后更新缓存中的页面(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)。可以使用expires实体报头域指定页面过期的时间。HTTP1.1的客户端和缓存将非法的日期格式(包括0)看做已经过期。因此,为了让浏览器不要缓存页面,可以使用expires实体报头域,设置为0。即response.setHeader("expires", "0");
Last-Modified:用于指示资源的最后修改日期和时间。
extention-header
(3)面向连接:指通信双方在通信之前要先建立一个通信的渠道;
保持状态:指通信的一方能把一系列的消息关联起来,使得消息之间可以相互依赖。
cookie和session机制是c、s之间保持状态的解决方案。
cookie的分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以告诉浏览器按照指示生成相应的cookie。客户端脚步js也能生成cookie。
cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,若某个cookie所声明的作用范围大于等于将要请求的资源所在位置,则把cookie附在请求资源的HTTP请求头上发给服务器。
cookie的内容主要包括:名字、值、过期时间、路径和域(是cookie的作用范围)。
若不设置过期时间,则cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失了。此cookie不存在硬盘上,而是保存在内存里。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,而保存在内存里的cookie,不同浏览器处理方式不同。对于IE,在一个打开的窗口上按ctrl+N,打开的窗口可以和原窗口共享。新开的IE进程不能共享已经打开的窗口的内存cookie。
一般来说,用js的window.open打开的窗口会与原窗口共享内存cookie。
session机制是服务器端的机制。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查客户端请求里是否已包含了一个session Id。若已包含了,服务器就按照session Id把这个session检索出来使用。session Id是唯一的,将被在本次响应中返回客户端保存。保存sesssion id的方式可采用cookie,这样在交互过程中浏览器自动按照规则把此session id发给服务器。一般这个cookie的名字类似于sessionId。也可使用URL重写保证当cookie被禁止时仍能把session id传递回服务器,即把session id直接附加到URL路径的后面。附加方式有两种,一种作为URL路径的附加信息,表现形式为;jsessionid=...;另一种作为查询字符串附加到URL后面,表现形式为?jsessionid=...。
还有一种技术是表单隐藏字段,即服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能把session id传回服务器。
对于session来说,除非程序通知服务器删除一个session,原则上服务器会一直保留。程序一般都是在用户做log off时发指令去删除session。
一般情况下,session都存储在内存中。可以设置session的持久化特性,这样服务器会将session保存到硬盘上。
复制,是持久化方式的一种。session保存在内存里。同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作,也可以从其他进程中取得session。
session何时被创建:
session不是在客户端访问时就被创建,而是直到server端程序调用reqeuest.getSession(true)语句时才被创建。
若Jsp没有显式的使用<% @page session="false" %>关闭session,则jsp文件在编译成servlet时会自动有reqeuest.getSession(true)语句。
session何时被删除:
a、程序调用session.invalidate();
b、访问时间过期;
c、服务器进程被停止;
sessionId的保存:URL、消息头(cookie)、表单隐藏;
要求session中的对象可序列化,是为了session能在集群中被复制或能持久保存。
跨应用程序的session共享:
servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序不能互相访问对方的session。各个应用服务器从实际效果上都遵守此规范。
(4)HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type标记。
无连接:指限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
请求方法:
get:请求获取uri所标识的资源;
post:在uri所标识的资源后附加新的数据;
head:请求获取由uri所标识的资源的响应消息报头;
put:请求服务器存储一个资源,并用uri作为其标识;
delete:请求服务器删除uri所标识的资源;
。。。
状态码:
2XX:成功;
3XX:重定向;
4XX:客户端错误;
5XX:服务器端错误;
(5)网关是一个接收代理。网关接受请求就好像对被请求的资源来说它就是源服务器,发出请求的客户机并没有意识到它在同网关打交道。
代理:一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。
(6)
2、PS
(1)保持连接是http1.1新内容,http协议无状态,服务器和客户端都不保证用户访问期间连接会一直保持。
keep-Alive表示客户端浏览器支持保持连接的工作方式,但此连接会在一段时间没有请求后自动断开,以节省服务器资源。
http无状态:即服务端无法知道客户端发来的请求是否来自一个客户的。一个浏览器实例代表一个客户端。
(2)服务器通过cookie方式告诉客户端你的sessionID,服务器上保留了和此sessionID相关的数据。
客户端在从服务器端得到cookie值后就保存在本地硬盘上,客户端再次访问时就会把它发送到服务器。
cookie内容没有设置过期时间,表示是一个当关闭浏览器立即过期的cookie,它不会保存在硬盘上。
服务器判断session过期的方式是通过用户手工结束session或等待超时,不是断开连接或关闭浏览器。
cookie都是以单名称与值的格式存储到浏览器中。cookie内容会加在http协议的报文头中。因为是在head中而不是在报文包体中,其大小个数都有限制。
不同浏览器允许每个域名所包含的cookie大小个数不同:
IE6 IE8 FF Opera Safari Chrome
cookie个数限制(个) 20 50 50 30 无 50
单个cookie大小限制(k) 4 4 4 4 4
超出后的问题:
a、若cookie很多,则会使head大小超过服务器处理的限制,会导致错误发生;
b、当cookie个数超过限制,
对于IE和Opera,会自动剔除最老的cookie,以给最新的cookie空间;
对于FF,会保留最新的cookie,但也会抛弃超过的。
cookie数量和长度的限制。
(3)Content-Type:标识出这个返回内容的类型。原则上浏览器会根据Content-Type来决定如何显示返回的消息体内容。
若在消息头中加入"content-Disposition:attachment",无论文件是何类型,浏览器都会提示下载此文件。
(4)网页的缓存由http消息头中的"cache-control"控制。常见取值有private、no-cache、max-age等。
浏览器对页面进行了缓存,即在同一浏览器窗口中再次打开此页时不会重新从服务器端获取。
刷新操作——重新访问服务器(任何取值);
no-cache——重新访问服务器(任何取值);
expires值可以通过在internet临时文件夹中查看临时文件属性看到。
(5)HTTP协议contentLenth限制漏洞导致拒绝服务攻击
使用post方法时,可以设置contentLenth来定义需要传送的数据长度。如contentLenth:999999999,在传送完成前,内存不会释放。利用这个缺陷,连续向web服务器发送垃圾数据直到web服务器内存耗尽。
(6)服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求,此时从正常客户的角度看来服务器失去响应。此种情况下,服务器端受到了SYN flood攻击。
(7)为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能快速完成整个网页的传输。HTTP1.1提供了持续连接的方式。
(8)当一个客户端请求web服务器,请求的内容可从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。
页面文件有三种缓存状态:
a、最新的:选择不缓存页面,每次请求时都从服务器获取最新内容;
b、未过期的:在给定的时间内缓存,若用户刷新或页面过期则去服务器请求,否则将读取本地的缓存,这样可以提高浏览速度;
c、过期的:也就是陈旧的页面,当请求这个页面时,必须进行重新获取。
浏览器缓存将文件保存在客户端。
页面的缓存状态是由HTTP Header决定的。主要包括Pragma:no-cache、Cache-Control、Expires、Last-Modified、If-Modified-Since。其中Progma:no-cache由HTTP1.0规定,Cache-Control由HTTP1.1规定。
Cache-Control:public/private。public响应会被缓存,且在多用户间共享。private响应只能作为私有的缓存,不能在用户间共享。
Cache-Control:no-cache。不进行缓存。
Cache-Control:max-age=x。缓存时间,以秒为单位。
Cache-Control:must-revalidate。若页面是过期的,则去服务器进行获取。
Expires:显示的设置页面过期时间。
Last-Modified:请求对象最后一次的修改时间,用来判断缓存是否过期。通常由文件的时间信息产生。
If-Modified-Since:客户端发送请求附带的信息。指浏览器缓存请求对象的最后修改日期,用来和服务器端的Last-Modified做比较。
若IE设置“每次访问页面检查”,用户使用重新加载或超过了过期日期,浏览器就会认为这个页面是陈旧的(它将发送附加一个If-Modified-Since的信息。若页面没有改变,服务器端响应一个304状态Not Modified,而不发送整个页面。但服务器端必须要生成有效的Last-Modified headers且服务器时间必须是有效的)。
仅仅设置Pragma:no-cache或Cache-Control:no-cache不保险,需要将过期时间设置成过去的时间就确保了对象不被缓存。
第一次请求时,响应返回了Last-Modified和ETag。这两个信息用来比较当前浏览器缓存的文件是否和服务器端文件一致。若不一致就获取最新,一致则读取本地缓存。
第二次请求时,请求头中If-None-Match信息就是第一次响应的ETag值,用来验证和当前响应的ETag是否一致。一致则服务器返回Not Modified,浏览器读取本地缓存。
请求头中If-Modified-Since信息就是第一次响应的Last-Modified值。
可以使用专门的缓存服务器改善性能。原理和浏览器的缓存原理一样,所有的浏览器请求将由缓存服务器响应,缓存服务器可以用自己的缓存文件或获取新的文件来响应用户的请求。由了缓存服务器,将大大提高网站的性能。
(9)浏览器取缓存内容的类型:
a、本地缓存:
直接从本地去页面缓存;
如果缓存的页面有expires(绝对时刻)或Cache-Control:max-age(时长),则在有效时间内,则取本地页面,不会给浏览器发请求。
b、协商缓存:
与web服务器协商,判断是否取浏览器缓存。
如果没有expires或max-age,则浏览器会发请求到服务器,附上If-Modified-Since报文头,web服务器则会判断页面是否在这个时间后有更新过,如没有则返回一个304状态,浏览器取本地缓存的内容;否则,服务器将返回200状态,并返回该资源和Last-Modified。
在浏览器(如IE)中有几种操作,如下:
a、强制刷新:Ctrl + F5
浏览器将绕过本地缓存、协商缓存,让服务器重新发送请求的资源。
b、刷新:F5
浏览器将绕过本地缓存,将使用协商缓存来请求资源。
c、转向或回车:
浏览器将使用本地缓存、协商缓存。
ETag:
Last-Modified与If-Modified-Since是一对报文头,属于http 1.0。
ETag与If-None-Match是一对报文,属于http 1.1。
他们要实现的都是协商缓存,但Last-Modified和If-Modified-Since只判断资源的最后修改时间,而ETags和If-None-Match可以是资源任何的任何属性。
ETag机制类似于乐观锁机制,如果请求报文的ETag与服务器的不一致,则表示该资源已经被修改过来,需要发最新的内容给浏览器。
同时使用这两个报文头,在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,如都与服务器的相符,服务器返回304,否则,发送最新内容给浏览器。
(10)