APP下载

一种简易Web服务器的设计与实现

2016-02-29

电子科技 2016年1期

王 栋

(西安电子科技大学 电子信息攻防对抗与仿真重点实验室,陕西 西安 710071)

一种简易Web服务器的设计与实现

王栋

(西安电子科技大学 电子信息攻防对抗与仿真重点实验室,陕西 西安710071)

摘要文中基于Linux操作系统,介绍了在Linux下实现Web服务器的一种方法。通过对HTTP协议的分析,给出了Web服务器的实现细节。在一个局域网中,将此Web服务器程序运行在一台装有Ubuntu Linux的电脑上,并通过局域网中其他计算机上的浏览器正常访问,验证了文中所实现的Web服务器的正确性。

关键词Linux;HTTP;Web服务器

Design and Implementation of a Simple Web Server

WANG Dong

(Key Laboratory of Electronic Information Countermeasure and Simulation,Xidian University,Xi’an 710071,China)

AbstractThis paper describes the detailed implementation of a web server under Linux with the HTTP protocol.This web server program running on a computer with Ubuntu Linux can be normally accessed by other computer in the LAN,thus verifying the correctness of this Web server.

KeywordsLinux;HTTP;Web server

Linux操作系统自1991年诞生以来,由于其安全性好且成本低,而被越来越多的服务器、工作站以及个人电脑使用[1]。基于Linux以上优点,本文选择在Ubuntu环境下实现一个简单的Web服务器。

1设计流程

1.1 实验室环境搭建

本文在一台装有Ubuntu的电脑上实现Web服务器。并通过网线将此电脑连接在与其他电脑在一起的局域网中,当此电脑的Web服务器开始运行后,局域网中的其他电脑可以通过各自的浏览器访问服务器的Web页面,如图1所示。

图1 环境搭建

1.2 HTTP协议概述

应用层协议HTTP是Web的核心。HTTP协议在Web的客户端程序和服务器程序中得以实现,运行在不同系统上的客户端程序和服务器程序,通过HTTP得到信息的交流。

HTTP协议是基于客户端/服务器之间的请求响应进行交互的。一个客户端与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符、协议版本号等。服务器接收到客户端的请求后向客户端发送响应的响应信息。如图2所示,是一个客户端和服务器之间的HTTP协议访问基本过程。

在Internet上,HTTP通信通常发生在TCP/IP连接之上[2]。默认端口是TCP协议的80端口,本文的端口号设为8080。HTTP只能在TCP协议的基础上进行传输。

图2 客户端和服务器之间的HTTP请求响应过程

HTTP协议的C/S模式的信息交换过程分为:建立连接、发送请求信息、发送响应信息、关闭连接4个过程。(1)建立连接。连接的建立是通过申请套接字(Socket)实现的;(2)发送请求。打开一个连接后,客户端把请求消息送到服务器的监听端口上,完成请求操作。请求常用的方法有GET和POST,GET方法会将请求参数放在URL中,而POST方法不会放到URL中这样比较安全;(3)发送响应。服务器在处理完客户的请求之后,要向客户端发送响应消息。响应头信息包括:服务程序名、通知客户请求的URL需要认证、请求的资源核实能使用;(4)关闭连接。客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话。

1.3 服务器软件设计

本文设计的Web服务器使用的是并发服务器,即多个用户可同时访问本Web服务器。如图3所示,主父进程调用函数Socket()[3]函数建立套接字文件描述符,调用函数Bind()绑定地址,调用Listen()函数来设定侦听队列长度。然后主进程进入主处理进程,等待客户端连接的到来。当客户端的连接请求到来时,服务器的Accept()[4]成功返回,此时服务器端进行进程分叉,父进程继续等待客户端的连接请求;而子进程则处理客户端的业务请求,接收客户端的数据,分析数据并返回结果。

图3 服务器结构

(1)Socket()。由于应用层协议HTTP的传输层使用的是TCP协议,使用Socket(AF_INET,SOCK_STREAM,0)建立套接字;

(2)Bind()。将地址信息和申请的套接字绑定起来,这里使用IP地址为服务器任意IP地址,端口号使用8080。

sin.sin_family=AF_INET;

sin.sin_port=htons(8080);

sin.sin_addr.s_addr=htons(INADDR_ANY);

bzero(&(sin.sin_zero),8);

bind(httpd,(struct sockaddr *)&sin,sizeof(struct sockaddr));

(3)listen()。侦听端口,这里设置为20;

(4)accept()。客户端连接到了服务器,这个函数会返回一个套接字文件描述符,使用这个文件描述符便可与客户机进行数据交互了;

(5)fork()。由于子进程完全复制父进程里的数据,所以处理数据部分交给子进程处理,减轻父进程处理数据压力;

