毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx

上传人:b****4 文档编号:8298012 上传时间:2023-05-10 格式:DOCX 页数:13 大小:82.16KB
下载 相关 举报
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第1页
第1页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第2页
第2页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第3页
第3页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第4页
第4页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第5页
第5页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第6页
第6页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第7页
第7页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第8页
第8页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第9页
第9页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第10页
第10页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第11页
第11页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第12页
第12页 / 共13页
毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx

《毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。

毕业设计论文题目Linux下HTTP服务器设计Word格式文档下载.docx

Linux操作系统是一个开放源代码的免费操作系统。

它不仅有安全、稳定、成本低的特点,而且很少发现有病毒传播。

HTTP服务器是web服务器的一种,它是基于超文本传输协议HTTP的服务器。

基于Linux具有稳定、可靠、安全和强大的网络功能这些优点,使得其主要应用于服务器领域。

所以本文选择在Linux环境下实现一个HTTP服务器。

本文研究了Linux下HTTP服务器的设计与实现。

在Linux系统中采用HTTP协议和浏览器完成数据的传输。

阐述了Linux套接字编程的方法、EPOLL等I/O复用编程模型。

详细分析了HTTP协议内容以及客户端与服务器之间的通信过程。

本文实现了客户端浏览器和服务器端以HTTP协议进行请求和响应的功能。

同时对服务器进行了一个简单的压力测试。

所有程序代码均为Linux下的C语言编程。

关键字:

Linux、HTTP服务器、HTTP协议、EPOLL

Abstract

TheLinuxoperatesystemisafreeoperatesystemwhichopensasourcecode.Notonlyithascharacteristicssuchassafe,stability,andthelowcost,butalsoitseldomdisseminatestheVirus.HTTPserverisoneoftheWebserversanditbasesonHTTPprotocol.AstheLinuxoperatingsystemhasthefunctionofstable,reliable,safeandpowerfulnetwork,itmainlyusedinservers.TorealizeaHTTPserverintheLinuxenvironmentisthebestchoice.

ThispaperintroducesdesignandimplementofHTTPserverinLinuxoperatingsystem.IntheLinuxsystemandbrowserusedHTTPprotocolfordatatransmission.ThispaperexpoundsthemethodofLinuxsocketprogrammingandEPOLLI/Omultiplexingprogrammingmodel.DetailedanalysisthecommunicationprocessbetweenclientandserverandHTTPprotocol.ThispaperrealizesthefunctionthattheclientbrowserrequestsandtheserverrespondsbyHTTPagreement.Makeasimplepressuretestontheserver.AllprogramcodeusetheClanguageprogramminginLinuxoperatingsystem.

Keyword:

Linux,HTTPServer,HTTPprotocol,EPOLL

前言

随着Internet的迅速发展与普及,网络已经延伸到世界的各个角落。

在该技术基础上发展起来的www,通过超文本向用户提供全方位的多媒体、超媒体信息,从而为全世界的Internet用户提供了一种获取信息、共享资源的途径。

由于用户在通过Web浏览器访问信息资源的过程中,无需再关心一些技术性的细节,而且界面非常友好,因而Web在Internet上一推出就受到了热烈的欢迎,走红全球,并迅速得到了爆炸性的发展。

所以Web服务器在网络中的地位日益重要。

当今社会中已有了许多知名的商用服务器,如MicrosoftIIS、IBM WebSphere、BEAWebLogic、Apache、Tomcat等。

但往往这些功能强大的服务器其结构也相当复杂,规模较大,在一些特定应用情景下(如嵌入式设备)就不太适合了。

同时一个简单小巧的服务器也有利于我们学习网络编程的相关知识,对服务器原理也能有进一步的了解。

本文设计实现了一个功能简单、结构小巧的HTTP服务器,采用EPOLL多路I/O复用机制来实现并发服务。

网络编程采用socket,服务器端创建套接字、绑定套接口、设置套接口为监听模式,将该监听套接字加入EPOLL事件列表,然后无限循环等待EPOLL返回,对返回事件的套接字进行读或写的处理。

若为新连接,则将其加入到EPOLL事件列表;

若为已有连接则读取其请求或向其发送响应;

若客户端已断开或已发送完响应,服务器端就断开该连接,并将该套接字从EPOLL事件列表中移除。

主要提供对静态请求的处理,解析客户端请求报文,回送请求的文件和响应报文的功能。

第一章绪论

1.1课题背景

随着计算机网络技术的发展,客户/服务器(Client/Server)结构逐渐向浏览器/服务器(Browser/Server)结构迁移,B/S方式已成为一种时尚,大部分网络应用系统都是以这种B/S方式与网络用户交换信息。

B/S的基础是客户端要有一个浏览器程序,服务器端要有一个与之对应的Web服务器。

所以,Web服务器在B/S方式下起着决定性的作用,且其应用地位日益重要。

Linux系统凭借其开源、稳定、高效的特点,在服务器市场拥有较大的市场份额。

Linux作为网络服务器市场的佼佼者,网络服务应用是其精华与核心。

当前商用的服务器大都规模比较大,功能强大的同时结构也比较复杂。

