加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-11-16 13:38:07)
标签:

it

参考:HTTP协议详解(真的很经典)
      http://blog.csdn.net/gueter/article/details/1524447
      http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

-----------------------------------------------------------------------------------------------------------------

基于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各种限制" />

 1)请求行

请求行 由 请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1

HTTP协议的请求方法有GETPOSTHEADPUTDELETEOPTIONSTRACECONNECT。这里介绍最常用的GET方法和POST方法。

GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源内容放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,参数长度会受到限制。例如,/index.jsp?id=100&op=bind

POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以{名称/值}对的形式出现,可以传输大量数据。


 对于POST中的multipart/form-data传输:在请求头中,按以下格式设置Content-type以及不同部分之间的分隔串(一般要用较长的随机串,以避免可能与实际数据存在的冲突),或者再加上其它属性(如编码):

    Content-Type: multipart/form-data; boundary=%_ThisIsLooongSeparator_%; charset=UTF-8

             #即: 上传方式;分隔串 [;编码]

   在HTTP请求数据部分,用"两个减号后跟分割串"(当然后面跟着\r和\n)开始每一部分,最后用"两个减号后跟分割串和两个减号"(加\r\n)结束全部数据,而中间每一部分的内容除了必须的Content-Disposition域外,都象"一个除掉请求行的HTTP报文"。Content-Disposition域中可以有多个属性(至少要有个name属性吧),它们要用"; "分开,每个属性的书写形式为name="my_value" (双引号是必须的)。例

   --%_ThisIsLooongSeparator_%       \r\n

    Content-Disposition: form-data; name="account_name.txt"     \r\n

    Content-Type: text/plain   \r\n

    \r\n

    account_name对应的数据....

   --%_ThisIsLooongSeparator_%    \r\n

    Content-Disposition: form-data; name="account_encrypted_password_file.txt"; filename="/path/to/encrypted_password.txt"   \r\n

    \r\n

    account_encrypted_password文件的内容....

   --%_ThisIsLooongSeparator_%--   \r\n

    \r\n

      


注:如果请求行中某些参数含有空格,需要将空格替换成百分号%后跟其十六进制ascii码值(即20),也可以用+表示空格,这称为URL编码(URL encoding)。


2)请求头部

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

User-Agent:产生请求的浏览器类型。

Accept:客户端可识别的内容类型列表。

Host: 请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

3)空行

最后一个请求头之后是一个空行,仅包含回车符和换行符,通知服务器以下不再有请求头。

4)请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-TypeContent-Length


例1  HTTP GET请求:

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  HTTP POST请求:

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 line,即回车-换行>

[<response-body>]


最常用的状态码有

    200 (OK),找到了该资源,并且一切正常。
    304 (NOT MODIFIED),该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
    401 (UNAUTHORIZED),客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
    403 (FORBIDDEN),客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
    404 (NOT FOUND),在指定的位置不存在所申请的资源。


:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=
ISO-8859-1
Content-Length:122


<html>
      <head></head>
      <body>
            <!--body goes here-->
      </body>
</html>


说明:
     1) HTTP状态码200,表明已经找到资源,并且一切正常
     2)Date:
生成响应的日期和时间
     3)Content-Type:
指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1(其它值如UTF-8);
     4) Content-Length:指明响应主体的长度;
     5) 空行后跟的是HTML文件内容


状态行之后是一些首部。通常,服务器会返回一个名为Date的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部就是在POST请求中用到的Content-Type和Content-Length。如,Content-Type指 定MIME类型为HTML(text/html),其编码类型是ISO-8859-1(这是美国英语资源的编码标准)。响应主体所包含的就是所请求资源的 HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。



-----------------------------------------------------------------------------------------------------------------


HTTP
头标

头标由主键/值对组成。它们描述客户端或者服务器的属性、被传输的资源以及应该实现连接。

四种不同类型的头标:

    1.通用头标:既可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
   
2.请求头标:允许客户端传递关于自身的信息和希望的响应形式。
   
3.响应头标:服务器和于传递自身信息的响应。
   
4.实体头标:定义被传送资源的信息。即可用于请求,也可用于响应。

头标格式:<name>:<value><CR LF>



-----------------------------------------------------------------------------------------------------------------

附:
请求报文请求头中的字段


