无论搞WEB运维还是Web开发的人员,都需要了解HTTP协议。只有对http协议熟练掌握了,在遇到问题时候才能够迎刃而解。所以熟练掌握http协议是很有必要的。


1.Http协议

    > 定义

    超文本传输协议是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

    HTTP协议和TCP/IP协议族的其他众多的协议相同,用于客户端和服务端之间的通信。请求访问文本或图像资源的一端称为客户端,而提供资源相应的一端称为服务器端。


    > Http协议版本

Http/0.9 1990年问世 并没有正式的标准被建立
Http/1.0 1996年5月发布 RFC1945标准
Http/1.1 1997年1月发布 RFC2068标准-->RFC2116标准

    新一代HTTP/2.0正在制定中,但要达到较高的使用覆盖率,估计仍需要假以时日。


2.HTTP协议具体实现

    >通过请求和响应的交换达成协议

    http协议规定,请求从客户端发出,最后服务器端响应该请求并返回。首先从客户端开始建立通信,服务器收到请求之前不会发送相应。

    Http协议详解_第1张图片

    >HTTP协议特性

    http协议是一种无状态协议。http协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。

    使用http协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求和响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。

    可是,随着WEB的不断发展,因无状态而导致业务处理便得棘手的情况很多。比如,用户登入到一家购物网站,即使他跳转到该站的其他页面后,也需要能继续保持登入状态。这对这个实例,网站为了能够掌握是谁送出的请求,需要保存用户的状态。

    HTTP协议虽然是无状态协议,但为了实现期望的保存状态功能,于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

    >请求URI定位资源

    HTTP协议使用URI定位互联网上的资源。正是因为URI的特定功能,在互联网上任意位置的资源都能访问到。

    在客户端请求访问资源而发送请求时,URI需要将作为请求报文的请求URI包含在内。

  Http协议详解_第2张图片

    >HTTP请求方式

    1.GET请求:获取资源

        GET方法用来请求访问已被URI识别的资源。指定的资源经服务器解析后返回响应内容。如果请     求的资源是文本,那就保持原样放回;如果是像CGI(Common Gateway Interface)那样的程序,则返     回经过执行后的输出结果。

    

    2.POST请求:传输实体主体

        POST方法用来传输实体的主体。

        虽然用GET方法也可以传输实体的主体。但一般不用GET方法进行传输,而是用POST方法。虽说     POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。


    3.PUT请求:传输文件

        PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内       容,然后保存到请求URI指定位置。

        但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,     因此一般的web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的同     类Web网站,就可能会开发使用PUT方法。

        PUT方式响应返回状态码204 No Content。

    

    4.HEAD请求:获取报文首部

        HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期     时间等。


    5.DELETE请求:删除文件

        DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定资源。

        但是,HTTP/1.1的DELETE方法本身和PUT方法一样不带验证机制,所以一般的Web网站也不使用     DELETE方法。当配合Web应用程序的验证机制,或遵循REST标准时还是有可能会开放使用的。

        DELETE请求,响应返回码204 No Content。

    

    6.OPTIONS请求:询问支持的方法

        OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

    

    7.TRANCE请求:追踪路径

        TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。

        发送请求时,在Max-Forwards首部字段中填写数值,没经过一个服务器端就将该数字减1,当数     值刚好减到0时,就停止继续传输,最后接收到请求的服务器段则返回状态码200 OK的响应。

        客户端通过TRACE方法可以查询发送出去的请求时怎样被加工修改/篡改的。这是因为,请求想     要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一些列操       作。但是,TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing)***,通     常就更用不到了。

  

    8.CONNECT请求:要求用隧道协议连接代理

        CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用       SSL(Secure Sockets Layer)和TLS(Transport Layer Security)协议把通信内容加密后经过网络隧     道传输。

    

    >HTTP持久连接

        HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。

        以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可     随着HTTP的普及,文档中包含大量图片的情况多了起来。比如,使用浏览器浏览一个包含多张图片     的HTML页面时,在发送请求访问THML页面资源的同时,也会请求该HTML页面里包含的其他资源。因     此,每次请求都会造成无谓的TCP连接建立和断开,增加通信的开销。

        为解决TCP连接问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接(HTTP Persistent               Connections)的方法。持久连接特点是:只要任意一端没有明确断开连接,就保持TCP连接状态。

        TCP连接的好处在于减少了TCP连接的重复建立和断开连接造成的额外开销,减轻了服务器端的     负载。另外,减少开销的那些部分时间,使HTTP请求和响应能够更早的结束,这样Web页面就显示速     度也就相应提高了。

        在HTTP/1.1中,所有的连接默认都支持持久连接,但是在HTTP/1.0内并未标准化。虽然一部分     服务器通过非标准化的手段实现了持久连接。但服务器段不一定能够支持持久连接。毫无疑问,除     了服务器端,客户端也需要支持持久连接。


    >管线化

        持久连接使得多数请求以管线化(pipelining)方式发送成为可能。以前发送请求后需要等待并     收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可直接发送下一个请求。

        这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。比如,当请求一     个包含10张图片的HTML Web页面,与挨个连接对比,用持久可以让请求更快结束。而线管化技术则     比持久连接还要快。请求数越多,时间差就越明显。


