Cfgdemo项目分析
WEB Server工作原理及其应用编程方法
   
说到WEB Server,就不能不提到HTTP协议
HTTPHyper Text Transfer Protocol的缩写,中文译称超文本传输协议。它和FTP协议一样,都是基于TCP的应用层协议,但它们服务器端使用的端口号不一样:通常情况下,FTP使用的端口号是20(数据链接)、21(控制链接),而HTTP使用的端口号是80HTTP协议是一个采用的请求/响应模型的协议。HTTP协议最典型的应用是在WEB服务器和WEB浏览器之间传递数据。
    下面举个例子来说明WEB浏览器和WEB服务器之间的交互过程:
    1)网络环境
附注:服务器端包括两个文件:index.htmltibug.gif
2)建立链接
    HTTP ClientWEB浏览器IE)和HTTP ServerWEB服务器)进行数据传递的之前,需要在两者之间建立一个TCP链接,用于在两者之间传输HTTP报文。
当我们在IE的地址栏里输入:192.168.1.54\index.html并回车时,可以用软件sniffer捕获H1H2之间的传输数据。在分析报文数据之前,我们先来分析一下它的含义:
                代表超文本传输协议,一般情况下不用输入(默认的)
192.168.1.54    代表WEB服务器的地址(已暗示服务器端端口号为80
\index.html        代表根目录下的网页文件
因此这句话的含义就是获取服务器上192.168.1.54:80根目录下的index.html文件。
sniffer捕获到的前三个包分析结果如下:
序号
源端地址
目的地址
包内容
备注
1
192.168.1.55:1903
192.168.1.54:80
SYN
同步
2
192.168.1.54:80
192.168.1.55:1903
SYN+ACK
同步+应答
3
192.168.1.55:1903
192.168.1.54:80
ACK
应答
由此可见这三个TCP包是用来并成功地在HTTP Client(临时端口1903)和HTTP Server(固定端口80)之间建立一个TCP链接。
3)提交获取index.html文件的请求
建立好链接之后,客户端会向服务器端发一个HTTP报文来请求获取index.html文件,用sniffer捕获的结果如下:
从该报文的TCP报头可知该HTTP报文大小为364字节,从HTTP报头可以看出该HTTP报文仅仅含有HTTP包头,而没有数据。HTTP报头分为8行,每行以回车-换行符(CRLF "\r\n")结束。其中第一行称为Request-LineHTTP协议为它定义了一个具体的语法格式:
Method  Request-URI  HTTP/1.1  CRLF
这里,Method=GETRequest-RUI=/index.html//index.html一样),服务器端处理这样的Request-Line时会解释为客户端请求获取服务器根目录下的index.html文件。第2-7行一起称为一个Header,其中每一行称为一个头域,每一个头域又由域名、冒号和域值三个部分组成,它们是用来告诉服务器一些与客户端相关的信息,让服务器据此来做一些决策。最后一行由回车-换行符组成。
接下来,我应该注意到TCP包头中PUSH位置1了,表示客户端要求服务器端尽快把这个包交给应用层,这时,服务器端向客户端发送一个应答,表示服务器端已经这个报文交给了应用层去处理。sniffer捕获到的前三个包分析结果如下:
序号
源端地址
目的地址
包内容
备注
5
192.168.1.54:80
192.168.1.55:1903
ACK
应答
4)获取index.html文件
接下来服务器端就向客户端传输index.html文件。由于index.html文件的大小为3078字节,而TCP包最大的数据容量也就14601460=1500-20-20HTTP包的最大数据容量比1460还要小,因为还要扣除HTTP包头),因此,要分多个TCP包才能完成此文件的传输。使用sniffer捕获的结果如下(只截取了HTTP包头部分):
从这里可以看出,服务器端的数据是分三次传送到客户端的,TCP协议传送的数据字节数为33563356=1460+1460+436),HTTP报文数据的字节数为3078Content-Length)。这里面,为什么TCP协议传送的数据字节数比HTTP协议传送的数据字节数要多278呢?这是由于第一个TCP报文数据里包含了278个字节的HTTP报头,也就是上图标有行号的1-10共十一行数据。这里的HTTP报头称为Full-Response报头,分为11行。其中第一行成为Response-LineHTTP协议为它定义了一个具体的语法格式:
HTTP/1.1  Status-Code    Reason-Phrase    CRLF
这里,Status-Code=200Reason-Phrase=”OK”,客户端处理这样的Response-Line时会解
释为服务器端正确响应了客户的请求。第2-9行一起称为一个Header,其中每一行称为一个头域,每一个头域又由域名、冒号和域值三个部分组成。它们是用来告诉客户器一些相关的信息,譬如:服务器端响应客户端的数据长度由”Content-Length: 3078”头域表示;接收完数据之后是否关闭该TCP链接由”Connection: close”表示;传送的数据格式由”Content- Type: text/html”表示等。最后一行由回车-换行符组成。
至此,index.html文件就传送到客户端,并由客户端的IE浏览器进行解释显示了。
5)关闭链接
我们再来看看第4)步中3TCP报文中的最后一个,用sniffer捕获并分析,结果如下(仅分析TCP包头):
这里看出Push和FIN位都置上了1,表示服务器端要求客户端尽快把这个包提交给应用层(Push)并断开这个TCP链接(FIN)。客户端作出应响应并配合断开这个链接。sniffer捕获到的前三个包分析结果如下:
序号
源端地址
目的地址
包内容
备注
9
192.168.1.55:1903
192.168.1.54:80
ACK
应答
10
192.168.1.55:1903
192.168.1.54:80
FIN
断开
11
192.168.1.54:80
192.168.1.55:1903
ACK
应答
至此,一次完整的TCP链接的建立HTTP请求HTTP响应TCP链接的断开过程就完成了。
6IMG标号的处理
当客户端IE浏览器解释并显示index.html文件时,会发现里面有这样一条语句:
<IMG src="/tibug.gif" width=236></IMG>
它表示该index.html文件中插入了一个名为tibug.gif的图形文件,显示宽度位236个象素,
同时也告知了该文件位于WEB服务器的根目录下。但是在前面的传输过程中并没有把该文件传输到客户端,所以IE浏览器为了能完整的显示index.html文件,就必须得重新建立TCP链接,通过HTTP协议把该文件传过来。其过程同获取index.html文件的过程基本相同。
sniffer捕获到并分析,其结果如下:
序号
源端地址
目的地址
包内容
备注
12
192.168.1.55:1904
192.168.1.54:80
SYN
同步
13
192.168.1.54:80
192.168.1.55:1904
SYN+ACK
同步+应答
14
192.168.1.55:1904
192.168.1.54:80
ACK
应答
15
192.168.1.55:1904
192.168.1.54:80
PUSH+HTTP
HTTP请求
16
192.168.1.54:80
192.168.1.55:1904
ACK
应答
17
192.168.1.54:80
192.168.1.55:1904
HTTP
HTTP响应
18
192.168.1.54:80
192.168.1.55:1904
PUSH+HTTP
HTTP响应
19
192.168.1.54:80
192.168.1.55:1904
FIN+ACK
断开+应答
20
192.168.1.55:1904
192.168.1.54:80
ACK
应答
21
192.168.1.55:1904
192.168.1.54:80
FIN
断开
22
192.168.1.54:80
192.168.1.55:1904
ACK
应答
至此,index.html就可以完整的显示出来了。
7CGI程序
IE浏览器显示出index.html文件后(显示结果如下图所示),我们可以看到有两个按钮:[View Configuration][Change Password],客户端可以通过单击该按钮来向服务器端提交客户输入的信息。下面我们来分析后者---更改用户密码---的实现过程。
我们在User Password文本框中输入CONFIG(默认密码),在Enter New Password文本框中输入QIANYONG作为新密码,再在Re-Type New Password文本框中输入QIANYONG
进行确认,然后点击[Change Password]按钮,这样客户端就完成了密码修改工作。下面用sniffer捕获这个过程的交互过程。
首先要在客户端和服务器端建立一个TCP链接,用来进行HTTP协议的传输,所以用sniffer捕获的前三个包分析结果如下:
序号
源端地址
目的地址
包内容
备注
23
192.168.1.55:1905
192.168.1.54:80
SYN
同步
24
192.168.1.54:80
192.168.1.55:1905
SYN+ACK
同步+应答
25
192.168.1.55:1905
192.168.1.54:80
ACK
webserver接口开发应答
接着用sniffer捕获的包如下(这里只截取了HTTP报文部分):
从这里可以看出,HTTP报文由两部分组成:1-12行表示的HTTP报头,13行表示的的HTTP报文数据(51字节)。报头的第一行是一个Request-Line,如前所述,HTTP协议为它定义了一个具体的语法格式:
Method  Request-URI  HTTP/1.1  CRLF
这里,Method = POSTRequest-RUI=/i,其中POST表示客户端要向服务器端提交长度为Content-Length的数据,/i表示提交的数据要交由服务器端根目下的名为cfgpassCGI程序来处理。因此,服务器端接收到这样的一个Request-Line后会解释为客户端请求服务器调用根目录下的名为cfgpassCGI程序来处理以HTTP协议传输的报文数据。2-11行称为Header,它们是用来告诉服务器一些相关的信息。12行为一个回车-换行符。接下来的就是51字节的HTTP报文数据:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。