1.  HTTP请求行:请求行格式为Method Request-URI Protocol。
2.  Accept:指浏览器或其他客户可以接爱的MIME文件格式。可以根据它判断并返回适当的文件格式。
3.  Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.
4.  Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语。
5.  Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。
6.  Authorization:当使用密码机制时用来标识浏览器。
7.  Cache-Control:设置关于请求被代理服务器存储的相关选项。一般用不到。
8.  Connection:用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接。
9.  Content-Type:用来表名request的内容类型。可以用HttpServletRequest的 getContentType()方法取得。
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: 1.0 fred.com, 1.1 wilma.com
25. Warning:用来由客户声明传递或存储(cache)错误。



-----------------------------------------------------------------------------------------------------------------
响应报文头域中的字段


1.
  Content-encoding:encoding 编码用于消息体.一般可以是compress或gzip.二者取其一.如果浏览器支持这个域,数据可被浏览器自动进行压缩和解压; 例如:Content-Encoding: zip
2.  Content-length:length 消息(以字节为单位)的长度;
    Content-Language  用于指定在输入流中数据的自然语言类型。例如:Content-Language: en
    Content-MD5  实体的一种MD5摘要,用作校验和。发送方和接受方都计算MD5摘要,接受方将其计算的值与此头标中传递的值进行比较。例如:Content-MD5: <base64 of 128 MD5 digest>
    Content-Range 随部分实体一同发送;标明被插入字节的低位与高位字节偏移,也标明此实体的总长度。例如:Content-Range: 1001-2000/5000
3.  Content-transfer-encoding:type 编码方法.在HTTP中并不常见,一般用于MIME;
4.  Content-type:general/specific 消息的MIME类型,通常是文本类型或HTML类型;例如:Content-Type: text/html
5.  Date:date 消息发送日期和时间.格式为星期,日期,月份,年份,时:分:秒 GMT;例如:Date: Mon,10PR 18:42:51 GMT
6.  Derived-from:version 消息源版本信息;
7.  Expires:date 请求失效时间.客户可利用该信息进行刷新;
8.  Forwarded:by url for domain 代理服务器告诉客户所用的是哪一个代理.如果使用多个代理,则分别显示;
9.  Last-modified:date 资源最后被修改的时间,其值存放在GMT中;
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: Basic realm=zxm.mgmt



-----------------------------------------------------------------------------------------------------------------

Http协议中的各种长度限制 (from http://my.oschina.net/chihz/blog/58057)

在实现http协议解析时会用到这些限制的  :)

1. URL长度限制

在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的:
    HTTP协议并不对URI的长度做任何的限制,服务器端必须能够处理任何它们所提供服务都能接受的URI,并且能够处理无限长度的URI;如果服务器不能处理过长的URI, 那么应该返回414状态码。

虽然Http协议规定了,但是Web服务器和浏览器对URI都有自己的长度限制。

服务器的限制: 接触最多的服务器类型就是Nginx和Tomcat,对于url的长度限制,它们都是通过控制http请求头的长度来进行限制的,nginx的配置参数为large_client_header_buffers,tomcat的请求配置参数为 maxHttpHeaderSize,都是可以自己去进行设置。

浏览器的限制: 每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)
    IE :     2803
    Firefox: 65536
    Chrome:  8182
    Safari:  80000
    Opera:   190000

对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。

2. Post数据的长度限制

Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制;长度限制可以在服务器端配置最大http请求头长度的方式来实现。

3. Cookie的长度限制

Cookie的长度限制分这么几个方面来总结。

(1) 浏览器所允许的每个域下的最大cookie数目。根据网上找到的资料,大概是如下情况:
     IE:      原先为20个,后来升级为50个
     Firefox: 50个
     Chrome:  180个
     Safari:  无限制
     Opera:   30个

当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。

(2) 浏览器所允许的每个Cookie的最大长度
     IE:      4095字节
     Firefox: 4079字节
     Chrome:  4000字节左右
     Safari:  4079字节
     Opera:   4096字节

(3) 服务器中Http请求头长度的限制。Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。

4. Html5 LocalStorage

Html5提供了本地存储机制来供Web应用在客户端存储数据,尽管这个并不属于Http协议的一部分,但是随着Html5的流行,我们可能需要越来越多使用LocalStorage,甚至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道一样多。

对于LocalStorage的长度限制,同Cookie的限制类似,也是浏览器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:

    Firefox\Chrome\Opera都是允许每个域的最大长度为5MB
    但是这次IE比较大方,允许的最大长度是10MB


<end>



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有