3.HTTP状态码

    HTTP状态码负责表示客户端HTTP请求的返回结果。标记服务器端的处理是否正常、通知出现的错误等工作。

    


类别 描述
1XX 信息性状态码 接收的请求正在处理
2XX 成功状态码 请求正常处理完毕
3XX 重定向状态码 需要进行附加操作以完成请求
4XX 客户端错误状态码 服务器无法处理请求
5XX 服务器错误状态码 服务器处理请求错误

    >2XX成功

    1. 200ok

        表示从客户端发来的请求在服务端被正常处理了。

    2. 204 No Content

        该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不包含实体的主体部分。     另外,也不允许返回任何实体的主体。比如,当从浏览器发出请求处理后,返回204响应,那么浏览     器显示的页面不发生更新。

    3.206 Partinal Content

        该状态码表示客户端进行了范围请求,而服务端成功执行了这部分的GET请求。响应报文中包含     Content-Range指定范围的实体内容。


    >3XX 重定向

    1. 301 Moved Permanently

        永久性重定向。该状态码表示请求的资源已被分配给了新的URI,以后应使用资源现在所指的       URI。也就是说,如果已经把资源对应的URI保存为标签了,这是应该Location首部字段提示的URI重     新保存。

    2. 302 Found

        临时性重定向。该状态码表示请求的资源已被分割了新的URI,希望用户本次能够使用新的URI     访问。

        和301状态码相似,当302状态码表示的资源不是被永久移动,只是临时性质的。换句话说,已

    移动的资源对应的URI将来还有可能发生改变。

    3.303 See other

        该状态码表示请求对应的资源存在着另一个URI,应使用Get方法重定向获取请求的资源。

        该状态码一般用在,首次请求POST,POST处理完成之后,通过GET请求到一个新的URI。

    4.304 NOT Modified

        该状态码表示客户端发送附带条件的请求时,服务器允许请求访问资源,但为满足条件的情况     下。304状态码返回时,不包含任何响应的主体部分。

    5.307 TEMPORARY Redirect

        临时重定向。307会遵守浏览器标准,不会从POST变成GET。但是,对于处理响应时的行为,每     种浏览器可能出现不同的情况。


    > 4XX 客户端错误

    1.400 Bad REQUEST

       该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后,再次发           送请求。

    2.401 Unauthorized

        该状态吗表示发送的请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。

    3.403 Forbidden

        该状态码表明对请求资源的访问被服务器拒绝了。

    4.404 Not Found

        该代码表明服务器无法找到请求的资源。

    

    >5XX 服务器错误

    1.500 Internal Server Error

        该状态码表明服务器端在执行请求时发生错误。


    2.503 Service Unavailable

        该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。


    以上是常见的14种HTTP 返回码。


    其实,HTTP协议还有很多内容。如果大家对HTTP协议感兴趣,可以参考RFC2116文档。