自己实现一个简单小巧的HTTP服务器,对于理解服务器工作原理知识,或针对一些特定情景下的HTTP服务器应用来说,不失为一种比较好的方式。

1.2课题研究的目的和意义

随着Internet的普及,网络已经深入到了我们的生活,跟我们息息相关。

Linux系统作为网络应用的重要平台,如何更好的去学习和使用Linux系统便是我们要面对的问题。

同时,作为当今互联网最主要的应用——www服务,其为全世界的Internet用户提供了一种获取信息、共享资源的途径。

www服务主要的提供者就是其后端的HTTP服务器,所以如何更为高效的研究和学习Web服务器的相关知识,也是我们必须要关注的。

本文在Linux环境下设计和实现了一个简单的HTTP服务器。

使用socket库完成网络底层的通信,使用HTTP协议来和客户端进行数据传输,使用EPOLL多路I/O复用机制来完成并发服务,最后还进行了一个简单的并发性能测试。

通过对此课题的研究学习,我们能更好的掌握Linux系统的使用,加深对HTTP协议的理解。

同时能对服务器设计的相关理论和实践有一定了解。

第二章HTTP服务器的相关理论基础

本章主要介绍设计HTTP服务器的相关理论知识。

包括Linux系统简介、TCP/IP协议分析、Linux下网络编程介绍、HTTP协议分析。

2.1Linux系统简介

简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于x86系列CPU的计算机上。

这个系统是由世界各地的成千上万的程序员设计和实现的。

其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

Linux以它的高效性和灵活性著称。

Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。

Linux是在GNU(GNU’sNotUnix)公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。

Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。

它还包括带有多个窗口管理器的X.Windows图形用户界面,如同我们使用WindowsNT一样,允许我们使用窗口、图标和菜单对系统进行操作。

Linux具有Unix的优点:

稳定、可靠、安全,有强大的网络功能。

在相关软件的支持下,可实现WWW、FTP(FileTransferProtoc01)、DNS(DomainNameSystem)、DHCP((DynamicHostConfigureProtocol,动态主机配置协议)、Email等服务,还可作为路由器使用,利用ipchains/iptables可构建NAT(NetworkAddressTranslation,网络地址转换)及功能全面的防火墙。

现在,Linux已经成为了一种受到广泛关注和支持的操作系统。

包括国际商用机器公司和惠普、戴尔在内的一些计算机业巨头也陆续支持Linux,并且成立了一些组织支持其发展,如OpenInventionNetwork(OIN)(成员有IBM,索尼,NEC,Philips,Novell,Redhat等)购买了微软专利,允许任何个体以开放的原则使用。

很多人认为,和微软Windows相比,作为自由软件的Linux具有低软件成本,高安全性,更加可信赖等优势,但是同时却需要更多的人力成本。

2.2TCP/IP协议分析

由于当今世界上的绝大部分网络程序都是建立TCP/IP(传输控制协议/网际协议)协议的基础上的。

所以有必要对TCP/IP的协议内容有所了解。

这一节主要对TCP/IP协议进行分析。

2.2.1TCP/IP协议概述

TCP/IP协议并不完全符合OSI的七层参考模型。

传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。

该模型的目的是使各种硬件在相同的层次上相互通信。

这7层是:

物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

这4层分别为:

应用层:

应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

传输层:

在此层中,它提供了节点间的数据传送,应用程序之间的通信服务,主要功能是数据格式化、数据确认和丢失重传等。

如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

互连网络层:

负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

链路接口层:

接收IP数据报并进行传输,从网络上接收物理帧,抽取IP数据报转交给下一层,对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、SerialLine等)来传送数据。

图2-1TCP/IP层次结构图

2.2.2网络层协议(IP协议)

IP协议是网络层的主要协议,是Internet最重要的协议。

在IP协议中规定了在Internet上进行通信时应遵守的规则。

例如IP数据包的组成、路由器如何将IP数据包送到目的主机等。

IP协议在主机和网络之间寻址和路由数据包。

IP是一个无连接的协议,主要负责在主机间寻址并为数据包设定路由,在交换数据前它并不建立会话。

因为它不保证正确传递。

另一方面,数据在被收到时,IP不需要收到确认,所以它是不可靠的。

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层——TCP或UDP层;

相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。

IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

IP协议的数据格式如下:

版本号(4)

IHL(4)

服务类型(8)

数据包长度(16)

标识(16)

Flag(3)

偏移量(13)

生存时间(8)

传输协议(8)

校验和(16)

源地址(32)

目的地址(32)

选项(8)+填充

数据

图2-2网际协议IP数据格式

版本号:

协议的版本号,不同版本的协议格式或语言可能不同,现在常用的是IPV4。

生存时间(TimeToLive,TTL):

8bit,即IP分组在IP网络中的寿命。

协议(Protocol):

8bit,指明IP分组中数据字段携带的是哪种高层协议的数据。

首部检查和(headerchecksum):

16bit。

此字段只用于检查IP分组的首部,不包括数据字段。

源IP地址(sourceIPaddress):

32bit,填入源主机的IP地址。

目标IP地址(destinationIPaddress):

32bit,填入目标主机的IP地址。

