HTTP超文本传输协议,是WWW上应用的最多的协议。了解和掌握HTTP协议是对程序人员的基本要求。
一、HTTP介绍
HTTP是一个基于请求/响应模式的、无状态的协议。即,浏览器与服务端连接之后,浏览器向服务器发送一个请求,服务器返回响应信息之后,双方的链接就被关闭。我们要知道,应用层的HTTP要使用传输层的TCP协议来完成。而TCP协议是通过“3次握手”建立连接,是面向连接的协议。默认情况下,浏览器与Web服务器上80端口监听的服务器程序建立TCP连接。
HTTP1.0是典型的请求/响应模式。为了减少服务器的开销,HTTP1.1默认有“持续连接”的机制。通过这种机制,客户端发送请求得到响应后,连接不会马上关闭,可以继续发送请求,还可以流水线发送多个请求、而不用等待每一个响应的到来。
二、URI和URL
URI(统一资源标识符)纯粹是一种符号结构,用于指定构成Web资源的字符串的各个不同部分。而URL(统一资源定位符)是一种特殊的URI,包含了用于查找某个资源的足够信息。
URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative
URL,则是针对另一个absolute URL,本质上还是绝对的。
三、HTTP请求
格式如图:(CRLF表示回车符+换行符,不同颜色之间用空格隔开)
第一行叫做请求行。所以我们可以说HTTP请求由请求行、消息报头、请求正文组成。
1、请求行
如上,请求行以一个方法符号开头,空格之后,一个请求URI,再空格,然后一个HTTP版本,最后一个回车换行。
其中请求方法有如下几种:
我们在浏览器地址栏直接输入地址的时候,采用的就是GET方法。
HEAD方法一般用于测试超链接的有效性,因为它只是请求响应消息的报头。消息报头后面会讲。
(HTTP协议中,请求方法必须全部大写)
2、请求正文
类似name=XXX&pwd=XXXX的内容
四、HTTP响应
格式与HTTP请求类似,如图:
第一行叫做状态行。所以我们可以说HTTP响应由状态行、消息报头、响应正文组成。
1、状态行
如上,状态行由一个HTTP版本,空格后,一个状态码,再空格,一个状态码的文本描述,最后一个回车换行构成。
状态代码有3位数字组成,状态描述给出了状态代码简短的描述。状态码第一个数字定义了响应的类别,有五种可能取值:
1xx : 指示信息--表示请求已接收,继续处理
2xx : 成功--表示请求已被成功接收、理解、接受
3xx : 重定向--要完成请求必须进行更进一步的操作
4xx : 客户端错误--请求有语法错误或请求无法实现
5xx : 服务器端错误--服务器未能实现合法的请求
全部取值如下:
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
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头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本
消息报头下面会讲。
2、响应正文
所谓响应正文,就是服务器返回的资源的内容。即整个HTML文件。
五、消息报头
HTTP请求和HTTP响应都有消息报头。而消息报头是由众多报头域组成。每一个报头域都由名字+“:”+空格组成,消息报头域的名字是大小写无关的。
HTTP消息报头包括普通报头、请求报头、响应报头和实体报头。
1、普通报头:
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
普通报头包括:
常见的普通报头:
1)Cache-Control
Cache-Control用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
2)Date
Date普通报头域表示消息产生的日期和时间
3)Connection
Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
请求报头包括:
常见的请求报头:
1)Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。
2)Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
3)Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
4)Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
5)Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
6)Host
发送请求时,该报头域是必需的。Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP
URL中提取出来的。
7)User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就
无法得知我们的信息了。
3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
响应报头包括:
常见的实体报头:
1)Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
2)Server
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
3)WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
4、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
实体报头包括:
常见的实体报头:
1)Content-Encoding
Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding主要用于记录文档的压缩方法。
2)Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言
阅读者。
3)Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。即一个数字字符占一个字节,用其对应的ASCII码来存储传输。
4)Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。
5)Expires
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。
6)Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
六、长度限制
1、URL长度限制
1)HTTP协议中没有对URL的长度进行限制,但是Web服务器和浏览器对URI都有自己的长度限制。服务器一般是通过控制http请求头的长度来进行限制的。tomcat的请求配置参数为maxHttpHeaderSize。
2)浏览器的限制
每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)
IE : 2803ASCII字符
Firefox : 65536ASCII字符
Chrome : 8182ASCII字符
Safari : 80000ASCII字符
Opera : 190000ASCII字符
对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。
2. Post数据的长度限制
Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http请求头长度的方式来实现。
3、Cookie的长度限制
1)浏览器所允许的每个域下的最大cookie数目
IE :原先为20个,后来升级为50个
Firefox: 50个
Opera:30个
Chrome:180个
Safari:无限制
当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。
2) 浏览器所允许的每个Cookie的最大长度
Firefox和Safari : 4079字节
Opera : 4096字节
IE : 4095字节
(3) 服务器中Http请求头长度的限制。
Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。
4. Html5 LocalStorage的长度限制
Html5提供了本地存储机制来供Web应用在客户端存储数据,尽管这个并不属于Http协议的一部分,但是随着Html5的流行,我们可能需要越来越多使用LocalStorage,甚至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道一样多。
对于LocalStorage的长度限制,同Cookie的限制类似,也是浏览器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:
Firefox\Chrome\Opera : 5MB
IE : 10MB