深入理解HTTP协议

http://www.blogjava.net/zjusuyong/articles/304788.html 

http://my.oschina.net/u/159469/blog/315817  


一、基础概念

  • HTTP介绍

    1.     HTTP是Hyper Text TransferProtocol(超文本传输协议)的缩写,用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。

    2.     RFC1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。

    3.     HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,是一个无状态的协议。

  • HTTP在协议栈中的位置

    1.    HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。        默认HTTP端口号为80,HTTPS端口号为443                                                                        


  • 工作流程

    1.    首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

    2.    建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

    3.    服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

    4.    客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

  • HTTP常用请求头



    1.    Accept:告诉服务器,客户端可以接受的资源类型,可以是一个类型,也可以是多个类型,多个类型间用逗号分隔开。特殊的*/*表示什么类型都可以;q表示希望返回资源的级别,没有的话默认是1,显示写的话通常在类型后用分号分开,往往是一个键值对的形式,如q=0.8。通常服务器会响应一个Content-type的响应头信息。

    2.    Accept-Encoding:告诉服务器,客户端支持什么样的压缩算法,可以为一个值或多个值,用逗号分开,常用的压缩算法有gzip。服务器在收到这个字段后,会检查服务器是否支持这个算法,如果支持,就会在发回响应信息前,对资源进行压缩,这样可以减小响应资源的大小。通常服务器会响应一个Content-Encoding:gzip的响应头信息。

    3.    Accept-Language:告诉服务器,客户端希望服务器返回的语言格式,对于支持国际话的服务端来说,这个字段很重要,可以通过这个字段,返回不同语言的资源。

    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。HTTP 1.1才有。


    5.    Connection:客户端发送的值往往是keep-alive,这个值告诉服务器自己打开的是一个长tcp连接,服务器接受到这个值后,如果接受这个长连接,就会返回Connection:keep-alive,这样当客户端再有请求发送时,就会重用这个tcp连接;如果不接受长连接就会返回Connection:close。

    6.    Cookie:这个值是服务器存储在客户端的数据,cookie是一组键值对,用;分隔开。

    7.    Host:Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。(只在HTTP 1.1 中有)

    8.    User-Agent:User Agent中文名为用户代理,简称UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

    9.    Referer:主要用来让服务器判断来源页面, 即用户是从哪个页面来的,通常被网站用来统计用户来源,是从搜索页面来的,还是从其他网站链接过来,或是从书签等访问,以便网站合理定位。

    10. if-modified-since:这个值是服务器上次响应时请求时发送给客户端的date时间,如果服务器看到这个字段,如果在这段时间没有修改过资源,服务器就会返回304not modified,如果修改了,就返回资源。

    11. if-none-match:这个值的意义跟if-modified-since一样,也是一个条件请求,但这个值比上面的值有增强效果,因为文件即使修改时间变了,不一定说明资源变了。

    12. Range:可以告诉服务器,只请求资源的一段,值可以是这样bytes=100-1000,通过这个,可以做到断点下载。

    13. Authorization:当服务器资源需要权限才能访问时,客户端会带上这个请求头信息,将认证信息通过这个字段传递给服务器,通常这个值会采用base64编码,将username:password类型的值编码后通过网络传递给服务器,因为base64编码是可逆的,不够安全,所以现在的安全控制很少用这种方式,一般是用https。

  • HTTP常用响应头


    1.    Content-Encoding:gzip,告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

    2.    Content-Type:text/html;charset=UTF-8,告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

    3.    Date:Sun,21 Sep 2014 06:18:21 GMT,这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

    4.    Expires:Sun, 1 Jan 2000 01:00:00 GMT,这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=***这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

    5.    Transfer-Encoding:chunked,这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

    6.    Content-leng:资源长度,如果服务器响应头中没有Transfer-Encoding:chunked,也就是说如果资源不是分块传输的,那么这个字段就是必须的,因为如果服务器端不告诉客户端资源的长度,那么在Connection:keep-alive,也就是说客户端与服务器端是长连接时,客户端就无法确定资源在什么时候结束。所以这个响应头对于静态资源时必须的。

  • HTTP常见响应状态码

    1.     200OK:代表一次成功的http请求。

    2.     204No Content:请求已经被服务器成功执行,但是服务器不会返回资源内容,这个状态码可以这样理解:就是告诉客户端,你的请求我已经处理了,但是我没东西答复你,你也不用改变什么。

    3.      301Moved Permanently:表示请求的URL已经永久的改变了。这是一些服务端在迁移服务器时会经常用到的状态码。如果服务端返回了301状态码,那么在响应头中往往会包含一个Location响应头,它包含了资源的新地址。通常浏览器遇到这个响应状态码,会直接跳转到新的地址,有些浏览器会缓存新的地址(Firefox),在下次请求时,不去请求老的服务器,只去请求新的url。所以,如果你的资源部是不是永久改变的话,那么请慎用这个状态码。

    4.      302Found:如果你的资源搬离只是临时的,那么请使用这个状态响应码。在一些企业应用中,302往往作为一种重定向的手段,比如说将请求转到单点认证服务器。

    5.      304Not Modified:这个状态码告诉客户端资源并没有发生改变,可以继续使用缓存副本,这个状态码可以说让开发人员又爱又恨,为什么这么说呢?因为我们需要这个状态码,让浏览器可以更多的使用缓存,提高网站性能。但是,我们在修改代码后,往往又不希望因为缓存问题导致客户使用时出现bug。所以如何很好的配置服务器缓存策略是一个需要思考的问题。

    6.      401Unauthorized: 表示客户端访问的资源是受保护的,服务器希望客户端能够带上认证信息后,再去请求服务器资源。服务器会在响应头中带上WWW-Authenticate,告诉客户端编码方式

    7.      403Forbidden:服务器认为客户端没有访问资源的权限。

    8.      404Not Found:资源没有找到,通常是用在请求静态资源时,服务器会返回。如果服务器报了404错误,服务器端开发人员应该跟踪日志,查找资源找不到的原因。当然了,还有可能是被代理拦截了,然后强制返回404。

    9.      500Internal ServerError:服务端错误,往往出现在动态资源的请求中,出现这个错误的原因很多。但是出现这个错误,往往是程序编码问题,开发人员应该快速定位问题,尽快解决问题。

  • Cookie和Session:Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。

    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机制更安全些.因为它不会任意读取客户存储的信息。

  • HTTP 1.1和HTTP 1.0的区别:http://blog.csdn.net/elifefly/article/details/3964766 



作者:龙猫小爷
链接:http://www.jianshu.com/p/b5993a20292a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值