可选字段(IPoptions):

可选,可变长,1字节-40字节,但加上填充字段(填充0)后两个字段长度必须为4Bytes的整数倍。

IP地址标识着网络中一个系统的位置。

我们知道每个IP地址都是由两部分组成的:

网络号和主机号。

其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;

而主机号确定网络中的一个工作端、服务器、路由器及其它TCP/IP客户端。

对于同一个网络号来说,主机号是唯一的。

每个TCP/IP主机由一个逻辑IP地址确定。

2.2.3传输层协议(TCP和UDP)

1.TCP协议

传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议,由IETF的RFC793说明。

它在传送数据时是分段进行的,主机交换数据必须建立一个会话。

它用比特流通信,即数据被作为无结构的字节流。

通过每个TCP传输的字段指定顺序号,以获得可靠性。

如果一个分段被分解成几个小段,接收主机会知道是否所有小段都已收到。

通过发送应答,用以确认别的主机收到了数据。

对于发送的每一个小段,接收主机必须在一个指定的时间返回一个确认。

如果发送者未收到确认,数据会被重新发送;

如果收到的数据段损坏,接收主机会舍弃它,因为确认未被发送,发送者会重新发送分段。

TCP端口为信息的传送指定端口,端口号小于256的定义为常用端口。

下图展示了TCP首部的数据格式。

如果不计任选(Options)字段,那么,它的大小是20个字节。

图2-3TCP包头格式

TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手(three-wayhandshake),过程如下图所示。

(1)客户机向服务器发送一个TCP数据包,表示请求建立连接。

(2)服务器收到了数据包,知道这是一个建立请求的连接,服务器也通过发回具有以下项目的数据包表示回复:

同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。

(3)客户机收到了服务器的TCP,知道是从服务器来的确认信息。

于是客户机也向服务器发送确认信息。

至此客户端完成连接。

(4)服务器收到确认信息,也完成连接。

图2-4TCP建立连接(三次握手)

TCP协议建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。

具体过程如下图所示。

图2-5TCP断开连接

2.UDP协议

UDP是UserDatagramProtocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

用户数据报协议UDP提供了无连接的数据报服务。

它适用于无须应答并且通常一次只传送少量数据的应用软件。

2.3Linux下网络编程介绍

Linux下的网络编程主要是基于Linux提供的SocketAPI函数来进行的。

所以,Linux下的网络编程的基础就是对socketAPI函数的掌握,就必须理解和学会使用socket接口。

同时针对并发服务,Linux下提供了I/O复用等高效的形式来满足并发的要求。

2.3.1Socket简介

Socket接口是TCP/IP网络的API。

Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。

要学习Internet上的TCP/IP网络编程,必须理解Socket接口。

  

Socket接口设计者最先是将接口放在Unix操作系统里面的。

如果了解Unix系统的输入和输出的话,就很容易了解Socket了。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。

Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

常用的Socket类型有两种:

流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。

流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;

数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

2.3.2Socket创建

为了创建Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。

socket函数原型为:

intsocket(intdomain,inttype,intprotocol);

domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);

type参数指定socket的类型:

SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;

protocol通常赋值“0”。

Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用Socket函数时,socket执行体将建立一个Socket,实际上"

建立一个Socket"

意味着为一个Socket数据结构分配存储空间。

Socket执行体为你管理描述符表。

两个网络程序之间的一个网络连接包括五种信息:

通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。

Socket数据结构中包含这五种信息。

2.3.3Socket配置

通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。

面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。

无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。

Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。

Bind函数原型为:

intbind(intsockfd,structsockaddr*my_addr,intaddrlen);

Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;

addrlen常被设置为sizeof(structsockaddr)。

structsockaddr结构类型是用来保存socket信息的:

  structsockaddr{

  unsignedshortsa_family;

/*地址族,AF_xxx*/

charsa_data[14];

/*14字节的协议地址*/

};

sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;

sa_data则包含该socket的IP地址和端口号。

另外还有一种结构类型:

  structsockaddr_in{

  shortintsin_family;

/*地址族*/

  unsignedshortintsin_port;

/*端口号*/

  structin_addrsin_addr;

/*IP地址*

  unsignedcharsin_zero[8];

/*填充0以保持与structsockaddr同样大小*/

};

这个结构更方便使用。

sin_zero用来将sockaddr_in结构填充到与structsockaddr同样的长度,可以用bzero()或memset()函数将其置为零。

指向sockaddr_in的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;

或者相反。

使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:

  my_addr.sin_port=0;

/*系统随机选择一个未被使用的端口号*/

  my_addr.sin_addr.s_addr=INADDR_ANY;

/*填入本机IP地址*/

通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。

同样,通过将my_addr.sin_addr.s_addr置为INADDR_ANY,系统会自动填入本机IP地址。

注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序;

而sin_addr则不需要转换。

计算机数据存储有两种字节优先顺序:

高位字节优先和低位字节优先。

Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。

下面是几个字节顺序转换函数:

·

htonl():

把32位值从主机字节序转换成网络字节序

htons():

把16位值从主机字节序转换成网络字节序

ntohl():

把32位值从网络字节序转换

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2