HTTP协议初探

来源:互联网 发布:原油软件制作公司 编辑:程序博客网 时间:2024/05/16 18:48
       发现网络协议的知识对后台开发人员来说,还是非常重要的,所以特地去了解了以下,并作学习笔记,方便自己查阅。

HTTP协议详解
       HTTP就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范——HTTP协议。HTTP协议从WWW服务器传输超文本到本地浏览器,可以使浏览器更加高效。HTTP协议不仅保证计算机正确快速地传输超文本文档,还能确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。   

                      图1:HTTP协议在OSI模型中的位置
     HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP通常承载于TCP协议之上,有时也承载于TLS或SSL协议之上,这时候,就成了HTTPS。默认HTTP的端口号为80,HTTPS的端口号为443.

     HTTP协议是一个无状态协议,同一个客户端的这次请求和上次请求没有对应关系,会使TCP连接频繁建立和断开,交互效率不高。
     SPDY协议是Google推出的协议,优化了浏览器和服务器之间的通信,支持流复用,具备优先级的请求、主动发起请求、强制SSL安全传输等先进的特性。

HTTP协议工作
     浏览网页是HTTP协议的主要应用,但不代表HTTP协议只能应用于网页的浏览。只要通信的双方都遵守HTTP协议,其就有用武之地,比如腾讯QQ、迅雷等软件都使用HTTP协议(当然还包括其他的协议)。
     1)客户机与服务器建立连接。
     2)建立连接后,客户机发送一次一个请求给服务器。格式为:前边是统一资源标识符(URL)、中间是协议版本号,后边是MIME信息(包括服务器信息、实体信息和可能的内容)。
     3)服务器接到请求后,给予相应的响应信息。格式为:首先是一个状态行(包括信息的协议版本号、一个成功或错误的代码),然后是MIME信息(包括服务器信息、实体信息和可能的内容)。
     4)客户端接收服务器返回的信息并显示在用户的显示屏上,然后客户机与服务器断开连接。

1.请求
     在发起请求前,需要先建立连接。
     连接是一个传输层的实际环流,它建立在两个相互通信的应用程序之间。不论是request还是response的header中包含了值为close的connection,都表明当前正在使用的TCP连接在请求处理完毕后会被断掉,以后client再进行新的请求必须建立新的TCP连接。
     HTTP请求由三部分组成:请求行、消息报头、请求正文。请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

     Method Request-URI HTTP-Version CRLF
     
     Method:请求方法。
             Request-URI:一个统一资源标识符。

             HTTP-Version:请求的HTTP协议版本。

             CRLF:回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
     
     请求方法(所有方法全为大写):
             GET:向特定的资源发出请求。注意:GET方法应该只用在读取数据,不应当被用于产生“副作用”的操作中,就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。

             POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

             HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。

             PUT:向指定资源位置上传其最新内容。 

             DELETE:请求服务器删除Request-URI所标识的资源。 

             TRACE:回显服务器收到的请求,主要用于测试或诊断。 

             CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

             OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。

2.响应
     在接收和解释请求信息后,服务器返回一个HTTP响应消息。HTTP由三个部分组成,分别是:状态行、消息报头、响应正文。

     状态行格式:

     HTTP-Version Status-Code Reason-Phrase CRLF

     参数说明:

             HTTP-Version:服务器HTTP协议的版本。

             Status-Code:服务器发回的响应状态代码。

             Reason-Phrase:状态代码的文本描述。

     状态代码由三位数字组成,第一个数字定义了响应的类别:

             1xx:指示信息——请求已接收,继续处理。

             2xx:成功——请求已被成功接收、理解、接受。

             3xx:重定向——要完成请求必须进行更进一步的操作。

             4xx:客户端错误——请求由语法错误或请求无法实现。

             5xx:服务器端错误——服务器未能实现合法的请求。

     常见状态代码、状态描述和说明如下:

             200 OK:客户端请求成功。

             400 Bad Request:客户端请求有语法错误,不能被服务器所理解。

             401 Unauthorize:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。

             403 Forbidden:服务器收到请求,但是拒绝提供服务。

             404 Not Found:请求资源不存在,例如输入了错误的URL。

             500 Internal Server Error:服务器发生不可预期的错误。

             503 Server Unavailable:服务器不能处理客户端的请求,一段时间后可能恢复正常。

             例如,响应信息”HTTP/1.1 200 OK(CRLF)“,表示响应请求到达服务器后被成功识别,返回成功标记。响应正文就是服务器返回的资源的内容。

3.报头
     HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。

     组成形式:

          名字+:+空格+值

     PS:消息报头域的名字是不区分英文大小写的。
            1)普通报头中有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息(如缓存控制、连接控制等)。

            2)请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息(如UA头、Accept等)。

            3)响应报头定义了关于实体正文和请求所标识的资源的元信息,例如有无实体正文。

     比较重要的几个报头:
     Host:头域指定请求资源的Internet主机和端口号,必须表示请求URL的原始服务器或网关的位置。

     User-Agent:简称UA,内容包含发出请求的用户信息。通过UA包括包含浏览器者的信息,主要是浏览器的名称版本和所用的操作系统。

     Accept:告诉服务器可以接受的文件格式。

     Cookie:Cookie分两种,一种是客户端向服务器端发送的,使用Cookie报头,用来标记一些信息;另一种是服务器发送给浏览器的,报头为Set-Cookie。二者的主要区别是Cookie报头的value里可以有多个Cookie值,并且不需要显式指定domain等。而Set-Cookie报头里一条记录只能有一个Cookie的value,需要指明domain、path等。

     Cache-Control:指定请求和响应应遵循的缓存机制。

     Referer:头域允许客户端指定请求URI的源资源地址,Referer通常是流量统计系统用来记录来访者地址的参数。
     Content-Length:内容长度。

     Content-Range:响应的资源范围。可以在每次请求中标记请求的资源范围,在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,实现断点续传。迅雷就是基于这个原理,使用多线程分段读取网络上的资源,最后再合并。
     Accept-Encoding:指定所能接受的编码方式。

     自定义报头:在HTTP消息中,也可以使用一些在HTTP1.1正式规范里没有定义的头字段,这些头字段称为自定义的HTTP头或者扩展头。



参考资料:《PHP核心技术与最佳实践》   列旭松 陈文 著
1 0