http协议总结整理(二)

总结一下我们经常用到的header

缓存控制

在互联网站的应用中,缓存几乎无处不在,在基于http的服务中,我们也可以对一些不常改变的内容在客户端进行缓存,这样在多次访问中可以复用缓存内容,加快访问速度,提升用户体验。http的协议里规定了一些用于缓存控制的http消息头:

Cache-Control(HTTP/1.1)/Pragma(HTTP/1.0):指示客户端是否进行缓存以及缓存的时间是多长。默认值是private,也就是把内容缓存在用户私有空间。比如:Cache-Control:max-age=86400,must-revalidate,这是告诉客户端所请求的资源缓存一天(max-age单位是秒,相对时间),过期之后必须进行重新检验。

Expires:指定客户端(如果不强制刷新的话)在多长时间里可以不向服务器发请求,直接读本地缓存。

Last-Modified/If-Modified-Since:Last-Modified是服务器端返回给客户端的资源最后修改时间戳,这样,客户端在下次请求时(比如强制刷新)会带上If-Modified-Since参数来校验资源是否有更新,没有更新的话服务器就返回304状态码,客户端直接取本地缓存的资源。这个时候只有请求开销,没有网络传输开销。注意:时间戳必须是格林威治(GMT)时间,比如:Last-Modified:Sat, 19 Oct 2013 09:20:15 GMT

ETag/If-None-Match:ETag是根据文件属性通过一定算法生成的资源标识,也是用来确定客户端请求的资源是否有更新。如果服务器返回了一个ETag值给客户端,那么下次客户端请求时会带上If-None-Match参数来校验资源是否更新,没有更新的就返回304状态码。(效果基本等同于Last-Modified)

注意:

优先级:Cache-Control > Expires;

ETag需要计算,对于计算资源紧张的服务器来说是一种消耗,所以有些网站直接不使用ETag;

 

断点请求

Accept-Ranges:服务端支持断点下载时会返回这个响应头给客户端,当客户端知道这个以后就可以发送断点请求了。

Content-Length:响应信息的长度,告诉客户端当前请求返回了多少数据。这里要注意一下,用head方法提交请求时不会返回具体数据,但是这个Content-Length会返回完整数据的大小。

Range/Content-Range:客户端请求时提交名为Range的header,告诉服务器自己要请求哪部分的数据。比如:Range: bytes=0-1023表示请求第0到1023个字节.然后服务器返回这1024个字节的内容给客户端,响应头中会带上Content-Range。即:Content-Range: bytes 0-1023/4096,这个4096就是文件总大小。客户端下次请求可以从第1024个字节处开始,Range: bytes=1024-xxxx

编码

Accept-Encoding/Content-Encoding:前者是客户端支持接收的消息编码类型。默认是identity,可选值有gzip,compress等。后者是服务器端响应信息的内容编码类型,常用的就是压缩。压缩的好处显而易见,可以大大减少网络传输的开销,相对于服务器端压缩产生的cpu消耗,网络传输的减少显然更实在。常见形式:Content-Encoding: gzip,deflate,compress.通常我们对html,js,css,xml,json之类的响应结果可以进行压缩传输。

Transfer-Encoding:response header.响应消息的传输编码类型,规定了网络传输的形式。一般都是下面这种形式:Transfer-Encoding: chunked。当服务器产生动态内容,不知道响应信息的具体长度时,可以通过这个指定分块进行传输,处理多少数据就返回多少数据,这样不用等到数据都准备好了一次性返回。结合上面的内容编码,比如gzip,可以分块压缩并进行传输。另外,请注意,在使用这种编码传输时,我们是看不到Content-Length的,因为内容还没有完全生成。

 

Session和Cookie

http请求是无状态的请求,但是在我们的互联网应用中,经常需要标识用户状态信息来完成一些交互性的操作,比如用户认证要记录用户登录状态,购物车应用要记住用户选择的商品,广告投放应用要记录用户的历史浏览行为等等。这里就会用到session和cookie了。

session:是指http请求-响应的过程中客户端与服务器端的交互状态,这些信息被保存在服务器端,比如内存,数据库等。每个session都有一个唯一标识,由服务器生成,这个标识也要在客户端进行保存,这样客户端在下次请求时可以带上这个标识,方便服务器判断客户端的状态。

客户端对session的支持:

通过cookie保存session id,在请求时发送给服务器。

通过url的参数携带session id与服务器通信。

通过表单的隐藏字段携带session id与服务器通信。

session共享的问题:

在分布式应用中,我们的http server一般都架在反向代理或是负载均衡设备后面,这就会面临一个session共享的问题。也就是同一个用户的多个请求可能被分发到多个不同的机器,如果我们把session保存在机器本地内存中的话,就无法在多个机器间共享用户的session。这个问题,一般来说,我们可以有两种方式来解决:

把session存放到分布式的内存(eg:memcached)或是集中式存储中(eg:database)。

在反向代理或负载均衡设备上把相同用户的请求分发到同一台机器(这里要处理好机器宕机后请求重新分配的问题)。

cookie:在客户端保持状态化信息,每个cookie内容都属于特定的域(domain)和路径(path),出于安全考虑,不同域或路径下的cookie不能共享。

会话cookie:没有指定过期时间,保存在内存,浏览器关闭后就失效。

持久cookie:指定了过期时间,保存在浏览器本地。

详细内容可以参考:http://en.wikipedia.org/wiki/HTTP_cookie

需要注意的是cookie会存在一些安全方面的问题。

 

其他

X-Forward-For:request header. 用来标识用户的真实ip,特别是通过代理(正向或反向)访问服务器或是服务器在负载均衡设备后面的情况。格式:X-forward-For: client,proxy1,proxy2,…最左边的是最接近客户端的ip。

User-Agent:request header.服务器用来识别客户端基本信息的请求头。一般这个在识别搜索爬虫的时候有用,也可以用这个来做一些客户端的统计。

Referer:request header.客户端访问服务器时,这个Referer来指定请求来源,比如是从哪个网站链接过来的,我们在一些统计中会经常用到这个。另外,还有一个重要的用途就是在需要资源防盗链的场景中来过滤非法的请求来源(但是,这个referer是客户端可以伪造的)。

Location:response header.在301/302状态码的响应头中,都会带上这个Location头,来指示客户端用新的地址去访问需要的资源。

Connection:request/response header.在http/1.1中,客户端和服务端默认都是保持连接的,也就是Connection: keep-alive.如果任何一方不想保持连接,都可以把这个值设置为close.默认情况下,客户端和服务端会保持一个长连接,这样客户端就可以用这个连接发送多次http请求,减少频繁创建连接带来的消耗。对于这个参数,在服务端可能要做更多的设置,比如连接keep-alive的时间,服务器内核的一些网络参数设置(针对tcp)。

Content-Type该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。当Content-Type的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.

Content-Disposition的作用

当Content-Type的类型为要下载的类型时,这个信息头会告诉浏览器这个文件的名字和类型。在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。

Authorization头的作用

Authorization的作用是当客户端访问受口令保护时,服务器端会发送401状态码和WWW-Authenticate响应头,要求客户机使用Authorization来应答。

HTTP协议是无状态的和Connection: keep-alive的区别

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系

HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)

从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接,但Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间.

HTTP协议之Get和Post

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

我们看看GET和POST的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的数据放在HTTP包的Body中.
  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值。
  4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

参考

http://my.oschina.net/u/142836/blog/170179

http://blog.csdn.net/lgl125/article/details/7234122

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">