HTTP协议解析
1. HTTP版本
HTTP/1.0
HTTP/1.1
HTTP-NG
2. 会话方式
HTTP/1.0
建立连接->请求->响应->断开连接
每次连接只处理一次请求和相应,对资源的每一次访问都要建立一个单独的连接。
浏览器到服务器的每次通讯都是完全分开的。
没有Host域,所以不可以创建基于主机头的虚拟主机。
HTTP/1.1
在一个TCP连接中可以传送多个HTTP请求和响应
不需要等待上次HTTP响应完毕,可以多个HTTP请求同时进行。服务器会根据浏览器发送的请求顺序来按顺序进行响应,这被称作管线。
有Host域,可以建立虚拟主机。
3. 请求消息
结构:
请求行
若干消息头(可选)
(CRLF)
实体内容(可选)
GET无实体内容
4. 响应消息
结构:
状态行
若干消息头(可选)
(CRLF)
实体内容(可选)
5. HTTP消息
对于HTTP/1.1,如果消息中包括实体内容,且没有采用Transfer-Encoding: chunked传输编码方式,则必须要有Content-Length消息头。否则浏览器和服务器都不知道何时消息结束。
6. 简单请求消息和简单响应消息
没有消息头。
其中,简单请求消息只可用于GET方式,且请求行中不指定HTTP版本号,
对于简单请求消息,服务器将会返回简单响应消息,只返回实体内容。
如:
ROOT /index.html
7. HTTP消息头概述
浏览器通过消息头,比如可以告诉服务器浏览器的国家语言版本信息,可以告诉服务器访问者是从哪个页面访问到当前页面的。
服务器通过消息头,比如可以告诉浏览器隔多长时间刷新一下,用哪种字符集显示内容,创建Cookie。
结构:
头字段名称(不区分大小写):_值,值,值(CRLF)
头字段名称(不区分大小写):_值,值,值(CRLF)
头字段名称(不区分大小写):_值,值,值(CRLF)
(可以任意顺序排列)
分为:通用信息头、请求头、响应头、实体头四类。
8. 请求行
结构:
请求方式_资源路径_HTTP版本号(CRLF)
如:
GET /index.htm HTTP/1.1
请求方式:
Method |
|
GET |
请求获取Request-URI所标识的资源 |
POST |
在Request-URI所标识的的资源后附加新的数据 |
HEAD |
请求获取Request-URI所标识的资源的响应消息报头 |
PUT |
请求服务器存储一个资源,并用Request-URI作为资源标识 |
DELETE |
请求服务器删除Request-URI所标识的资源 |
TRACE |
请求服务器回送收到的请求信息,主要用于测试和诊断 |
CONNECT |
保留将来使用 |
OPTIONS |
请求查询服务器的性能,或者查询与资源相关的选项和需求 |
9. 状态行
结构:
HTTP版本号_状态码_状态描述(CRLF)
如:
HTTP/1.1 200 OK
10. 使用GET和POST传递参数
GET使用URL传递参数
如:
GET /List.aspx?Catagoryid=5&Cityid=23 HTTP/1.1
POST使用实体内容传递参数
如:
POST /List.aspx HTTP/1.1
Content-Type:application/x-www-form-urlencoded
Content-Length:22
Catagoryid=5&Cityid=23
在POST消息头中要设置Content-Type的值为application/x-www-form-urlencoded,以及使用Content-Length 以标识实体内容的长度。
当Content-Length长度比实体内容长度短时,则会忽略多出部分的实体内容。当Content-Length少于实体长度时,则会继续等待。
11. 响应状态码
状态代码由三位数字组成,第一位定义了响应的类别:
1xx:指示信息——表示请求已接收,继续处理。
2xx:成功——表示请求已被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作。
4xx:客户端错误——请求有语法错误或请求无法实现。
5xx:服务器端错误——服务器未能实现合法的请求。
常见状态码:
Status-Code |
Reason-Phrase |
|
200 |
OK |
客户端请求成功 |
206 |
|
客户端发送了带有Range头的GET请求,服务器正确的返回了该范围的数据 |
302/307 |
|
指出被请求的文档已经临时移动到别处,此文档的新的URL在Location响应头中给出 |
304 |
|
客户机缓存的版本是最新的,客户机应该继续使用它 |
400 |
Bad Request |
客户端请求有语法错误,不能被服务器理解 |
401 |
Unauthorized |
表示客户机访问的是一个受口令和密码保护的页面,并且在WWW-Authenticate响应头提示客户机应重新发出一个带有Authorization头的请求信息。 |
403 |
Forbidden |
服务器收到请求,但是拒绝提供服务 |
404 |
Not Found |
请求的资源不存在 |
500 |
Internal Server Error |
服务器端的CGI、ASP、JSP发生错误 |
503 |
Server Unavaliable |
服务器当前不能处理客户端的请求,一段时间后可能恢复正常 |
12. 通用信息头
通用信息头既能用于请求消息中,也可以用于响应消息中,他包括一些与被传输的实体没有关系的常用消息头字段。
Cache-Control: no-cache
如果用于客户机发送的请求消息时,通知代理服务器该如何处理缓存。如设置为no-cache,则代理服务器必须要去服务器验证资源,以确保发给客户端的文档时最新的。
如果用于响应消息中,则通知客户机及代理服务器如何缓存当前的响应消息。如服务器有一些资源只有实时才有意义,如网页计数器、股票信息,这时应当在响应消息中使用no-cache,通知代理服务器和客户端不要缓存资源。
Connection: close
用于指定处理完本次请求和响应后,客户端与服务器是否还要继续保持连接。当请求消息中设置了Connection: close时,则通知服务器端在响应本次请求后,断开连接。当请求消息中设置了Connection: Keep-Alive时,则通知服务器端在响应本次请求后,不要断开连接。
HTTP/1.1默认为Connection: Keep-Alive,所以当没有指定该域时,则默认为Connection: Keep-Alive。
Date: Tue, 11 Jul 2000 18:23:51 GMT
用于表示HTTP消息产生的时间。必须为GMT格式。服务器返回的正常响应消息中总是包含Date头的。
Progma: no-cache
值只能为no-cache。在HTTP/1.0中,指示客户端不要缓存当前的响应消息。
Trailer: Date
用于指示在实体内容的后面可以出现哪些头字段。一般情况下会将消息头放在实体内容的前面,但也可以将消息头放在实体内容的后面。对于这些要放在后面的消息头,则使用Trailer来说明。上例表示:Date消息头将放在实体内容的后面传输。
Transfer-Encoding: chunked
如果HTTP消息的实体内容部分采用了某种传输编码方式,那么Transfer-Encoding消息头是用于指定传输编码方式的。目前的标准设置值只有chunked。Chunked表示,要将整个HTTP响应消息的实体内容分成若干段以后再进行传输,并且在每个分段的开始部分都要使用一个16进制的数字来表示这个即将传输的这个分段的大小,最后一个分段的大小必须为0,这个0分段表示这个HTTP消息传送完毕。
服务器端程序(如ASP、JSP)并不是将资源按一个字符一个字符的发送到客户端,而是先将资源内容写在缓冲区中,当缓冲区写满时,将内容发送给客户端。如果资源完毕,则也将缓冲区中的内容发送给客户端。当第一次缓冲时就将已将全部内容都写入到实体内容时,则服务器知道本消息的Content-Length,所以将会在消息头中指明Content-Length。
Upgrade: HTTP/2.0, SHTTP/1.3
表示客户端支持并且希望切换到的协议。
Via: HTTP/1.1 Proxy1, HTTP/1.1 Proxy2
用于表明这个HTTP请求所途径的代理服务器的名称和所使用的协议。这个头的值由代理服务器进行追加。于是该头也记录了代理服务器的顺序。
Warning: any text
用于存储状态码所不能表明的一些信息。
13. 请求头
请求头用于客户端在请求消息中向服务器传递附加消息,主要包括:客户端可以接受的数据类型、压缩算法、语言、以及发出请求的超链接所属网页的URL地址等信息。
Accept: text/html, image/*
用于指出客户端程序能够处理的MIME类型。如:服务器可以输出png格式或gif格式等图片,但是某些浏览器不支持png格式的图片。所以服务器在响应时要检查Accept消息头,看浏览器是否支持png格式。
Accept-Charset: ISO-8859-1, Unicode-1-1
用于指出客户端可以显示的字符集。
Accept-Encoding: gzip, compress
用于指定客户机可以解码的编码方式,主要指压缩方式。
Accept-Language: en-gb, zh-cn
用于指定客户机期望服务器返回哪个国家的语言的文档。如设置Accept-Language: ja, zh-cn,则访问www.google.com则会打开日文的谷歌。
Authorization: Basic enh4OjEyMzQ1Ng==
当客户端访问受用户名和密码保护的服务器资源时,服务器就会向客户端发送401的响应状态码和一个WWW-Authenticate响应头,要求客户端使用Authorization请求头来进行应答。根据服务器发送的WWW-Authenticate响应头指定的验证方式的不同,客户端需要使用的Authorization请求头的值的格式也不同。有两种方式,一个是Basic,一个是Regist。使用Basic方式传递时,会将用户名和密码用“:”分隔形成一个串,然后进行Base-64编码。使用Base-64很容易就会被解码,所以相当于是用明文传送用户名和密码。
Host: www.111.com:80
用于指定客户端访问的资源所在的主机名和端口号
If-Match: “xyzzy”, “r2d2xxx”
浏览器可以缓存服务器响应的数据。当浏览器再次访问服务器的该资源时,只有当服务器的该资源已经更新,则服务器才将新内容传递给客户机,否则客户机要使用上次缓存的内容。
可以定义各种条件来判断服务器端资源是否已经更新。如,服务器在响应中,可以发送一些代表实体内容的头字段 “xyzzy”, “r2d2xxx”,这些头字段被称为实体标签,当客户机再次向服务器请求这些内容时,就可以使用If-Match请求头传送以前缓存的实体标签内容。服务器在收到If-Match请求头后,则会比较这些实体标签内容是否与当前的页面的特征一致。如果相同,则说明资源没有更改,服务器不用将再次发送这些资源。
If-Modified-Since: Tue. 11 Jul 2000 18:23:51 GMT
当客户机访问一个已缓存的资源时,可以设置If-Modified-Since头,指定当服务器上的资源修改时间比这个头的值的时间要新,则服务器才返回新的资源。该值必须为GMT格式,一般情况这个头的值是使用上次访问该资源时响应消息中的LastModified头的值。
If-None-Match: “xyzzy”, “r2d2xxx”
与If-Match相反。
If-Range: Tue. 11 Jul 2000 18:23:51 GMT
结合Range头使用。可以设为实体标签,也可以是时间值。当在If-Range值之前服务器资源没有改变,则根据Range头的值进行续传。否则服务器返回整个文档内容。
If-Unmodified-Since: Tue. 11 Jul 2000 18:23:51 GMT
与If-Modified-Since相反。
Max-Forwards: 1
指定了当前HTTP请求可以途径的代理服务器个数。每经过一个代理服务器,这个值就会被减1。如果减到0,则代理服务器中止继续发送。
Proxy-Authorization: Basic enh4OjEyMzQ1Ng==
与Authorization类似,是与代理服务器的验证时使用。
Range: bytes=100-599
客户端通知服务器只需返回资源的部分内容,以及部分内容的范围。
这对于较大文档的断点续传是有很大帮助的。如果客户机在一次请求中,只收到了服务器返回的部分内容,即服务器作出的响应只有一部分到达了客户端,则客户端可以发出一个带Range头的请求,这时服务器将会返回Range头值的那部分内容。
Range头有三种格式:
bytes=100-599,返回第100到第599个字节之间的内容(初始为0,包括100,599)。
bytes=100-,返回第100个字节以后的所有的内容。
bytes=-100,返回整个文档中的最后100个字节的内容。
Referer: http://www.google.cn
告诉服务器,这次请求是通过点击哪个网页上的超链接和转向过来的。由于可以使用telnet来仿造HTTP请求,所以Referer是不可靠的。由于HTTP的作者的拼写错误,所以不可以写成正确的拼写方式Referrer。
TE: trailers, deflate
用于说明客户机可接受的除了chunked以外的传输编码类型。或者当使用chunked时,是否可以使用trailers头字段在每一次发送的实体片段内容之后来设置一些响应头。
User-Agent
用于指定浏览器的类型和名字。如:服务器看到使用PDA版的IE,则可以返回wml的页面。
14. 实体头
实体头用作实体内容的元信息,描述了实体内容的属性,包括实体内容类型、长度、压缩方法、最后一次修改时间、数据有效期等。
Allow: GET, POST
可以使用哪些方式访问资源
Content-Encoding: gzip
实体内容以哪种方式编码。
Content-Language: zh-cn
实体内容的国家语言类型。
Content-Length: 80
实体内容的大小。
Content-Location: http://www.111.org/index.html
服务器可以说明返回响应实体内容的真正的实际位置。
Content-MD5: CVBNMDYHJFK==
实体内容的MD5摘要算法Base-64值,以提供实体内容的完整性校验。服务器可以通过对实体内容进行MD5摘要算法与此头的值是否相同来确定接收的请求是否没有错误与改变。
Content-Range: bytes 2543-4532/7898
实体内容的部分的所在位置。表明本次响应是实体内容的第2543字节到第4532字节,7898是实体内容的总大小。
Content-Type: text/html, charset=GB2312
由于网络上传送的均为二进制流,所以浏览器不知道传送的资源时什么类型的,所以服务器要告诉浏览器本响应的资源时什么类型的。计算机中有多种的数据格式,人们为每一个格式都定义了一个名称,称作MIME。本头指出实体内容的MIME。由于WEB服务器不知道这些资源文件是哪种MIME,所以可以对WEB服务器进行设置,使文件扩展名与MIME之间进行映射。
Expires: Tue. 11 Jul 2000 18:23:51 GMT
当前文档在何时之后被认为过期。浏览器在这个时间之后再访问这个页面时,将不再使用缓存中的内容。而是在需要时发出新的访问请求。
Last-Modified: Tue. 11 Jul 2000 18:23:51 GMT
指定文档的最后更新时间。
15. 扩展头
在HTTP消息中,也可以使用一些在HTTP/1.1正式规范里没有定义的头字段,这些头字段统称为自定义HTTP头或扩展头,他们通常被当作是一种实体头处理。
现在流行的浏览器基本都支持Cookie、Set-Cookie、Refresh和Content-Disposition等几个常用的扩展头字段。
Refresh: 1
Refresh: 1;url=http://www.111.com
过1秒之后刷新或跳转页面。
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=aaa.zip
Content-Disposition只有一个值,为attachment,在后面可以增加filename=aaa.zip,表示被保存的初始参考文件名。
![](https://images.cnblogs.com/cnblogs_com/twobin/520730/o_twobin100.png)