最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

WEB Server工作原理及其应用编程方法

来源:动视网 责编:小OO 时间:2025-09-28 12:21:11
文档

WEB Server工作原理及其应用编程方法

Cfgdemo项目分析WEBServer工作原理及其应用编程方法说到WEBServer,就不能不提到HTTP协议HTTP是HyperTextTransferProtocol的缩写,中文译称超文本传输协议。它和FTP协议一样,都是基于TCP的应用层协议,但它们服务器端使用的端口号不一样:通常情况下,FTP使用的端口号是20(数据链接)、21(控制链接),而HTTP使用的端口号是80。HTTP协议是一个采用的请求/响应模型的协议。HTTP协议最典型的应用是在WEB服务器和WEB浏览器之间传递数据。
推荐度:
导读Cfgdemo项目分析WEBServer工作原理及其应用编程方法说到WEBServer,就不能不提到HTTP协议HTTP是HyperTextTransferProtocol的缩写,中文译称超文本传输协议。它和FTP协议一样,都是基于TCP的应用层协议,但它们服务器端使用的端口号不一样:通常情况下,FTP使用的端口号是20(数据链接)、21(控制链接),而HTTP使用的端口号是80。HTTP协议是一个采用的请求/响应模型的协议。HTTP协议最典型的应用是在WEB服务器和WEB浏览器之间传递数据。
Cfgdemo项目分析

WEB Server工作原理及其应用编程方法

    

说到WEB Server,就不能不提到HTTP协议

HTTP是Hyper Text Transfer Protocol的缩写,中文译称超文本传输协议。它和FTP协议一样,都是基于TCP的应用层协议,但它们服务器端使用的端口号不一样:通常情况下,FTP使用的端口号是20(数据链接)、21(控制链接),而HTTP使用的端口号是80。HTTP协议是一个采用的请求/响应模型的协议。HTTP协议最典型的应用是在WEB服务器和WEB浏览器之间传递数据。

    下面举个例子来说明WEB浏览器和WEB服务器之间的交互过程:

    1)网络环境

附注:服务器端包括两个文件:index.html和

2)建立链接

    在HTTP Client(WEB浏览器IE)和HTTP Server(WEB服务器)进行数据传递的之前,需要在两者之间建立一个TCP链接,用于在两者之间传输HTTP报文。

当我们在IE的地址栏里输入:http://192.168.1.54\\index.html并回车时,可以用软件sniffer捕获H1和H2之间的传输数据。在分析报文数据之前,我们先来分析一下它的含义:

    http://:            代表超文本传输协议,一般情况下不用输入(默认的)

192.168.1.54:    代表WEB服务器的地址(http://已暗示服务器端端口号为80)

\\index.html:        代表根目录下的网页文件

因此这句话的含义就是获取服务器上192.168.1.54:80根目录下的index.html文件。

用sniffer捕获到的前三个包分析结果如下:

序号源端地址目的地址包内容备注
1192.168.1.55:1903192.168.1.54:80SYN同步
2192.168.1.54:80192.168.1.55:1903SYN+ACK同步+应答

3192.168.1.55:1903192.168.1.54:80ACK应答
由此可见这三个TCP包是用来并成功地在HTTP Client(临时端口1903)和HTTP Server(固定端口80)之间建立一个TCP链接。

3)提交获取index.html文件的请求

建立好链接之后,客户端会向服务器端发一个HTTP报文来请求获取index.html文件,用sniffer捕获的结果如下:

从该报文的TCP报头可知该HTTP报文大小为3字节,从HTTP报头可以看出该HTTP报文仅仅含有HTTP包头,而没有数据。HTTP报头分为8行,每行以回车-换行符(CRLF -"\\r\\n")结束。其中第一行称为Request-Line,HTTP协议为它定义了一个具体的语法格式:

Method  Request-URI  HTTP/1.1  CRLF

这里,Method=GET、Request-RUI=/index.html(/和/index.html一样),服务器端处理这样的Request-Line时会解释为客户端请求获取服务器根目录下的index.html文件。第2-7行一起称为一个Header,其中每一行称为一个头域,每一个头域又由域名、冒号和域值三个部分组成,它们是用来告诉服务器一些与客户端相关的信息,让服务器据此来做一些决策。最后一行由回车-换行符组成。

接下来,我应该注意到TCP包头中PUSH位置1了,表示客户端要求服务器端尽快把这个包交给应用层,这时,服务器端向客户端发送一个应答,表示服务器端已经这个报文交给了应用层去处理。用sniffer捕获到的前三个包分析结果如下:

序号源端地址目的地址包内容备注
5192.168.1.54:80192.168.1.55:1903ACK应答
4)获取index.html文件

接下来服务器端就向客户端传输index.html文件。由于index.html文件的大小为3078字节,而TCP包最大的数据容量也就1460(1460=1500-20-20,HTTP包的最大数据容量比1460还要小,因为还要扣除HTTP包头),因此,要分多个TCP包才能完成此文件的传输。使用sniffer捕获的结果如下(只截取了HTTP包头部分):

