一、HTTP是什么

超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。HTTP是一种属于应用层的面向对象的协议,一次HTTP操作称为一个实物,其简单工作过程如图:

     

java中ous通道 http通讯java_HTTP

其工作过程可以分为四步:

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

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

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

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

以上的过程中任意一步出错,那么产生的错误信息将返回到客户端,由显示屏输出。对于用户来说,这些过程都是HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。HTTP协议的主要特点可以概括如下:

1、支持客户端/服务器模式

2、简单快速,客户端向服务器发送请求服务时,只需要传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快

3、灵活,HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记

4、无连接,无连接的含义是限制每次连接只处理一个请求,服务器处理完成客户端的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间

5、无状态,HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

二、HTTP请求

 2.1、HTTP请求包括的内容

 客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求

一个请求行、若干消息头、以及实体内容

范例:

java中ous通道 http通讯java_服务器_02

2.2、HTTP请求的细节——请求行

请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
  用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
  不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
  GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
  如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。

2.3、HTTP请求的细节——消息头

请  求  头

说      明

Accept

指定客户端能够接收的内容类型,如Accept:text/plain,text/html

Accept-Charset

指定客户端可以接受的字符集编码,如Accept-Charset:UTF-8

Accept-Encoding

指定浏览器可以支持的Web服务器返回内容压缩编码类型,如Accept-Encoding:gzip,deflate

Accept-Language

指定浏览器可以接受的语言,如Accept-Language:zh-cn,zn,en

Authorization

HTTP授权的授权证书,如Authorization:Basic...

Cache-Control

指定请求和响应遵循的缓存机制,如Cache-Control:no-cache

Connection

表示是否需要持久连接(HTTP1.1默认进行持久链接),如Connection:close

Cookie

HTTP请求发送时会把保存在该请求域名下的所有cookie值一起发送给Web服务器,如Cookie:$Version=1;Skin=new;

Content-Length

表示请求的请求体的内容长度,这个长度是经过了压缩后的长度,如Content-Length:348

 Content-Type

表示请求的请求体对应的MIME信息,如Content-Type:application/x-www/form-urlencoded 

 Date

表示请求发送的日期和时间,如Date:Oct, 24 Nov 2015 20:12:30 GMT

 Host

表示请求的服务器的域名和端口号,如Host:home.cnblogs.com

 Pragma

表示用来包含实现特定的指令,如Pragma:no-cache 

 Referer

表示从哪个链接链到当前地址,如Referer: 

 User-Agent

表示发出请求的用户信息(如用户操作系统、浏览器和其他属性),如User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

例如:

Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, 
    application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive

三、HTTP响应

    3.1、HTTP响应包括的内容

一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。

  

java中ous通道 http通讯java_服务器_03

范例:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 105
Date: Tue, 27 May 2014 16:23:28 GMT

<html>
    <head>
        <title>Hello World JSP</title>
    </head>
    <body>
        Hello World!

    </body>
</html>

3.2、HTTP响应头

响  应  头

说      明

Allow

表示对某网络资源的有效请求行为,不允许则返回405,如Allow:GET,HEAD

Cache-Control

表示告诉所有的缓存机制是否可以缓存及哪种缓存类型,如Cache-Control:no-cache

Content-Encoding

表示Web服务器只是的返回内容压缩编码类型,如Content-Encoding:gzip

Content-Language

表示响应体的语言,如Content-Language:en,zh

Content-Length

表示响应体的内容长度,这个长度是经过了压缩后的长度,如Content-Language:348

Content-Type

表示返回内容的MIME类型,如Content-Type:text/html;charset=utf-8

 Date

表示原始服务器消息发出的时间,如Date:Oct, 24 Nov 2015 20:12:30 GMT

 Expires

表示响应过期的日期和时间,如Expires:Sat, 24 Oct 2015 20:45:30 GMT 

Location

用来重定向接收方到非请求URL的位置来完成请求或标识新的资源,如Location:http://www.sina.com.cn/

 Last-Modified

表示资源的最后修改时间,如Last-Modified: 表示响应过期的日期和时间,如Expires:Sat, 24 Oct 2015 20:45:30 GMT 

 Retry-After

