第一篇讲了Web Forms编程和HTTP协议。目的是希望你能理解:Web的确需要HTTP协议,尽管HTTP的某些特性会阻碍Web的发展。
第二篇贴了一些ASP.NET页面和它们在浏览器中的源代码,以及ASP.NET程序运行后,Response和Request对象的一些内容。目的是作为理解后面内容的一个准备。
第三篇讲解HTTP协议一些重要的特点,尤其是它的无状态性。这点对于Web应用程序很重要。
第四篇介绍HTTP协议本身,包括客户端请求,服务器响应,以及在服务器端需要有一个抽象模型来处理ASP.NET文件,来帮助这个请求和响应的过程。
在本篇,通过工具,进一步看看HTTP协议如何工作。可以利用MS telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗体上显示出来;或是使用SecureCRT Telnet工具,如图1所示;或是利用网络协议分析工具,如Ethereal,如图2所示。
图1 SecureCRT工具 图2 Ethereal工具
下面以Ethereal为例,这个工具提供的信息满全面的,除了分析HTTP协议,你也可以试试其他协议:
1, 建立环境。一台服务器,IP地址为18.1.1.120,两台客户端(A和B),IP地址分别为18.1.1.90和18.1.1.119。什么机器都可以,我在把我自己的机器当作服务器,两台客户端用同事的机器;Ethereal安装在服务器上。
2, 建立网站。用.NET新建一个项目,添加两个页面,一个是.htm文件,一个是.aspx文件;
.aspx文件内容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Analyze HTTP protocol</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table>
<tr>
<td>
<asp:TextBox ID="TextBox1" runat="server" Text="Analyze HTTP protocol"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Analyze HTTP protocol" OnClick="Button1_Click" />
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="TextBox2" runat="server" Width="352px"></asp:TextBox></td>
</tr>
</table>
</div>
</form>
</body>
</html>
其后台代码如下:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string str = this.TextBox1.Text.ToString();
this.TextBox2.Text = Base64String(str);
}
private string Base64String(string input)
{
byte[] info = System.Text.Encoding.Unicode.GetBytes(input);
long dataLength = (long)((4.0d / 3.0d) * info.Length);
if (dataLength % 4 != 0)
{
dataLength += 4 - dataLength % 4;
}
char[] base64CharArray = new char[dataLength];
Convert.ToBase64CharArray(info, 0, info.Length, base64CharArray, 0);
string base64String = new string(base64CharArray);
return base64String;
}
其中,私有的成员函数Base64String()是将一个字符串转换成Base64编码。.NET序列化页面上下文环境时采用Base64编码,比如第二篇中看到的那些。 .htm文件内容略。
3, 运行Ethereal。
1) 配置,如图3所示。
点击菜单栏“Capture”->“Options”,弹出如图3所示的窗口,设置Ethereal。首先,勾选“Display Options”区域内的所有设置,这样可以实时看到Ethereal拦截和分析的数据包的过程。再点击该窗口的“Capture Filter”按钮,弹出如图4所示的窗口,设置Ethereal分析HTTP协议,点击“OK”。
图3 配置Ethereal
图4 配置Ethereal
设置完成后,点击图3中的“Start”按钮,Ethereal将开始分析HTTP。
2) 分析,如图5所示。
图5 分析HTTP协议
4, 通过客户端访问网页。
先测试一下客户端访问.htm文件,通过下面四个步骤,看看Ethereal都得到了什么。
1) 客户端A打开浏览器,访问http://18.1.1.120/Default.htm,将看到Ethereal出现几条信息;
2) 客户端A不关闭浏览器,只是重新输入http://18.1.1.120/Default.htm,但是Ethereal没有反应;
3) 客户端A关闭浏览器,重新输入http://18.1.1.120/Default.htm,将看到Ethereal又出现几条信息,但是与之前不同;
4) 客户端B打开浏览器,访问http://18.1.1.120/Default.htm,将看到Ethereal出现几条信息。
5) 经过这四个步骤后,Ethereal获得如下信息,如图6所示:
图6 分析结果
我们观察一下区域1。第一列No是数据包的序号,包到达的先后顺序;第二列Time是这个包传输的时间;第三列Source是源地址,发包的机器;第四列Destination是目的地址,接受包的机器;第五列Protocol是网络协议。因为我们在图4中进行了设置,所以,在这里只会看到TCP和HTTP这两个协议;第六列Info是包的信息。
再仔细看一个区域1。序号1~10是前面的步骤1),序号11~16步骤3),序号17~26是步骤4)。
再观察一下区域2。当你点击区域1中的某条信息时,区域2会相应变化。有没发现区域二事实上就是OSI/ISO网络参考模型。
下面具体分析一下序号1~10的信息。
1) 序号1~3,显然是TCP/IP协议“三次握手”;
2) 序号4,客户端A向服务器端请求Default.htm页面请求。可以看到很相信的请求信息,就是第三篇文章中所提到的。如图7所示;
图7 客户端A请求
3) 序号5,服务器端响应这个请求。如图8所示:
图8 服务器端响应
4) 序号就都是关于TCP/IP协议的。因为响应客户端请求后,HTTP协议会释放连接。但序号6~8有点奇怪,客户端莫名其妙请求了一个“favicon.ico”文件,我没有用这个文件啊,结果服务器端响应了一下,序号7和8。
下面具体分析一下序号11~16的信息。
1) 序号11~13,还是“三次握手”;
2) 序号14,客户端A再次请求了Default.htm页面;
3) 序号15,服务器端响应这个请求,如图9所示。这个响应有点意思,还记得序号11~16是什么操作吗?是客户端A第二次向服务器请求同一个页面,结果,服务器没有返回页面内容,而是告诉客户端A“104 Not Modified”,也就是说,客户端A向服务器端请求了一个与之前一模一样的页面。但是,如果客户端A,清除了浏览器的缓存,那么就跟序号1~10一样了。
图9 服务器端响应
4) 之后的序号是释放连接。
序号17~26是客户端B向服务器端请求Default.htm文件。与序号1~10一样。
以上是客户端A和B访问.htm文件的情形。下面看看要是访问.aspx文件如何。
图10
序号01~11,第一次请求Default.aspx页面;
序号12~18,第一次点击按钮;
序号19~22,第二此单击按钮;
序号23~26,第三此单击按钮;
序号27~33,关闭浏览器,第二次请求Default.aspx页面;
序号34~37,第一次单击按钮;
序号38~46,请求一个不存在的页面。
图11
序号07~09,本应该没有,可能是我机器有病毒的原因;
序号10~11,为释放TCP连接。