(6)数据处理部分。首先客户机会通过浏览器发送一个GET请求,服务器接收到此数据后,首先判断客户端请求的是否为GET方法,若是,则进一步判断请求的文件是否存在;若存在,则根据客户端的请求发送对应的数据内容。如图4所示。

图4 数据处理部分

响应信息是对请求的回应,在HTTP响应信息中包括4个部分:状态行、响应头标、空行和响应数据。响应信息的状态行格式为[5]:

HTTP-Version Status-Code Reason-Phrase CRLF

其中各个字段的含义如下

HTTP-Version:代表向客户端表示当前服务器可处理的最高协议版本。

Status-Code:代表3为的响应代码,指出本次请求的结果是成功或失败,如果失败则指出响应的原因。

Reason-Phrase:为响应代码作进一步解释。

例如,在响应信息HTTP/1.1 200 OK中,HTTP/1.1代表服务器端所支持的协议版本号为HTTP/1.1;200代表请求成功;OK是200的进一步解释[6]。响应码信息如表1所示。

表1 响应码信息

发送完响应头信息,便可向客户端发送数据内容了。若成功,本文发送的头的信息为:

HTTP/1.1 200 OK

Server:WDServer

Content-Type:text/html;charset=utf-8

接下来就是HTML文档了。HTML(Hypertext Marked Language)即超文本标记语言,是一种用来制作超文本文档的简单标记语言。在浏览网页时,看到的一些丰富的影像、文字、图片等内容都是通过HTML表现出来的。用HTML编写的超文本文档被称作HTML文档,其能独立于各种操作系统平台,移植被用作WWW的信息表示语言。在HTML中,每个用来作为标签的符号都是一条命令、其告诉浏览器如何显示文本。这些标签均由”<”和”>”符号,以及一个字符串组成。而浏览器的功能是对这些标记进行解释后,显示出文字、图像、动画等效果[7]。而本文只是实现一个Web服务器,故只写一个简单HTML[8]文档来验证服务器的功能。

本文发送的HTML文档内容为:

如上所示,浏览器会将此代码转化成页面的标题为wd’ HomePage,内容为“Hello! I’m Web Server”的页面。若在测试时看到此页面则说明Web服务器工作正常。

2运行和测试

本文利用在Ubuntu下运行Web Server 服务器端程序,然后在其他客户端的浏览器地址上输入服务器端的IP地址,通过返回过来的页面内容判断其运行的正确性。测试步骤如下:

(1)在服务器端运行服务器端程序,等待客户端的连接。如图5所示,可看出Web Server的IP地址为219.245.66.116。

图5 Web服务器开始运行

(2)由于此服务器设置的端口是8080端口,所以在客户机浏览器中输入219.245.66.116:8080。如图6所示,可看出服务器端得到了响应,也能在服务器端看出接进来的服务器的IP地址为219.245.66.83,所使用的端口号分别为58050,58051和58052。并看到浏览器显示的页面,内容为“Hello! I’m Web Server!”标题为wd’s HomePage,说明此服务器工作正常。

图6 客户机通过浏览器连接服务器

3结束语

本文通过提出基于Linux的Web服务器的设计思路,采用Linux C语言编程,满足了实现HTTP请求响应的要求。尤其是其开源特性,使得诸多公司或个人均喜欢将其作为开发平台。再加上Linux具有较强的移植性,可将其移植到ARM,PowerPC,MIPS等主流处理器中[9]。所以也可将本文所实现的Web服务器应用到基于这些处理器的嵌入式设备当中。

参考文献

[1]鸟哥.鸟哥的Linux私房菜:基础学习篇[M].3版.北京:人民邮电出版社,2010.

[2]宋敬彬,孙海滨.Linux网络编程[M].2版.北京:清华大学出版社,2014.

[3]RichardStevensW,StephenARago.Unix环境高级编程[M].3版.戚正伟,张亚英,尤晋元,译.北京:人民邮电出版社,2014.

[4]NeilMatthew,RichardStones.Linux程序设计[M].4版.陈健,宋健建,译.北京:人民邮电出版社,2010.

[5]刘冰,赵廷涛,邵文豪,等.LinuxC程序基础与实例讲解[M].北京:清华大学出版社,2009.

[6]DavidGourley,BrianTotty,MarjorieSayer,etal.HTTP权威指南[M].陈娟,赵振平,译.北京:人民邮电出版社,2012.

[7]高洛峰.细说PHP[M].北京:电子工业出版社,2009.

[8]JonDuckett.Web编程入门经典-HTML.XHTML和CSS[M].2版.杜静,敖富江,译.北京:清华大学出版社,2010.

[9]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.

作者简介:王栋(1990—),男,硕士研究生。研究方向:Linux系统应用。

收稿日期:2015- 05- 13

中图分类号TP316.85

文献标识码A

文章编号1007-7820(2016)01-121-04

doi:10.16180/j.cnki.issn1007-7820.2016.01.033