htticmp报文头部字段解析字段如何控制

HTTP的报文格式、GET和POST格式解析
我的图书馆
HTTP的报文格式、GET和POST格式解析
1、HTTP报文格式HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
&(1)请求行
请求行由请求方法字段、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请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
(5)请求示例
POST报文头如下:
POST /sn/index.php HTTP/1.1
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close
sn=123&n=asa
在http头后边有一空行,空行后边接着发送post数据,长度通过Content-Length: 12
指出,此post数据中包含两项
其中:Content-Type: application/x-www-form-urlencoded 指定POST数据的编码类型
Content-Length: 12 POST数据的长度
GET报问头如下:
GET /sn/index.php?sn=123&n=asa HTTP/1.1
Accept: */*
Accept-Language: zh-cn
host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection:close2.GET与POST区别HTTP定义了与服务器交互的不同方法,最基本的方法是&GET&和&POST.HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。  HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。  与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。(1)get是从服务器上获取数据,post是向服务器传送数据。(1)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。(2)&对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。(2)GET方式提交的数据最多只能有1024字节,而POST则没有此限制。(3)安全性问题。正如在(1)中提到,使用&Get&的时候,参数会显示在地址栏上,而&Post&不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用&get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用&post为好。注:所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一&URL&的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说,GET&请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST&请求就不那么轻松了。POST&表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过&POST&请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。下面举一个简单的例子来说明它们的区别:&!-分别通过get和post方式提交表单--&&&FORM ACTION="getpost.asp" METHOD="get"&&&INPUT TYPE="text" NAME="Text" VALUE="&&&INPUT TYPE="submit" VALUE="Get方式"&&/INPUT&&&/FORM&&&BR&&&FORM ACTION="getpost.asp" METHOD="post"&&&INPUT TYPE="text" NAME="Text" VALUE="&&&INPUT TYPE="submit" VALUE="Post方式"&&/INPUT&&&/FORM&&&BR&&% If Request.QueryString("Text") && "" Then %&&通过get方式传递的字符串是:&"&B&&%= Request.QueryString("Text") %&&/B&"&BR&&&% End If %&&% If Request.Form("Text") && "" Then %&&通过Post方式传递的字符串是:&"&B&&%= Request.Form("Text") %&&/B&"&BR&&&% End If %&&
[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢所有回答(3)
能说下是用哪个工具构造的包吗,我也很感兴趣,应该很好玩吧,是不是wireshark?
园豆:1470
园豆:1470
园豆:1470
看到&但是不用三次握手&我就知道你没学过网络基础&&&
TCP连接的建立是一定会发生三次握手的。
http包就是字符串流,你接收后能解析字符串就没问题了
园豆:26633
园豆:26633
园豆:26633
你的 HTTP 请求的内容是什么?
园豆:44916
园豆:44916
清除回答草稿
&&&您需要以后才能回答,未注册用户请先。http request报文结构是怎样的_百度知道
http request报文结构是怎样的
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:1979
获赞数:1133
HTTP请求报文分为HTTP请求方法、请求URI、协议版本、HTTP首部字段和HTTP内容主体(RFC2616文档叫body)。 其中HTTP请求方法、请求URI、协议版本位于同一行,它们仨之间用空格来分割,HTTP请求方法就是GET、POST、OPTIONS等,比如像这样:GET index.html HTTP/1.1。当HTTP请求的方法是POST方法时,POST到服务器的内容就放在HTTP主体部分。接下来是HTTP首部字段,HTTP协议规定,HTTP首部字段和HTTP主体之间是以一个空行分割的,而HTTP首部由一个个字段构成,每一行是一个字段。一行字段是个什么意思呢:以\r\n这两个字符(反斜杠没有实际含义,它是转义字符)为结束符来表示一行。因为\r\n两个字符是一行的结束符,HTTP首部和主体之间又以一个空行来分割,所以一个空行的\r\n结束符,再加上上一行也就是最后一个字段的结束符\r\n,也就是说,当Web服务器程序检测到\r\n\r\n四个字符时,就知道,从这四个字符的下一个字符开始就是HTTP body的内容了,而\r\n\r\n的前面的内容都是HTTP首部。HTTP首部的字段有很多很多,而且HTTP请求首部和HTTP响应首部的字段是不一样的,每个字段的含义可以参见RFC2616文档,因为RFC文档是英文的,推荐你可以参考一下图解HTTP这本书,可以下载一个PDF电子书浏览一下。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。1.一次完整的HTTP请求所经历的7个步骤
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:&
1. 建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建 Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则, 只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令&
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
3. Web浏览器发送请求头信息&
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。&
4.&Web服务器应答&
客户机向服务器发出请求后,服务器会客户机回送应答,&HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
5.&Web服务器发送应答头信息&
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。&
6.&Web服务器向浏览器发送数据&
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7.&Web服务器关闭TCP连接&
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:
Connection:keep-alive&
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
2.请求报文和响应报文
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
HTTP请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
<request-line>
<headers>
<blank line>
[<request-body>
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
而常见的有如下几种:
最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(&?&)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind,这样通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。以用google搜索domety为例,Request格式如下:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: &a href="http://www.google.cn/"&http://www.google.cn/&/a&
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: &a href="http://www.google.cn"&www.google.cn&/a&
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=fc3b714:NW=1:TM=:LM=:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
可以看到,GET方式的请求一般不包含&请求内容&部分,请求数据以地址的形式表现在请求行。地址链接如下:
&a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq="&http://www.google.cn/search?hl=zh-CN&source=hp
&q=domety&aq=f&oq=&/a&
地址中&?&之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用&&&符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。
对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参 数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。还以上面 的搜索domety为例,如果使用POST方式的话,格式如下:
POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: &a href="http://www.google.cn/"&http://www.google.cn/&/a&
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: &a href="http://www.google.cn"&www.google.cn&/a&
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=fc3b714:NW=1:TM=:LM=:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety
可以看到,POST方式请求行中不包含数据字符串,这些数据保存在&请求内容&部分,各数据之间也是使用&&&符号隔开。POST方式大多用于页 面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优 势,我们应该根据不同的情况来选择是使用GET还是使用POST。
HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
2.请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号&:&分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
4.请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
如下所示,HTTP响应的格式与请求的格式十分类似:
<status-line>
<headers>
<blank line>
[<response-body>]
&正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下。
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
下面给出一个HTTP响应报文例子
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/charset=ISO-8859-1
Content-Length: 122
<title>Wrox Homepage</title>
<!-- body goes here -->
关于HTTP请求GET和POST的区别
1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中), 以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd& password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
&&POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
&&因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。
2.传输数据的大小:
&& 首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
&& GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
&&&因此对于GET提交时,传输数据就会受到URL长度的限制。
&&&POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。
3.安全性:
&&&&POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的&安全&不是同个概念。上面&安全&的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。
阅读(...) 评论()

我要回帖

更多关于 组报文时找不到非空字段什么意思 的文章

 

随机推荐