码迷,mamicode.com
首页 > Web开发 > 详细

http协议详解

时间:2016-04-19 12:16:11      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

HTTP协议

1、概述:

HTTP协议(超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

 

2、HTTP在TCP/IP协议栈中的位置:

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:

技术分享   

默认HTTP的端口号为80,HTTPS的端口号为443。

 

3、HTTP的请求响应模型:

HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:

技术分享技术分享   技术分享   

这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

 

4、工作流程:

一次HTTP操作称为一个事务,其工作过程可分为四步:

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

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

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

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

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

 

5、Http 消息格式:

START_LINE <CRLF>

MESSAGE_HEADER<CRLF>

<CRLF>

MESSAGE_BODY<CRLF>

其中<CRLF>代表回车换行。

第一行START_LINE指出消息是请求消息还是响应消息。即识别一个要执行的远程过程(请求消息),或识别请求的“状态”(响应消息)。

之后几列说明一些限定请求和响应的选项和参数。

有一个或多个MESSAGE_HEADER<CRLF>,由一个空白行结束。http中定义了很多首部类型,一些是请求消息的,一些属于响应消息,还有一些是消息主体中携带的数据。

MESSAGE_BODY<CRLF>是被请求的内容。请求消息中这个一般是空项。

 

6、http请求消息:

首行说明的三件事:应完成的操作,应在其上完成操作的网页和所用的http版本。

所有的http请求操作:

HEAD:获取指定网页的状态信息。用来测试一个超文本链接的合法性,或查看一个特定网页在上一次浏览器获取后是否被修改过。

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

GET:获取指定的网页,在浏览器希望取回和显示一个网页时调用。

向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,其中一个原因是GET可能会被网络蜘蛛等随意访问。

POST:递交信息到服务器。

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

OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求

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

PUT:在指定的URL下存储文档。即向指定资源位置上传其最新内容。

DELETE:删除指定资源。

TRACE:回送请求消息。

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

 

客户端请求例子:

GET /product.jsp HTTP/1.1

 

Accept :image/gif.image/jpeg,*/*

Accept-Language :zh-cn

Connection :Keep-Alive

Host :localhost

User-Agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)

Accept-Encoding :gzip,deflate

 

username=wsz&productId=1

(1)请求方法URL协议/版本

请求的第一行是“请求方法 URL 协议/版本”:GET  / product.jsp   HTTP/1.1

(2)请求头(RequestHeader)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

Accept :image/gif.image/jpeg.*/*--------- 浏览器可接受的MIME类型;(MIME规定了用于表示各种各样的数据类型的符号化方法。)

Accept-Language :zh-cn----------浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;

Connection :Keep-Alive----------表示是否需要持久连接。值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时,显著地减少下载所需要的时间。

Host : localhost---------------初始URL中的主机和端口;

User-Agent:Mozilla/5.0(Macintosh; Intel Mac OS X 10_10_5) -------浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;

Accept-Encoding :gzip,deflate.---------- 浏览器能够进行解码的数据编码方式

(3)请求正文

请求头和请求正文之间是一个空行,表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:

username=wsz&productId=1

在以上的例子的HTTP请求中,请求的正文只有一行内容。在实际应用中,HTTP请求正文可以包含更多的内容。

 

 

7、http响应消息:

也是以START_LINE<CRLF>为起点,这一行说明使用的http版本,一个3位码指示请求是否成功,使用一个文本串给出响应的原因。

例如:上面的图片中200OK 表示客户端请求成功

http/1.1 202 Accepted表示服务器满足请求。

http/1.1 404 Not Found表示网页没有找到而不能满足请求。

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

http/1.1 500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。

 

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

- 2xx: 成功           表示请求已经被成功接收、理解、接受。

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

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

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

 

【详情见附件】

一个或多个MESSAGE_HEADER<CRLF>,传递返回给客户的附加消息。

 

服务端响应:

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2009 12:28:53 GMT

Server: Apache

Content-Length: 51

Content-Type: text/plain

 

Date:当前的GMT时间。

Server: 服务器名字。

Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容;

Content-Type: 表示后面的文档属于什么MIME类型。默认为text/plain,但通常需要显式地指定为text/html。

 

【字段内容,见附件】

 

 

Ps: URL统一资源标示符,URI表示资源的字符串,资源不必可获取或可访问。

只有被特意用于定位资源时能成为URL

附件:

GET和POST请求详解

GET方式:是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。

POST方式:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:

1:对现有资源的解释;

2:向电子公告栏、新闻组、邮件列表或类似讨论组发信息;

3:提交数据块;

4:通过附加操作来扩展数据库 。

从上面描述可以看出,Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。

GET与POST方法有以下区别:

(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTMLHEADER内提交。

(2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

(3)安全性问题。正如在(1)中提到,使用Get 的时候,参数会显示在地址栏上,而Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用post为好。

(4)安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST请求就不那么轻松了。POST表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。

请求头

HTTP最常见的请求头如下:

Accept:浏览器可接受的MIME类型;(MIME规定了用于表示各种各样的数据类型的符号化方法。)

Accept-Charset:浏览器可接受的字符集;

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间;

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;

Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(HTTP1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小;

Content-Length:表示请求消息正文的长度;

Cookie:这是最重要的请求头信息之一;

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它;

Host:初始URL中的主机和端口;

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“NotModified”应答;

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

响应头

HTTP最常见的响应头如下所示:

Allow

服务器支持哪些请求方法(如GET、POST等)。

Content-Encoding

文档的编码(Encode)方法。

只有在解码之后才可以得到Content-Type头指定的内容类型。

利用gzip压缩文档能够显著地减少HTML文档的下载时间。

Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

Content-Length

表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。

如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

Content-Type

表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。 

Date

当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

Expires

应该在什么时候认为文档已经过期,从而不再缓存它?

Last-Modified

文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。

Last-Modified也可用setDateHeader方法来设置。

Location

表示客户应当到哪里去提取文档。

Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

Refresh

表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 
注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 

注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 

注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

Server

服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

Set-Cookie

设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。

WWW-Authenticate

客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 
注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。














































实体头

实体头用坐实体内容的元信息,描述了实体内容的属性,包括实体信息类型,长度,压缩方法,最后一次修改时间,数据有效性等。

Allow:GET,POST

Content-Encoding:文档的编码(Encode)方法,例如:gzip,见“2.5 响应头”;

Content-Language:内容的语言类型,例如:zh-cn;

Content-Length:表示内容长度,eg:80,可参考“2.5响应头”;

Content-Location:表示客户应当到哪里去提取文档,例如:http://www.dfdf.org/dfdf.html,可参考“2.5响应头”;

Content-MD5:MD5 实体的一种MD5摘要,用作校验和。发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。Eg1:Content-MD5:<base64 of 128 MD5 digest>。Eg2:dfdfdfdfdfdfdff==;

 

Content-Range:随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。Eg1:Content-Range:1001-2000/5000,eg2:bytes2543-4532/7898

Content-Type:标明发送或者接收的实体的MIME类型。Eg:text/html;charset=GB2312       主类型/子类型;

Expires:为0证明不缓存;

Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06May 2008 02:42:43 GMT.


扩展头

在HTTP消息中,也可以使用一些再HTTP1.1正式规范里没有定义的头字段,这些头字段统称为自定义的HTTP头或者扩展头,他们通常被当作是一种实体头处理。

现在流行的浏览器实际上都支持Cookie,Set-Cookie,Refresh和Content-Disposition等几个常用的扩展头字段。

Refresh:1;url=http://www.dfdf.org  //过1秒跳转到指定位置;

Content-Disposition:头字段,可参考“2.5响应头”;

Content-Type:WEB 服务器告诉浏览器自己响应的对象的类型。

eg1:Content-Type:application/xml;

eg2:applicaiton/octet-stream;

 

 

http的状态响应码

1**:请求收到,继续处理

100——客户必须继续发出请求

101——客户要求服务器根据请求转换HTTP协议版本

 

2**:操作成功收到,分析、接受

200——交易成功

201——提示知道新文件的URL

202——接受和处理、但处理未完成

203——返回信息不确定或不完整

204——请求收到,但返回信息为空

205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件

206——服务器已经完成了部分用户的GET请求

 

3**:完成此请求必须进一步处理

300——请求的资源可在多处得到

301——删除请求数据

302——在其他地址发现了请求数据

303——建议客户访问其他URL或访问方式

304——客户端已经执行了GET,但文件未变化

305——请求的资源必须从服务器指定的地址得到

306——前一版本HTTP中使用的代码,现行版本中不再使用

307——申明请求的资源临时性删除

 

4**:请求包含一个错误语法或不能完成

400——错误请求,如语法错误

401——未授权

HTTP 401.1 - 未授权:登录失败

  HTTP401.2 - 未授权:服务器配置问题导致登录失败

  HTTP401.3 - ACL 禁止访问资源

  HTTP401.4 - 未授权:授权被筛选器拒绝

HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

402——保留有效ChargeTo头响应

403——禁止访问

HTTP 403.1 禁止访问:禁止可执行访问

  HTTP403.2 - 禁止访问:禁止读访问

  HTTP403.3 - 禁止访问:禁止写访问

  HTTP403.4 - 禁止访问:要求SSL

  HTTP403.5 - 禁止访问:要求SSL 128

  HTTP403.6 - 禁止访问:IP地址被拒绝

  HTTP403.7 - 禁止访问:要求客户证书

  HTTP403.8 - 禁止访问:禁止站点访问

  HTTP403.9 - 禁止访问:连接的用户过多

  HTTP403.10 - 禁止访问:配置无效

  HTTP403.11 - 禁止访问:密码更改

  HTTP403.12 - 禁止访问:映射器拒绝访问

  HTTP403.13 - 禁止访问:客户证书已被吊销

  HTTP403.15 - 禁止访问:客户访问许可过多

  HTTP403.16 - 禁止访问:客户证书不可信或者无效

HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效

404——没有发现文件、查询或URl

405——用户在Request-Line字段定义的方法不允许

406——根据用户发送的Accept拖,请求资源不可访问

407——类似401,用户必须首先在代理服务器上得到授权

408——客户端没有在用户指定的饿时间内完成请求

409——对当前资源状态,请求不能完成

410——服务器上不再有此资源且无进一步的参考地址

411——服务器拒绝用户定义的Content-Length属性请求

412——一个或多个请求头字段在当前请求中错误

413——请求的资源大于服务器允许的大小

414——请求的资源URL长于服务器允许的长度

415——请求资源不支持请求项目格式

416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。

 

5**:服务器执行一个完全有效请求失败

  HTTP500 - 内部服务器错误

  HTTP500.100 - 内部服务器错误- ASP 错误

  HTTP500-11 服务器关闭

  HTTP500-12 应用程序重新启动

  HTTP500-13 - 服务器太忙

  HTTP500-14 - 应用程序无效

  HTTP500-15 - 不允许请求global.asa

  Error501 - 未实现

HTTP 502 - 网关错误

http协议详解

标签:

原文地址:http://blog.csdn.net/u012138931/article/details/51187518

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!