从这里可以看出,服务器端的数据是分三次传送到客户端的,TCP协议传送的数据字节数为3356(3356=1460+1460+436),HTTP报文数据的字节数为3078(Content-Length)。这里面,为什么TCP协议传送的数据字节数比HTTP协议传送的数据字节数要多278呢?这是由于第一个TCP报文数据里包含了278个字节的HTTP报头,也就是上图标有行号的1-10共十一行数据。这里的HTTP报头称为Full-Response报头,分为11行。其中第一行成为Response-Line,HTTP协议为它定义了一个具体的语法格式:

HTTP/1.1  Status-Code    Reason-Phrase     CRLF

这里,Status-Code=200,Reason-Phrase=”OK”,客户端处理这样的Response-Line时会解

释为服务器端正确响应了客户的请求。第2-9行一起称为一个Header,其中每一行称为一个头域,每一个头域又由域名、冒号和域值三个部分组成。它们是用来告诉客户器一些相关的信息,譬如:服务器端响应客户端的数据长度由”Content-Length: 3078”头域表示;接收完数据之后是否关闭该TCP链接由”Connection: close”表示;传送的数据格式由”Content- Type: text/html”表示等。最后一行由回车-换行符组成。

至此,index.html文件就传送到客户端,并由客户端的IE浏览器进行解释显示了。

5)关闭链接

我们再来看看第4)步中3个TCP报文中的最后一个,用sniffer捕获并分析,结果如下(仅分析TCP包头):

这里看出Push和FIN位都置上了1,表示服务器端要求客户端尽快把这个包提交给应用层(Push)并断开这个TCP链接(FIN)。客户端作出应响应并配合断开这个链接。用sniffer捕获到的前三个包分析结果如下:

序号源端地址目的地址包内容备注
9192.168.1.55:1903192.168.1.54:80ACK应答
10192.168.1.55:1903192.168.1.54:80FIN断开
11192.168.1.54:80192.168.1.55:1903ACK应答
至此,一次完整的TCP链接的建立HTTP请求HTTP响应TCP链接的断开过程就完成了。

6)IMG标号的处理

当客户端IE浏览器解释并显示index.html文件时,会发现里面有这样一条语句:

它表示该index.html文件中插入了一个名为的图形文件,显示宽度位236个象素,同时也告知了该文件位于WEB服务器的根目录下。但是在前面的传输过程中并没有把该文件传输到客户端,所以IE浏览器为了能完整的显示index.html文件,就必须得重新建立TCP链接,通过HTTP协议把该文件传过来。其过程同获取index.html文件的过程基本相同。

用sniffer捕获到并分析,其结果如下:

序号源端地址目的地址包内容备注
12192.168.1.55:1904192.168.1.54:80SYN同步
13192.168.1.54:80192.168.1.55:1904SYN+ACK同步+应答

14192.168.1.55:1904192.168.1.54:80ACK应答
15192.168.1.55:1904192.168.1.54:80PUSH+HTTPHTTP请求

16192.168.1.54:80192.168.1.55:1904ACK应答
17192.168.1.54:80192.168.1.55:1904HTTPHTTP响应

18192.168.1.54:80192.168.1.55:1904PUSH+HTTPHTTP响应

19192.168.1.54:80192.168.1.55:1904FIN+ACK断开+应答

20192.168.1.55:1904192.168.1.54:80ACK应答
21192.168.1.55:1904192.168.1.54:80FIN断开
22192.168.1.54:80192.168.1.55:1904ACK应答
至此,index.html就可以完整的显示出来了。

7)CGI程序

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捕获的前三个包分析结果如下:

序号源端地址目的地址包内容备注
23192.168.1.55:1905192.168.1.54:80SYN同步
24192.168.1.54:80192.168.1.55:1905SYN+ACK同步+应答

25192.168.1.55:1905192.168.1.54:80ACK应答
接着用sniffer捕获的包如下(这里只截取了HTTP报文部分):

从这里可以看出,HTTP报文由两部分组成:1-12行表示的HTTP报头,13行表示的的HTTP报文数据(51字节)。报头的第一行是一个Request-Line,如前所述,HTTP协议为它定义了一个具体的语法格式:

Method  Request-URI  HTTP/1.1  CRLF

这里,Method = POST、Request-RUI=/cgfpass.cgi,其中POST表示客户端要向服务器端提交长度为Content-Length的数据,/cfgpass.cgi表示提交的数据要交由服务器端根目下的名为cfgpass的CGI程序来处理。因此,服务器端接收到这样的一个Request-Line后会解释为客户端请求服务器调用根目录下的名为cfgpass的CGI程序来处理以HTTP协议传输的报文数据。2-11行称为Header,它们是用来告诉服务器一些相关的信息。12行为一个回车-换行符。接下来的就是51字节的HTTP报文数据:

password=CONFIG&passnew1=QIANYONG&passnew2=QIANYONG

    大家可以看出CONFIG、QIANYONG、QIANYONG是由客户端输入的。那么为什么点击[Change Password]会产生这样的报文数据呢?这与IE浏览器以及html文件有关。我们看index.html文件中如下一段代码:

Change User Password:

To change the configuration password, enter the old password, and the new password in the spaces below. 

User Password:
Enter New Password:
Re-Type New Password:

 

    如果你了解HTML语言的话,那么不难理解上面这段用HTML语言写程序,其中关键部分我用红色自己标识出来。FORM的action属性指定了Request-Line中的Request-URI为cfgpass.cgi,method属性指定了Request-Line中的Method为POST。FROM中的INPUT的name属性指定了要提交的数据的域名为password、passnew1、passnew2,客户端用户输入的数据称为域值,与其对应的域名一起构成一个域。当点击type=submit类型的按钮时,浏览器会将这些域按照一定的格式、通过HTTP协议发到服务器端。格式规定如下:

1)各个域用&分隔:                                域1&域2……

2)在每个域中,用=分隔域名和域值:                域名=域值

3)一个域中的空格需转换为+:                    I love youI+love+you

4)其他特定的键盘字符被编号为%十六进制值:        !%21(0x25 0x32 0x31)

知道这些格式规定以后,我们就应该能够很好地理解cfgdemo项目中函数cgiParseVars

的源代码。

    NDK对CGI程序的接口有一个统一的规定:

    int cgi_xxx(int htmlSock, int ContentLength, char *pArg)

    其中参数htmlSock是一个套接字,CGI程序可以利用该套接字和客户端进行通信。参数ContentLength指定了CGI程序需要处理的HTTP报文数据的长度。参数pArg指向一个以’\\0’结束的字符串。当Method=POST时,CGI程序应该调用recv从该套接字htmlSock上接收长度为ContentLength的HTTP报文数据,当Method=GET时,CGI不需调用recv去从套接字htmlSock上接收HTTP报文数据,此时CGI需要处理的数据在pArg指向的字符串中。

因此编写CGI程序的流程如下:

1)首先,CGI程序需要判断字符串指针pArg指向的字符串是否为NULL:如果是,那么要处理的是一个POST方法,如果不是,那么要处理的是一个GET方法; 

2)如果CGI程序要处理的是POST方法,那么按下列步骤编写程序:a)动态分配字节数为ContentLength+1的缓冲区;b)调用recv从套接字htmlSock上接收ContentLength个字节的数据到该缓冲区;c)在把缓冲区的最后一个字节设置为’\\0’;如果CGI程序要处理的是GET方法,那么此步可以忽略;

3)解析、处理该接收到的数据(POST)或字符串指针pArg指向的字符串(GET);

4)向客户端发送一个HTTP响应报文,其中HTTP包包头:

a)HTTP报文报头第一行必须是一个完整的Response-Line;

b)HTTP报文报头最后一行必须是CRLF结束;

c)HTTP报文数据必须和包头中指定的Content-Type保持一致(html、txt、gif等);

5)如果是处理POST方法,必须释放动态分配的内存;

6)返回值必须是0或者1(0:关闭该套接字);

总结:

    NDK中,WEB服务器应用编程步骤如下:

1)编写html文件;

2)用dos程序binsrc.exe(在\i\\NDK目录下能找到)把html文件以及html文件中引用的图片文件转换成常量数组的格式,调用格式如下:

     binsrc input-file-name output-file-name identifier

3)编写CGI程序;

4)调用efs_createfile()函数把常量数组格式的文件转换成EFS文件;

5)调用efs_createfile()函数CGI函数转换成EFS文件;

6)启动HTTP服务(亦即启动WEB Server):

a)方式一:在启动协议栈之前,调用CfgAddEntry()函数来添加(Tag,Item)=(CFGTAG_SERVICE,CFGITEM_SERVICE_HTTP)的配置项;

b)方式二:调用API函数HTTPOpen()开启HTTP服务;

7)停止HTTP服务(亦即停止WEB Server):

a)方式一:调用CfgRemovEntry()函数来删除(Tag,Item)=(CFGTAG_SERVICE,CFGITEM_SERVICE_HTTP)的配置项;

b)方式二:调用API函数HTTPClose()关闭HTTP服务;

8)调用efs_destroyfile()函数删除EFS文件;

    

文档

WEB Server工作原理及其应用编程方法

Cfgdemo项目分析WEBServer工作原理及其应用编程方法说到WEBServer,就不能不提到HTTP协议HTTP是HyperTextTransferProtocol的缩写,中文译称超文本传输协议。它和FTP协议一样,都是基于TCP的应用层协议,但它们服务器端使用的端口号不一样:通常情况下,FTP使用的端口号是20(数据链接)、21(控制链接),而HTTP使用的端口号是80。HTTP协议是一个采用的请求/响应模型的协议。HTTP协议最典型的应用是在WEB服务器和WEB浏览器之间传递数据。
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top