做过Socket编程的人都知道,当我们设计一个通信协议时,“头/体”的分割办法是很常用的,头见告对方这个是干什么的,体见告对 方怎么干。HTTP协议传输的也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,体是可选的,而头是必须的。每当我们打 开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码便是HTTP的体,那么头可以通过浏览器的开拓工具或者插件可以看到, 如果火狐的Firebug,IE的Httpwatch。
客户端通过发送 HTTP 要求向做事器要求对资源的访问。 它向做事器通报了一个数据块,也便是要求信息,HTTP 要求由三部分组成:要求行、 要求头和要求正文。
要求行:要求方法 URI 协议/版本
要求头(Request Header)
要求正文
下面是一个HTTP要求的数据:
POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
username=aa&password=1234
1、要求行:要求方法URI协议/版本
要求的第一行是“方法 URL 协议/版本”,并以 回车换行作为结尾。要求行以空格分隔。格式如下:
POST /index.php HTTP/1.1
以上代码中“GET”代表要求方法,“//ndex.php”表示URI,“HTTP/1.1代表协议和协议的版本。
根据HTTP标准,HTTP要求可以利用多种要求方法。例如:HTTP1.1支持7种要求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet运用中,最常用的方法是GET和POST。
URL完全地指定了要访问的网络资源,常日只要给出相对付做事器的根目录的相对目录即可,因此总是以“/”开头,末了,协议版本声明了通信过程中利用HTTP的版本。
要求方法
在 HTTP 协议中,HTTP 要求可以利用多种要求方法,这些方法指明了要以何种办法来访问 Request-URI 所标识的资源。HTTP1.1 支持的要求方法如下表所示:
HTTP1.1 中的要求办法:
方法
浸染
GET
要求获取由 Request-URI 所标识的资源
POST
要求做事器吸收在要求中封装的实体,并将其作为由 Request-Line 中的 Request-URI 所标识的资源的一部分
HEAD
要求获取由 Request-URI 所标识的资源的相应报头
PUT
要求做事器存储一个资源,并用 Request-URI 作为其标识符
DELETE
要求做事器删除由 Request-URI 所标识的资源
TRACE
要求做事器回送到的要求信息,紧张用于测试或诊断
CONNECT
保留将来利用
OPTIONS
要求查询做事器的性能,或者查询与资源干系的选项和需求
重点先容 GET、POST 和 HEAD 三个方法:
(1)GET
GET 方法用于获取由 Request-URI 所标识的资源的信息,常见的形式是:
GET Request-URI HTTP/1.1
GET方法是默认的HTTP要求方法,例如当我们通过在浏览器的地址栏中直接输入网址的办法去访问网页的时候,浏览器采取的便是 GET 方法向做事器获取资源。
我们可以利用GET方法来提交表单数据,用GET方法提交的表单数据只经由了大略的编码,同时它将作为URL的一部分向做事器发送,因此,如果利用GET方法来提交表单数据就存在着安全隐患上。例如:
Http://localhost/login.php?username=aa&password=1234
从上面的URL要求中,很随意马虎就可以辩认出表单提交的内容。(?之后的内容)其余由于GET方法提交的数据是作为URL要求的一部分以是提交的数据量不能太大。这是由于浏览器对url的长度有限定
各种浏览器也会对url的长度有所限定,下面是几种常见浏览器的url长度限定:(单位:字符)
IE : 2803
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000
(2)POST
POST方法是GET方法的一个替代方法,它紧张是向Web做事器提交表单数据,尤其是大批量的数据。 在要求头信息结束之后的两个回车换行之后(实际是空一行),便是表单提交的数据。如上面提到的post表单数据:
username=aa&password=1234
POST方法战胜了GET方法的一些缺陷。通过POST方法提交表单数据时,数据不是作为URL要求的一部分而是作为标准数据传送给Web做事器,这就克 服了GET方法中的信息无法保密和数据量太小的缺陷。因此,出于安全的考虑以及对用户隐私的尊重,常日表单提交时采取POST方法。
从编程的角度来讲,如果用户通过GET方法提交数据,则数据存放在QUERY_STRING环境变量中,而POST方法提交的数据则可以从标准输入流中获取。
GET与POST方法有以下差异:
1、 在客户端,Get办法在通过URL提交数据,数据在URL中可以看到;POST办法,数据放在HTTP包的body中。
2、 GET办法提交的数据大小有限定(由于浏览器对URL的长度有限定),而POST则没有此限定。
3、安全性问题。正如在(1)中提到,利用 Get 的时候,参数会显示在地址栏上,而 Post 不会。以是,如果这些数据是中文数据而且是非敏感数据,那么利用 get;如果用户输入的数据不是中笔墨符而且包含敏感数据,那么还是利用 post为好。
4.、做事器取值办法不一样。GET办法取值,如php可以利用$_GET来取得变量的值,而POST办法通过$_POST来获取变量的值。
(3)HEAD
HEAD 方法与 GET 方法险些是相同的,它们的差异在于 HEAD 方法只是要求报头,而不是完全的内容。对付 HEAD 要求的回应部分来说,它的 HTTP 头部中包含的信息与通过 GET 要求所得到的信息是相同的。利用这个方法,不必传输全体资源内容,就可以得到 Request-URI 所标识的资源的信息。这个方法常日被用于测试超链接的有效性,是否可以访问,以及最近是否更新。
要把稳的是,在 HTML 文档中,书写 get 和 post,大小写都可以,但在 HTTP 协议中的 GET 和 POST 只能是大写形式。
2. 要求头
每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,利用至少一个空格或制表符。
HTTP最常见的要求头如下:
Transport 头域
Connection:
浸染:表示是否须要持久连接。
如果做事器看到这里的值为“Keep-Alive”,或者看到要求利用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所须要的韶光。要实现这一点,做事器须要在应答中发送一个Content-Length头,最大略的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前打算它的大小;
例如: Connection: keep-alive 当一个网页打开完成后,客户端和做事器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个做事器上的 网页,会连续利用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和做事器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,须要重新建立TCP连接。
Host(发送要求时,该报头域是必需的)
Host要求报头域紧张用于指定被要求资源的Internet主机和端口号,它常日从HTTP URL中提取出来的。
eg:http://;localhost/index.html
浏览器发送的要求中,就会包含Host要求报头域,如下:
Host:localhost
此处利用缺省端口号80,若指定了端口号8080,则变成:Host:localhost:8080
Client 头域
Accept:
浸染:浏览器可以接管的媒体类型(MIME类型),
例如: Accept: text/html 代表浏览器可以接管做事器回发的类型为 text/html 也便是我们常说的html文档, 如果做事器无法返回text/html类型的数据,做事器该当返回一个406缺点(non acceptable)。
通配符 代表任意类型。例如 Accept: / 代表浏览器可以处理所有类型,(一样平常浏览器发给做事器都是发这个)
Accept-Encoding:
浸染: 浏览器申明自己吸收的编码方法,常日指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(把稳:这不是只字符编码);
例如: Accept-Encoding: gzip, deflate。Server能够向支持gzip/deflate的浏览器返回经gzip或者deflate编码的HTML页面。 许多环境下这可以减少5到10倍的下载韶光,也节省带宽。
Accept-Language:
浸染: 浏览器申明自己吸收的措辞。
措辞跟字符集的差异:中文是措辞,中文有多种字符集,比如big5,gb2312,gbk等等;
例如: Accept-Language:zh-cn 。如果要求中没有设置这个报头域,做事器假定客户端对各种措辞都可以接管。
User-Agent:
浸染:见告HTTP做事器, 客户端利用的操作系统和浏览器的名称和版本.
我们上网上岸论坛的时候,每每会看到一些欢迎信息,个中列出了你的操作系统的名称和版本,你所利用的浏览器的名称和版本,这每每让很多人感到很神 奇,实际上, 做事器运用程序便是从User-Agent这个要求报头域中获取到这些信息User-Agent要求报头域许可客户端将它的操作系统、浏览 器和其它属性见告做事器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Accept-Charset:
浸染:浏览器申明自己吸收的字符集,这便是本文前面先容的各种字符集和字符编码,如gb2312,utf-8(常日我们说Charset包括了相应的字符编码方案);
例如:Accept-Charset:iso-8859-1,gb2312.如果在要求中没有设置这个域,缺省是任何字符集都可以接管。
Authorization:授权信息,常日涌如今对做事器发送的WWW-Authenticate头的应答中;
Authorization要求报头域紧张用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到做事器的相应代码为401(未授权),可以发送一个包含Authorization要求报头域的要求,哀求做事器对其进行验证。
Cookie/Login 头域
Cookie:
浸染: 最主要的header, 将cookie的值发送给HTTP 做事器
Entity头域
Content-Length
浸染:发送给HTTP做事器数据的长度。即要求正文的长度;
例如: Content-Length: 38
Content-Type:
浸染:
例如:Content-Type: application/x-www-form-urlencoded
Miscellaneous 头域
Referer:
浸染: 供应了Request的高下文信息的做事器,见告做事器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里, 他的做事器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问 他的网站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Cache 头域
If-Modified-Since:
浸染: 把浏览器端缓存页面的末了修正韶光发送到做事器去,做事器会把这个韶光与做事器上实际文件的末了修正韶光进行比拟。如果韶光同等,那么返回304,客户端 就直策应用本地缓存文件。如果韶光不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT。
If-None-Match:
浸染: If-None-Match和ETag一起事情,事情事理是在HTTP Response中添加ETag信息。 当用户再次要求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果做事器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态见告客户端利用 本地缓存文件。否则将返回200状态和新的资源和Etag. 利用这样的机制将提高网站的性能
例如: If-None-Match: \"大众03f2b33c0bfcc1:0\"大众
Pragma:
浸染: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache浸染千篇一律
Pargma只有一个用法, 例如: Pragma: no-cache
把稳: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control
Cache-Control:
浸染: 这个是非常主要的规则。 这个用来指定Response-Request遵照的缓存机制。各个指令含义如下
Cache-Control:Public 可以被任何缓存所缓存()
Cache-Control:Private 内容只缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
2. HTTP相应格式
在吸收和解释要求后,做事器会返回一个 HTTP 相应。与 HTTP 要求类似,HTTP 相应也是由三个部分组成,分别是:状态行、报头和相应正文。如:
HTTP/1.1 200 OK
Date: Sun, 17 Mar 2013 08:12:54 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>HTTP相应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
1、状态行
状态行由协议版本、数字形式的状态代码,及相应的状态描述组成,各元素之间以空格分隔,结尾时回车换行符,格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version 表示做事器 HTTP 协议的版本,Status-Code 表示做事器发回的相应代码,Reason-Phrase 表示状态代码的文本描述,CRLF 表示回车换行。例如:
HTTP/1.1 200 OK (CRLF)
状态代码与状态描述
状态代码由 3 位数字组成, 表示要求是否被理解或被知足,状态描述给出了关于状态码的简短的笔墨描述。状态码的第一个数字定义了相应种别,后面两位数字没有详细分类。第一个数字有 5 种取值,如下所示。
1xx:指示信息——表示要求已经接管,连续处理2xx:成功——表示要求已经被成功吸收、理解、接管。3xx:重定向——要完成要求必须进行更进一步的操作4xx:客户端缺点——要求有语法缺点或要求无法实现5xx:做事器端缺点——做事器未能实现合法的要求。常见状态代码、状态描述、解释:
200 OK //客户端要求成功
400 Bad Request //客户端要求有语法缺点,不能被做事器所理解
401 Unauthorized //要求未经授权,这个状态代码必须和WWW-Authenticate报头域一起利用
403 Forbidden //做事器收到要求,但是谢绝供应做事
404 Not Found //要求资源不存在,eg:输入了缺点的URL
500 Internal Server Error //做事器发生不可预期的缺点
503 Server Unavailable //做事器当前不能处理客户真个要求,一段韶光后可能规复正常
2、相应正文
相应正文便是做事器返回的资源的内容,相应头和正文之间也必须用空行分隔。如:
<html> <head> <title>HTTP相应示例<title> </head> <body> Hello HTTP! </body> </html>3 、相应头信息
HTTP最常见的相应头如下所示:
Cache头域
Date:
浸染:天生的详细韶光和日期,即当前的GMT韶光。
例如: Date: Sun, 17 Mar 2013 08:12:54 GMT
Expires:
浸染: 浏览器会在指定过期韶光内利用本地缓存,指明该当在什么时候认为文档已经由期,从而不再缓存它。
例如: Expires: Thu, 19 Nov 1981 08:52:00 GMT
Vary
浸染:
例如: Vary: Accept-Encoding
Cookie/Login 头域
P3P
浸染: 用于跨域设置Cookie, 这样可以办理iframe跨域访问cookie的问题
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie
浸染: 非常主要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会天生一个Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Entity实体头域:
实体内容的属性,包括实体信息类型,长度,压缩方法,末了一次修正韶光,数据有效性等。
ETag:
浸染: 和If-None-Match 合营利用。 (实例请看上节中If-None-Match的实例)
例如: ETag: \"大众03f2b33c0bfcc1:0\"大众
Last-Modified:
浸染: 用于指示资源的末了修正日期和韶光。(实例请看上节的If-Modified-Since的实例)
例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Content-Type:
浸染:WEB做事器见告浏览器自己相应的工具的类型和字符集,
例如:
Content-Type: text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
Content-Length:
指明实体正文的长度,以字节办法存储的十进制数字来表示。在数据下行的过程中,Content-Length的办法要预先在做事器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。
例如: Content-Length: 19847
Content-Encoding:
浸染:文档的编码(Encode)方法。一样平常是压缩办法。
WEB做事器表明自己利用了什么压缩方法(gzip,deflate)压缩相应中的工具。利用gzip压缩文档能够显著地减少HTML文档的下载韶光。
例如:Content-Encoding:gzip
Content-Language:
浸染: WEB做事器见告浏览器自己相应的工具的措辞者
例如: Content-Language:da
Miscellaneous 头域
Server:
浸染:指明HTTP做事器的软件信息
例如:Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By:
浸染:表示网站是用什么技能开拓的
例如: X-Powered-By: PHP/5.2.5
Transport头域
Connection:
例如: Connection: keep-alive 当一个网页打开完成后,客户端和做事器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个做事器上的网页,会连续利用这一条已经建立的连接
例如: Connection: close 代表一个Request完成后,客户端和做事器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,须要重新建立TCP连接。
Location头域
Location:
浸染: 用于重定向一个新的位置, 包含新的URL地址
实例请看304状态实例
HTTP协议是无状态的和Connection: keep-alive的差异
无状态是指协议对付事务处理没有影象能力,做事器不知道客户端是什么状态。从另一方面讲,打开一个做事器上的网页和你之前打开这个做事器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP利用的是UDP协议(无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,大略地说,当一个网页打开完成后,客户端和做事器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个做事器上的网页,会连续利用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持韶光,可以在不同的做事器软件(如Apache)中设定这个韶光。
3. 浏览器缓存
浏览器缓存:包括页面html缓存和图片js,css等资源的缓存。如下图,浏览器缓存是基于把页面信息保存到用户本地电脑硬盘里。
1、缓存的优点:
1)做事器相应更快:由于要求从缓存做事器(离客户端更近)而不是源做事器被相应,这个过程耗时更少,让做事器看上去相应更快。
2)减少网络带宽花费:当副本被重用时会减低客户真个带宽花费;客户可以节省带宽用度,掌握带宽的需求的增长并更易于管理。
2、缓存事情事理
页面缓存状态是由http header决定的,一个浏览器要求信息,一个是做事器相应信息。紧张包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。个中Pragma: no-cache由HTTP/1.0规定,Cache-Control由HTTP/1.1规定。
事情事理图:
从图中我们可以看到事理紧张分三步:
第一次要求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向做事器要求,此时做事器记录第一次要求的Last-Modified/Etag 再次要求:当浏览器再次要求的时候,要求头附带Expires,Cache-Control,If-Modified-Since/Etag向做事器要求做事器根据第一次记录的Last-Modified/Etag和再次要求的If-Modified-Since/Etag做比拟,判断是否须要更新,做事器通过这两个头判断本地资源未发生变革,客 户端不须要重新下载,返回304相应。常见流程如下图所示:与缓存干系的HTTP扩展头
Expires:设置页面过期韶光,格林威治韶光GMT
Cache-Control:更细致的掌握缓存的内容
Last-Modified:要求工具末了一次的修正韶光 用来判断缓存是否过期 常日由文件的韶光信息产生
ETag:相应中资源的校验值,在做事器上某个时段是唯一标识的。ETag是一个可以 与Web资源关联的暗号(token),和Last-Modified功能才不多,也是一个标识符,一样平常和Last-Modified一起利用,加强做事器判断的准确度。
Date:做事器的韶光
If-Modified-Since:客户端存取的该资源末了一次修正的韶光,用来和做事器真个Last-Modified做比较
If-None-Match:客户端存取的该资源的考验值,同ETag。
Cache-Control的紧张参数
Cache-Control: private/public Public 相应会被缓存,并且在多用户间共享。 Private 相应只能够作为私有的缓存,不能再用户间共享。
Cache-Control: no-cache:不进行缓存
Cache-Control: max-age=x:缓存韶光 以秒为单位
Cache-Control: must-revalidate:如果页面是过期的 则去做事器进行获取。
2、关于图片,css,js,flash的缓存
这个紧张通过做事器的配置来实现这个技能,如果利用apache做事器的话,可以利用mod_expires模块来实现:
编译mod_expires模块:
Cd /root/httpd-2.2.3/modules/metadata
/usr/local/apache/bin/apxs -i -a -c mod_expires.c //编译
编辑httpd.conf配置:添加下面内容
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault \"大众access plus 1 month\"大众
ExpiresByType text/html \"大众access plus 1 months\公众
ExpiresByType text/css \"大众access plus 1 months\"大众
ExpiresByType image/gif \公众access plus 1 months\"大众
ExpiresByType image/jpeg \"大众access plus 1 months\"大众
ExpiresByType image/jpg \"大众access plus 1 months\公众
ExpiresByType image/png \公众access plus 1 months\公众
EXpiresByType application/x-shockwave-flash \公众access plus 1 months\"大众
EXpiresByType application/x-javascript \"大众access plus 1 months\公众
#ExpiresByType video/x-flv \"大众access plus 1 months\公众
</IfModule>
阐明:第一句--开启做事
第二句--默认韶光是一个月
不才面是关于各种类型的资源的缓存韶光设置