表示如果响应体如果暂时不可取得,客户端在指定时间之后再尝试,如Retry-After:120 

 Server

表示Web服务器软件名称,如Server:Apache/1.3.6(Unix) 

Set-Cookie 

表示设置Http Cookie,如Set-Cookie:UserID=RickyXu;Max-Age=3600;Version=1 

 Transfer-Encoding

表示文件传输编码,如Transfer-Encoding-chunked 

www.Authenticate 

表示客户端请求实体应该使用的授权方案,如WWW-Authenticate:Basic 

一个HTTP响应头的例子,比如我访问了我的空间:

java中ous通道 http通讯java_java中ous通道_04

最后几个"X-"开头估计是有特殊用途而通过代码设置到HTTP HEADER里面去的内容

3.3、HTTP响应的细节——状态行

状态行格式: HTTP版本号 状态码 原因叙述<CRLF>

      举例:HTTP/1.1 200 OK

  状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

  

java中ous通道 http通讯java_客户端_05

列举一下常见的HTTP状态码:

状  态  码

语      法

200

表示客户端请求成功,通常这表示服务器提供了请求的网页

201

表示客户端请求成功并且服务器创建了新的资源

202

表示服务器已经接受请求但尚未处理

204

表示服务器成功处理了请求但没有任何返回内容

302

表示临时跳转,跳转的地址通过Location指定

400

表示客户端请求有语法错误,不能被服务器识别

403

表示服务器收到请求,但是拒绝提供服务

404

表示服务器找不到请求的资源

500

表示服务器发生了不可预期的错误

503

表示服务器目前无法使用(由于超载或停机维护),通常这只是暂时状态

505

表示服务器不支持请求中所使用的HTTP协议版本

四、HTTP缓存

想想现在的大型网站,随便一个页面都是一两百个请求,每天PV量过千万、过亿,如果没有缓存,用户体验会急剧下降,同时服务器压力和网络带宽都面临严重的考验。

缓存分为服务端缓存和客户端缓存,客户端缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问。浏览器缓存有两种机制:HTML Meta标签和HTTP HEADER信息。

1、HTML META标签

浏览器缓存机制主要是HTTP协议定义的缓存机制(如Expires、Cache-Control等),但是也有非HTTP协议定义的缓存机制,如使用HTML META标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器读取。使用上很简单,但只有部分浏览器支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身,而广泛应用的还是HTTP HEADER信息来控制缓存。

2、HTTP HEADER信息

当使用了HTTP HEADER信息来控制缓存,那么浏览器第一次请求时:

java中ous通道 http通讯java_服务器_06

浏览器再次请求时:

java中ous通道 http通讯java_java中ous通道_07

几个重要的概念:

(1)Expires策略

Expires策略是Web服务器响应消息头字段,在响应HTTP请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据而无须再次请求。不过Expires策略在HTTP1.1基本忽略,因为Expires返回的到期时间是服务器的时间,如果客户端和服务器的时间相差很大,那么误差就很大。

(2)Cache-Control策略

Cache-Control策略与Expires策略的作用一致,都是指当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发送请求到服务器取数据。只不过Cache-Control的选择更多、被各浏览器支持得更好、设置得更细致,如果同时设置的话,其优先级也比较高(高于Expires),Cache-Control的选择有:

选    择

作    用

public

表示响应可被任何缓存区缓存,在响应头中设置

private

表示对于单个用户的整个或部分响应消息,不能被共享缓存处理,在响应头中设置

no-cache

表示请求或响应消息不被缓存,在请求头和响应头中都可以设置

no-store

表示防止重要的信息被无意发布,所有内容都不会被缓存到缓存中或者Internet临时文件中,在响应头中设置

must-revalidate/proxy-revaliate

表示如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置

max-age=xxx

表示缓存的内容将在xxx秒后失效,这个选项只有HTTP1.1可用,在响应头中设置

Pragma是为了兼容HTTP1.0,它的的作用和Cache-Control是一样的。

如果我们使用Ctrl+F5组合件刷新一个页面时,那么在HTTP请求头中会增加一些信息,它告诉服务器我们要获取的是最新的数据而不是缓存。