• HTTP 协议演示——演示(55)


      • 第一篇讲了 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

    图 1 SecureCRT 工具

    2

    图 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#" %>
     
    <!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>
        <script runat="server">
       1:  
       2:  
       3:     protected void Page_Load(object sender, EventArgs e)
       4:     {
       5:     }
       6:     protected void Button1_Click(object sender, EventArgs e)
       7:     {
       8:         string str = this.TextBox1.Text.ToString();
       9:         this.TextBox2.Text = Base64String(str);
      10:     }
      11:     private string Base64String(string input)
      12:     {
      13:         byte[] info = System.Text.Encoding.Unicode.GetBytes(input);
      14:         long dataLength = (long)((4.0d / 3.0d) * info.Length);
      15:         if (dataLength % 4 != 0)
      16:         {
      17:             dataLength += 4 - dataLength % 4;
      18:         }
      19:         char[] base64CharArray = new char[dataLength];
      20:         Convert.ToBase64CharArray(info, 0, info.Length, base64CharArray, 0);
      21:         string base64String = new string(base64CharArray);
      22:     
      23:         return base64String;
      24:     }
      25:  
    </script>
    </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>

    其中,私有的成员函数 Base64String() 是将一个字符串转换成 Base64 编码。.NET 序列化页面上下文环境时采用 Base64 编码,比如第二篇中看到的那些。
    3,  运行 Ethereal

    1)  配置,如图3所示。

    点击菜单栏 "Capture" –> "Options",弹出如图 3 所示的窗口,设置 Ethereal。首先,勾选 "Display Options" 区域内的所有设置,这样可以实时看到 Ethereal 拦截和分析的数据包的过程。再点击该窗口的 "Capture Filter" 按钮,弹出如图 4 所示的窗口,设置 Ethereal 分析 HTTP 协议,点击 "OK"。

    3

    图 3 配置 Ethereal

    4

    图 4 配置 Ethereal

    设置完成后,点击图3中的 "Start" 按钮,Ethereal 将开始分析 HTTP。

    2)  分析,如图 5 所示。

    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

    图 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

    图 7 客户端 A 请求

    3) 序号 5,服务器端响应这个请求。如图 8 所示:

    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

    图 9 服务器端响应

    4) 之后的序号是释放连接。

    序号 17~26 是客户端B向服务器端请求 Default.htm 文件。与序号 1~10 一样。

    以上是客户端 A 和 B 访问 .htm 文件的情形。下面看看要是访问 .aspx 文件如何。

    10

    图 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 连接。

  • 相关阅读:
    android测试开发环境搭建
    通过CMD命令行创建和使用Android 模拟器 AVD
    android 内存泄露测试
    NullPointerException检测
    iOS Automated Tests with UIAutomation
    命令方式重新签名apk
    Monkey log分析说明
    jQuery选择器总结[转]
    Java工程带库编译运行
    【转】从零开始学习Gradle之二---如何使用Task
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2719104.html
Copyright © 2020-2023  润新知