3.2 HTTP协议

浏览器上网浏览网页,其原理也同属于上部分所描述的网络应用程序,浏览器就是客户端程序,网站服务器就是服务器程序,其占用80端口。当客户端程序访问网站时,在原理上就是访问服务器的80端口,浏览器和服务器交换数据的协议为HTTP协议,其原理就是发送请求、接收数据,而且数据都是文本形式传送的。

在介绍HTTP协议前,请下载并安装工具:HttpWatch,执行Setup.exe后,从桌面上启动HttpWatch Studio,点菜单『文件』->『打开』选择httpwatch.lic完成注册。安装完毕后,打开IE浏览器,点菜单『查看』=>『浏览器栏』=>『httpwatch』如下图:

这时IE浏览器的下方将出现两个框架的窗口,每一行都代表浏览器和服务器的一次交互,下面左边是发出的数据,右边是接收到的数据,其它选项都是以此为基础进行整理便于阅读,后续开发过程务必注意必须以这里的『』部分数据为准。

请务必保持安装MASTUDIO开发群里的HttpWatch的版本,这对于后续请求技术支持提供问题数据有着重要的作用,在后续遇到问题的时候,只需要将浏览的过程保存为.hwl文件发送给MAS技术支持即可,同版本可交互方便。

通过HttpWatch来观察浏览器和服务器的交互过程,可以更好的理解和分析HTTP协议,下面依据HTTP发展来依次介绍:

HttpWatch下载地址:

       http://www.mastudio.org/down/4.html
3.2.1GET协议

   当用户在浏览器把输入网址:http://www.mastudio.org/index.asp时,浏览器对网址进行拆分,为www.mastudio.org/index.asp两部分,然后形成如下格式的数据包:

GET /index.asp HTTP/1.1
Host:www.mastudio.org
Accept:text/*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Cookie: ASP.NET_SessionId=iayjigr33x5zqb45m2xeya3p; path=/
Cookie: iofficelanguage=language=zh-cn; expires=Fri, 31-Dec-9999 23:59:59 GMT

所有协议数据包都是文本字符串的形式,每行文本通过\r\n分开,最后一行有2 表示协议结束。

第一行以GET开头,表示向服务器请求其后的目标/index.asp,请求的协议版本为HTTP/1.1,目标就是从网址中拆出来。

第二行Host表示请求的服务器域名为www.mastudio.org,也是从网址中拆出来。

第三行Accept表示浏览器接收服务器反馈数据的格式,text/*表示接收所有文本形式的反馈数据。

第四行User-Agent表示浏览器的标别,IE浏览器和Firfox浏览器各有不同。

第五行和第六行是Cookie,这个字段在下面另行描述。

WEB服务器接收到如上所描述数据包后,会返回如下格式的数据,其中<html>往下是我们可以在浏览器里通过查看源代码获取到,浏览器在整个和WEB服务器的交互过程中都隐藏了头部分,它们是事实存在而且很重要。

HTTP/1.1 200 OK
Date: Wed, 30 Apr 2008 02:27:01 GMT
Server: Microsoft-IIS/6.0
Content-Type: text/html; charset=gb2312
Content-Length: 9584
<HTML>
<title>欢迎浏览</title>
<body>…………………………省略………………………………………………….…</body> </HTML>

前面部分是HTTP协议的头,下面则是正文HTML代码,中间通过2\r\n分开。首先看头部分:

第一行表示返回的状态代码为200 状态意义为OK

第二行表示返回数据的时间。

第三行表示服务器的标识,如果IIS或者APACHE

第四行表示返回内容的类型和编码,这里表示返回GB2312编码的文本。

第五行表示返回数据的长度,也就是下面从<HTML>开始到结束部分的总长度。

最下面部分的数据就是HTML代码,浏览器通过HTML代码进行显示页面。

3.2.2POST协议

当浏览器上显示输入表单,输入数据提交给服务器则和GET有所区别,假设有个表单形式如下图所示:


表单的代码如下,其有2个字段分别为szNameszAge,用户输入后提交给服务器这2个字段的内容。

<form method="Post" enctype="application/x-www-form-urlencoded" action="/save.asp">
                  
<p>姓名: <span ><INPUT TYPE="TEXT" NAME="szName"></span></p>
<p年龄: <span ><INPUT TYPE="TEXT" NAME="szAge"></span></p>
                  
<p class=MsoNormal align=center style='text-align:center'>
    <span lang=EN-US>
        <INPUT TYPE="SUBMIT" VALUE="提交输入内容">
        <INPUT TYPE="RESET">
    </span>
</p>
</form>

当用户输入数据后按下提交按钮则系统将szNameszAge数据提交给目标/save.asp进行处理,处理完成系统再返回结果。

当用户输入数据点『提交』后浏览器形成如下格式的数据包,发送给服务器:

POST /save.asp HTTP/1.1
Host:www.mastudio.org
Accept:text/*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Cookie: upNum=0; path=/
Content-Length:20
szName=mas&szAge=123

第一行POST表示向目标/save.asp发送数据,采用HTTP/1.1协议。

第二行Host表示域名为www.mastudio.org

第三行Accept表示接收返回的数据格式。

第四行User-Agent表示浏览器的识别。

第五行Cookie下篇介绍

第六行Content-Length表示下面提交的数据流的长度,也就是szName=mas&szAge=123的长度。

WEB服务器收到如上的数据包后,其由目标/save.asp进行数据接收和处理,处理后返回如下:

HTTP/1.1 200 OK
Date: Wed, 30 Apr 2008 02:26:59 GMT
Content-Length: 10238
Content-Type: text/html
                      
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>填写登录信息[中高移动互联论坛 MAStudio]</title>

前面部分是HTTP协议的头,下面则是正文HTML代码,中间通过2\r\n分开。首先看头部分:

第一行表示返回的状态代码为200 状态意义为OK

第二行表示返回数据的时间。

第三行表示返回数据的长度。

第四行表示返回内容的类型。

返回的数据也就是下面从<HTML>开始到结束部分的总长度,下面部分的数据就是HTML代码,浏览器通过HTML代码进行显示页面。

3.2.3Cookie协议

以上两部分是HTTP的基础协议,完成基本的请求数据、发送数据操作。由于浏览器和服务器之间建立的网络连接是完成即断开的模式,也就是浏览器在访问一个URL的时候,其从发出网络连接à发出请求数据à接收返回数据à断开网络连接,即为结束。当一个网页包含有很多图片的时候,浏览器则重复以上动作很多次来完成。

由于这样的机制导致了服务器在接收到请求后,其不知道是谁发送请求数据,也就是无法针对多用户的情况来区分每一个用户。在于需要给予权限来访问的页面则依靠前面的GETPOST是很难实现的,这就引入了Cookie机制。

一个Cookie其有4个属性组成,分别为所在域名、有效期、名字、值。由服务器发送给浏览器,浏览器接收后将其保存到本地硬盘中,在后续的访问其它网址过程中,每次都把这个Cookie一起提交给服务器,服务器也就依据此来判断访问者的身份了。

例如登陆到http://www.mastudio.org/sample/login.asp,输入用户名和密码后,服务器会发送一个Cookie到浏览器来表示是否登陆成功。

例如发送的数据包格式如下提交给服务器用户名和密码:

POST /sample/login.asp HTTP/1.1
Host:www.mastudio.org
Content-Length:20
                  
szName=mas&szPwd=123

服务器处理返回数据,其中Set-Cookie字段表示服务器给予此用户分配一个Cookie,其名字为AuthID值为S4JK495JKJFGNNNK,浏览器并将其保存到本地硬盘中,那么本地浏览器就是保存了一个在域名www.mastudio.org,有效期不限、名字为AuthID、值为S4JK495JKJFGNNNKCookie

HTTP/1.1 200 OK
Date: Wed, 30 Apr 2008 02:26:59 GMT
Content-Length: 10238
Content-Type: text/html
Set-Cookie: AuthID= S4JK495JKJFGNNNK
                      
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>填写登录信息[中高移动互联论坛 MAStudio]</title>

登陆成功获取到Cookie后,后续访问所有同域名的网址,浏览器都会把上面获取到的Cookie一起提交给服务器,来表明自己的身份。比如访问:

http://www.mastudio.org/sample/getgrid.asp地址,发出的数据包格式为:

GET /sample/getgrid.asp HTTP/1.1
Host:www.mastudio.org
Accept:text/*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Cookie: AuthID=S4JK495JKJFGNNNK

   这里最后一行Cookie则把前面获取到Cookie的名字和值发送给服务器,服务器依据此则可以判断出用户是否已经登陆成功。

3.2.4、编码

AASCII

我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有01两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 000000011111111

ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A65(二进制01000001)。

BGB2312

字符必须编码后才能被计算机处理,计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5

GB2312(1980)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。从ASCIIGB2312、这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理,区分中文编码的方法是高字节的最高位不为0

CUNICODE

是一个字符集,其在于包含世界上所有文字和符号的编码,其中中、日、韩的三种文字占用了Unicode0x30000x9FFF的部分,Unicode目前普遍采用的是UCS-2, 即用两个字节来编码一个字符,  比如汉字""的编码是0x7ECF。注意字符编码一般用十六进制来表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制就是32463

UCS-2用两个字节来编码字符,两个字节就是16位二进制,216次方等于65536,所以UCS-2最多能编码65536个字符。编码从0127的字符与ASCII编码的字符一样,比如字母"a"Unicode编码是0x0061,十进制是97,而"a"ASCII编码是0x61,十进制也是97

对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的,简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来编码。

DUTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

      1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

      2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

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

   Unicode符号范围                         |                      UTF-8编码方式

   (十六进制)                                     |                      (二进制)

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

   0000 0000-0000 007F                |                    0xxxxxxx

   0000 0080-0000 07FF                |                    110xxxxx 10xxxxxx

   0000 0800-0000 FFFF                |                    1110xxxx 10xxxxxx 10xxxxxx

   0001 0000-0010 FFFF                |                    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

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

下面还是以汉字“严”为例,演示如何实现UTF-8编码。根据字符编码表“严”的unicode0X4E2510011000100101),根据上表对应,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0,这样就得到了,“严”的UTF-8编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5

      E、编码应用

      以上介绍的编码在HTTP协议中有着广泛的应用,在试图明确这个问题之前,可以先到百度和谷歌搜索一下同一个关键词。

如搜索“一级棒”:

百度搜索里输入上面的关键字,URL里显示的是:

http://www.baidu.com/s?wd=%D2%BB%BC%B6%B0%F4

谷歌搜索里输入上面的关键字,URL里则显示的是:

http://www.google.cn/search?hl=zh-CN&q=%E4%B8%80%E7%BA%A7%E6%A3%92

合并起来加上%符号

GB2312

D2BB

BCB6

B0F4

%D2%BB%BC%B6%B0%F4

UTF-8

E4B880

E7BAA7

E6A392

%E4%B8%80%E7%BA%A7%E6%A3%92

通过以上表格可以看出HTTP协议中使用的GB2312编码以及UTF-8编码的形式,对于汉字,一般性的%xx%yy2%形式组成的则为GB2312编码,由%xx%yy%zz形式组成的则为UTF-8编码。

      你好”的编码形式为:

GB2312编码

%C4%E3%BA%C3

UTF-8编码

%E4%BD%A0%E5%A5%BD

UNICODE编码

%u4f60%u597d

UTF-8编码

浣犲ソ

      你好”UTF8编码形式在URL%E4%BD%A0%E5%A5%BD形式,而在UTF8的文字形式采用写字板打开查看则是“浣犲ソ”的形式。

      通过本段分析,可以对于HTTP协议中所有的编码进行分析。以上编码在GET的应用如下所示范,其中目标中%C4%E3%BA%C3为编码后的字符串,所以在访问一个URL的时候,必须通过HttpWatch才可以准确的看出系统所采用的编码以及形式。

GET /index.asp?xyz=%C4%E3%BA%C3 HTTP/1.1
Host:www.mastudio.org
Accept:text/*
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)

  以上编码在POST的应用如下所示范,其中提交的数据部分字段szName的值%E4%BD%A0%E5%A5%BD为编码后的值,一般性POST提交的数据均会进行编码传送。

POST /forum/login.asp HTTP/1.1
Host:www.mastudio.org
Accept:text/*
Content-Length:20
szName=%E4%BD%A0%E5%A5%BD&szAge=123


↑ Go to top