搜集整理:http报文格式 & 各种限制

标签:
it |
-----------------------------------------------------------------------------------------------------------------
基于HTTP协议的客户机访问web服务器包括4个过程,分别是
* 建立TCP套接字连接;
* 发送HTTP请求报文;
* 接收HTTP应答报文;
* 关闭TCP套接字连接。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
-----------------------------------------------------------------------------------------------------------------
请求报文 的 格式
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
注:Ascii码:回车=0x0D('\r'),
换行=0x0A('\n').
http://p.blog.csdn.net/images/p_blog_csdn_net/microtong/EntryImages/20090506/http.PNG&
请求行 由 请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源内容放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,参数长度会受到限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以{名称/值}对的形式出现,可以传输大量数据。
【
注:如果请求行中某些参数含有空格,需要将空格替换成百分号%后跟其十六进制ascii码值(即20),也可以用+表示空格,这称为URL编码(URL encoding)。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host: 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,仅包含回车符和换行符,通知服务器以下不再有请求头。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
例1
GET
/ HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.google.cn:8080
Connection: Keep-Alive
Range:bytes=1024-
说明:
1) 请求的第一部分说明了该请求是一个GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP1.1版本(另一个可选荐是1.0)。
2) 第2行是请求的第一个首部;
3) User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础。该信息由你的浏览器来定义,并且在每个请求中自动发送。
4) Host将指出请求的目的地(和端口号)。
5) Connection,通常由浏览器设置为Keep-Alive;对于单纯的文件下载工具,则可以设为Close。
6) 使用range指定请求实体的一个或者多个子范围,如bytes=500-600,601-999。但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回,而不是以200(OK)。
7) 第三部分是空行,即使不存在请求主体,这个空行也是必需的。
例2
POST
/ HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional Ajax&publisher=Wiley
说明:
1) 请求行开始处的GET改为POST,以表示不同的请求类型。
2) Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。
3) Content-Length说明了请求数据的字节数。或者用Content-range指定返回数据在所有返回数据中的位置,如:
Content-range:bytes 1024-2047/4096
即,此次返回的是从1024到2047字节的部分,而需返回的实体总长度为4096字节。
4) 请求头以空行结束;
5) 最后是请求数据(或请求主体),以名称-值对的形式出现(见Content-Type)。
-----------------------------------------------------------------------------------------------------------------
响应报文 的
格式:
<status-line>
<headers>
<blank
[<response-body>]
最常用的状态码有:
例:
HTTP/1.1
Date:
Content-Type:
Content-Length:122
<html>
</html>
说明:
状态行之后是一些首部。通常,服务器会返回一个名为Date的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部就是在POST请求中用到的Content-Type和Content-Length。如,Content-Type指 定MIME类型为HTML(text/html),其编码类型是ISO-8859-1(这是美国英语资源的编码标准)。响应主体所包含的就是所请求资源的 HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。
注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。
-----------------------------------------------------------------------------------------------------------------
HTTP头标
头标由主键/值对组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。
四种不同类型的头标:
头标格式:<name>:<value><CR LF>
-----------------------------------------------------------------------------------------------------------------
附:请求报文请求头中的字段:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10. Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
11. Expect:表时客户预期的响应状态。
12. From:给出客户端HTTP请求负责人的email地址。
13. Host:对应网址URL中的Web名称和端口号。
14. If-Match:供PUT方法使用。
15. If-Modified-Since:客户使用这个属性表明它只需要在指定日期之后更改过的网页。因为浏览器可以使用其存储的文件而不必从服务器请求,这样节省了Web资源。由于Servlet是动态生成的网页,一般不需要使用这个属性。
16. If-None-Match:和If-Match相反的操作,供PUT方法使用。
17. If-Unmodified-Since:和If-Match-Since相反。
18. Pragma:这个属性只有一种值,即Pragma:no-cache,表明如果servlet充当代理服务器,即使其有已经存储的网页,也要将请求传递给目的服务器。
19. Proxy-Authorization:代理服务器使用这个属性,一般用不到。
20. Range:如果客户有部分网页,这个属性可以请求剩余部分。
21. Referer:表明产生请求的网页URL。
比如从网页/beijing.html中点击一个链接到网页/qingdao.html,在向服务器发送的GET
/beijing.html中的请求中,Referer是http://www.6book.net/qingdao.html
。这个属性可以用来跟踪Web请求是从什么网站来的。
22. Upgrade:允许服务器指定一种新的协议或者新的协议版本(与HTTP/1.1不同),与响应编码101(切换协议)配合使用。例如:Upgrade:
HTTP/2.0
23. User-Agent:是客户浏览器名称。
24. Via:用来记录Web请求经过的代理服务器或Web通道。
如:Via:
25. Warning:用来由客户声明传递或存储(cache)错误。
-----------------------------------------------------------------------------------------------------------------
响应报文头域中的字段:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10. Link:thelink 与HTML链接标识相似;
11. Location:url
站点服务器的返回代替值资源的URL;
12. MIME-version:version
MIME协议版本.当前是1.0;
13. public:methods
资源支持的非标准方法列表;
14. Retry-after:date
如果资源无效,返回503状态码,该域存放客户机重新请求前需要等待的秒数或时期时间;
15. Server:app/version
站点服务器的应用名称和版本信息;
16. Title:title
资源标题;
17. UBI:url
发挥资源的资源标识,这个域将代替loction域;
18. Version:version
资源版本;
19. www-Authenticate:scheme message
一个提示用户代理提供用户名和口令的响应头标,与状态编码401(未授权)配合使用。响应一个授权头标。例如:www-Authenticate:
-----------------------------------------------------------------------------------------------------------------
Http协议中的各种长度限制 (from http://my.oschina.net/chihz/blog/58057)
在实现http协议解析时会用到这些限制的
1. URL长度限制
2. Post数据的长度限制
3. Cookie的长度限制
4. Html5 LocalStorage
<end>