概述
百度解释:Http协议(超文本传输协议)是一种通信协议,它允许将超文本标记语言即HTML文件从WEB服务器上传送到客户端的浏览器。它详细规定了浏览器和万维网(WWW= World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档。在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。Http主要应用于网页与服务器之间的通信,其他的通信只要遵循Htpp协议,也可以应用。例如 QQ、迅雷等软件。
HTTP协议特点
1、 支持客户/服务器模式。支持基本认证和安全认证。
2、 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。为了解决这个问题,Web程序引入了Cookie机制来维护状态。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1、 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2、 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3、 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4、 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
Http消息结构
1、 支持客户/服务器模式。支持基本认证和安全认证。
2、 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3、 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4、 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。为了解决这个问题,Web程序引入了Cookie机制来维护状态。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1、 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2、 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3、 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4、 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
Http消息结构
Request 消息结构
Request消息结构分为三部分,Request Line(请求行)、Request Header(请求头)、以及Body(请求正文)。
Request Header(请求头)常见属性讲解:
1、 IF-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
2、 If-None-Match: If-None-Match和 ETag 一起工作,工作原理是在HTTPResponse中添加 ETag 信息。当用户再次请求该资源时,将在HTTPRequest 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和 Etag. 使用这样的机制将提高网站的性能。
3、 Cache-Control:指定请求和响应遵循的缓存机制。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程)。
Cache-Control :Public 可以被任何缓存所缓存
Cache-Control :Private 内容只缓存到私有缓存中
Cache-Control :no-cache 所有内容都不会被缓存
Cache-Control :no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
Cache-Control :max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
Cache-Control :min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
Cache-Control :max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
4、 Accept:浏览器端可以接受的MIME类型。例如:Accept: text/html代表浏览器可以接受服务器返回的类型为 text/html 也就是我们常说的Html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误。通配符 * 代表任意类型,例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。
5、 Accept-Encoding:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。例如: Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。
6、 Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
7、 Accept-Charset :浏览器可接受的字符集。如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。
8、 User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
9、 Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
10、Connection:
Connection: keep-alive:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
11、Host:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
12、Cookie:最重要的请求头之一, 将cookie的值发送给HTTP服务器。
13、Content-Length:表示请求消息正文的长度。
14、Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
15、UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
16、From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
17、Range:可以请求实体的一个或者多个子范围。
Request请求方法定义了9种请求方法(动作)来表明Request-URI指定的资源的不同操作方式:
1、 OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
2、 HEAD: 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
3、 GET :主要用于向指定的URL(URI)请求资源(资源文件或是数据均可), 可以带参数也可以不带参数, 带参数时,参数是明文传递,你可以在浏览器的地址栏中看到参数名及参数值,GET安全性不高,所以常用于安全性要求低的场合。
4、 POST: 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
5、 PUT: 向指定资源位置上传其最新内容。
6、 DELETE: 请求服务器删除Request-URI所标识的资源。
7、 TRACE: 回显服务器收到的请求,主要用于测试或诊断。
8、 CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
9、 PATCH: 用来将局部修改应用于某一资源。
Response消息结构
Response消息结构类似Request的消息结构,也分为三部分,Response Line(状态行)、Respose Header(消息头)、以及Body(响应正文)。
Response Header(消息头)常见属性讲解:
1、 Allow:服务器支持哪些请求方法(如GET、POST等)。
2、 Date:表示消息发送的时间,时间的描述格式由rfc822定义
3、 Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它,重新从服务器获取,会更新缓存。过期之前使用本地缓存。HTTP1.1的客户端和缓存会将非法的日期格式(包括0)看作已经过期。
4、 P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题。
5、 Set-Cookie:非常重要的header, 用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。
6、 ETag:和If-None-Match 配合使用。
7、 Last-Modified:用于指示资源的最后修改日期和时间。
8、 Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此 HttpServletResponse 提供了一个专用的方法setContentType。可在web.xml文件中配置扩展名和MIME类型的对应关系。
9、 Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。
10. Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通byteArrayStream.writeTo(response.getOutputStream()发送内容。
11. Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。只有在解码之后才可以得到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页面,为其他浏览器返回普通页面。
12. Content-Language:WEB服务器告诉浏览器自己响应的对象所用的自然语言。
13. Server:指明HTTP服务器用来处理请求的软件信息。
14. X-Powered-By:表示网站是用什么技术开发的。
15. Location:用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。
16. Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。
URL解析
URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下:
schema://host[:port#]/path/.../[?query-string][#anchor]
scheme :指定低层使用的协议(例如:http、https、ftp)。
Host:HTTP服务器的IP地址或者域名。
port# :端口号。
path :访问资源的路径。
query-string:发送给http服务器的数据参数。
Anchor:锚。
例:http://127.0.0.1:8080/pub/pub_party_merchant.html?merchantName=Test#stuff
scheme : http
Host:127.0.0.1
Port:8080
Path:/pub/pub_party_merchant.html
Query-string : merchantName=Test
Anchor:stuff
状态码解析
在Response Line中包含了服务器返回给客户端的状态,以告诉客户端服务器是否产生了预期的Response。
HTTP/1.1中定义了5类状态码,状态码由三位数字组成,第一个数字定义了响应的类别:
1XX 提示信息 - 表示请求已被成功接收,继续处理。
2XX 成功 - 表示请求已被成功接收,理解,接受。
3XX 重定向 - 要完成请求必须进行更进一步的处理。
4XX 客户端错误 - 请求有语法错误或请求无法实现。
5XX 服务器端错误 - 服务器未能实现合法的请求。
常见状态码说明:
200 OK:表明该请求被成功地完成,所请求的资源发送回客户端。
302 Found:重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request
304 Not Modified:代表上次的文档已经被缓存了,还可以继续使用。
400 Bad Request:客户端请求与语法错误,不能被服务器所理解。
403 Forbidden :服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在(输错了URL)。
500 Internal Server Error:服务器发生了不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。