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的页面。
标签:HTTP,请求,网络协议,响应,消息,服务器,http,客户端 来源: https://www.cnblogs.com/gdkk/p/16194771.html