初识HTTP消息头

     但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。
     做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。


下面就来看一个简单的例子:
首先制作一个非常简单的网页,它的内容只有一行:
<html><body>helloworld</body></html>
把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:
     1
解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
       协议名:http
       主机名:localhost
       端口:8080
       对象路径:/simple.htm
     2
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
     3
使用TCP协议连接到主机的指定端口(localhost,8080),并发送已封装好的数据包
     4
等待服务器返回数据,并解析返回数据,最后显示出来
由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下:

GET/simple.htm HTTP/1.1<CR>
Accept: image/gif, image/x-xbitmap,image/jpeg, image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, */*<CR>
Accept-Language:zh-cn<CR>
Accept-Encoding: gzip, deflate<CR>
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR1.1.4322; .NET CLR 2.0.50727)<CR>
Host:localhost:8080<CR>
Connection:Keep-Alive<CR>
<CR>
     为了显示清楚我把所有的回车的地方都加上了“ <CR>” ,注意最后还有一个空行加一个回车,这个空行正是 HTTP 规定的消息头和消息体的分界线,第一个空行以下的内容就是消息体,这个请求数据包是没有消息体的。
消息的第一行“ GET” 表示我们所使用的 HTTP 动作,其他可能的还有“ POST” 等, GET 的消息没有消息体,而 POST 消息是有消息体的,消息体的内容就是要 POST 的数据。后面 /simple.htm 就是我们要请求的对象,之后 HTTP1.1 表示使用的是 HTTP1.1 协议。
     第二行的Accept表示我们所用的浏览器能接受的 Content-type ,值为*/*时表示接收任何MIME类型,三四两行则是语言和编码信息,第五行显示出本机的相关系信息,包括浏览器类型、操作系统信息等,很多网站可以显示出你所使用的浏览器和操作系统版本,就是因为可以从这里获取到这些信息。 第六行表示我们所请求的主机和端口,第七行表示使用 Keep-Alive 方式,即数据传递完并不立即关闭连接。 服务器接收到这样的数据包以后会根据其内容做相应的处理,例如查找有没有“ /simple.htm” 这个对象,如果有,根据服务器的设置来决定如何处理,如果是 HTM ,则不需要什么复杂的处理,直接返回其内容即可。但在直接返回之前,还需要加上 HTTP 消息头。

服务器发回的完整HTTP消息如下:

HTTP/1.1200 OK<CR>
Server: Microsoft-IIS/5.1<CR>
X-Powered-By:ASP.NET<CR>
Date: Fri, 03 Mar 2006 06:34:03GMT<CR>
Content-Type: text/html<CR>
Accept-Ranges:bytes<CR>
Last-Modified: Fri, 03 Mar 2006 06:33:18GMT<CR>
ETag: "5ca4f75b8c3ec61:9ee"<CR>
Content-Length:37<CR>
<CR>
<html><body>helloworld</body></html>
     同样,我用“ <CR>” 来表示回车。可以看到,这个消息也是用空行切分成消息头和消息体两部分,消息体的部分正是我们前面写好的 HTML 代码。
     消息头第一行“ HTTP/1.1” 也是表示所使用的协议,后面的“ 200OK” HTTP 返回代码, 200 就表示操作成功,还有其他常见的如 404 表示对象未找到, 500 表示服务器错误, 403 表示不能浏览目录等等。
第二行表示这个服务器使用的 WEB 服务器软件,这里是 IIS5.1 。第三行是 ASP.Net 的一个附加提示,没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的 content-type ,浏览器会根据它来决定如何处理消息体里面的内容,例如这里是 text/html ,那么浏览器就会启用 HTML 解析器来处理它,如果是 image/jpeg ,那么就会使用 JPEG 的解码器来处理。
     消息头最后一行“ Content-Length” 表示消息体的长度,从空行以后的内容算起,以字节为单位,浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值