毕业论文 基于Linux的FTP服务器的研究与实现.docx
《毕业论文 基于Linux的FTP服务器的研究与实现.docx》由会员分享,可在线阅读,更多相关《毕业论文 基于Linux的FTP服务器的研究与实现.docx(30页珍藏版)》请在冰豆网上搜索。
![毕业论文 基于Linux的FTP服务器的研究与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/17/4cc060f8-a709-4d84-85a3-2a2c53117329/4cc060f8-a709-4d84-85a3-2a2c531173291.gif)
毕业论文基于Linux的FTP服务器的研究与实现
XXXXXXX
本科生毕业设计(论文)
题目:
基于Linux的FTP服务器的研
究与实现
姓名:
XXXXX
学号:
XXXX
学院:
XXXXXXXXXXXXXX
专业:
XXXXXXX
年级:
XXXXXXXXX
指导教师:
XXXXXXXXXXX(签名)
2012年月日
基于Linux的FTP服务器
摘要
本课题是基于Linux的FTP服务器的研究与实现,以RedhatLinux9.0为开发环境,通过C语言编写,运用FTP协议,共享内存,哈希表算法等各项技术对整个FTP服务器所需要的各个模块进行实现。
模块有:
守护进程的编程及验证,登录模块的编程,文件目录模块的编程,文件操作模块的编程,传输模块的编程,服务器工作模式的实现,以及其监控模块的实现。
完成了各项指标技术,以改善目前存在的一些问题,比如:
文件上传下载的速度过快,导致资源的分配不均匀;IP连接数不受控制导致的共享内容到处都可以得到,以及单IP连接数不受控制导致的系统资源消耗过大等等。
针对以上的问题,在服务器里面添加文件的上传下载速度和IP连接数的控制是非常有必要的。
从而提高了整个服务器的可靠性和共享性。
全文总共分为五大部分。
第一部分是第一章,主要包括绪论,描述项目背景以及发展状况、应用及意义。
第二部分是第二章,描述基于Linux的FTP服务器课题要求、服务器系统的组成框图、和控制性能指标。
第三部分是第三章,主要介绍了课题的设计方案和应用的基本原理。
第四部分是第四章,主要介绍了系统的主程序框图、重点功能的实现、调试过程,以及在编程与调试过程中遇到一些问题的解决。
第五部分是第五章,介绍操作步骤。
关键词:
LinuxFTP服务器FTP监控共享内存信号量
1绪论
1.1项目背景及发展状况分析
众所周知,随着经济和社会的不断发展,网络在人们的生活中占的位置越来越重,网络的普及带动了网络科技的发展。
而随着网络应用的发展,Linux因为开放源代码,良好的可移植性,具有多任务多用户的能力而越来越得到众多企业的青睐[1]。
在国内,经济实用的Linux产品正在进军中小企业市场。
据相关新闻报道,从2001年以来Linux在各行各业都在逐渐发展壮大,厂商大大小小也有好几十家,而且应用也越来越广泛。
比如国防科技大学,中标软件,红旗等等先后提出了Linux服务器操作系统,再比如Linux已经在政府、金融、农业、电信等领域占有了相当的市场份额并且保持着快速的增长率。
据可靠数据,WINDOWS系列产品的实际市场占有率约40%,Linux由于低成本的特点,也取得了大约35%的市场份额。
而在国外,Linux的运用是比较成熟的,比如在美国已经开设了专门的Linux课程;法国、西班牙等国家的中学也在积极推广使用Linux。
在国外的《USAToday》曾经报道过很多Linux广泛的应用实例,包括日本Lawson公司旗下的7600多家连锁店都是使用Linux操作系统;著名的Shell公司在石油勘测中使用Linux;据当时的调查表明财富500强企业中,有75%的企业开始运用和准备运用Linux系统。
由此可见Linux在国外发展的成熟程度。
RedhatLinux是目前世界上使用最多的Linux操作系统,因为它具备了良好的图形界面,无论安装、配置还是使用都非常方便,RedhatLinux9.0在此基础上增强了硬件的兼容性,而且在网络通信方面更加安全,是个人和企业服务器的最好选择[2]。
用户联网的主要目的就是进行信息的共享,而随着互联网的快速发展,信息共享的方式也是多种多样的。
FTP服务器就像是一个平台一样,把用户上传的数据存储在硬盘中,然后让具有上传下载等权限的用户通过FTP客户端进行资源的上传和下载等操作,以此来达到资源共享的目的。
随着网络的发展,局域网内使用FTP进行文件资料的交流方式越来越方便,因此FTP在企公司,学校等可构成局域网的场所的使用也越来越多。
可想而知,对于一个公司或者重要机构来说,没有一个资源共享的平台,那么在信息高速化的今天,如果他们之间的信息传递还是靠传统的手写或者打印,那么效率是多么的低啊,在这个物欲横流的时代,时间就是金钱,因此如果有一个好的共享平台在局域网内进行资源的共享和交流,那么就大大加大了局域网内部的办事效率。
1.2应用及意义
本课题所实现的FTP服务器是在Linux的虚拟机平台上运行的。
首先,Linux本身具有的多用户性即多个用户使用同一台计算机每个用户之间独立工作而不会相互干扰;多任务即使计算机可同时运行多个程序而不相互干扰;强大的网络功能,具有安全稳定高效以及良好的移植性使得此平台上开发出来的软件具有更高的可靠性和通信的安全性[3]。
其次,虚拟机是使用软件技术把一台运行在因特网上的服务器主机分成多个相对独立的域名和IP地址的虚拟主机,并且每个虚拟机上面都具有完整的Internet服务器功能,虚拟机之间各自独立互不干扰,这就决定了一台计算机上面可以运行多个FTP服务器。
最后FTP服务器是支持FTP协议的服务器,FTP协议是用于网络上进行文件传输的一套标准协议,它属于网络传输协议的应用层,是一个8位的客户端/服务器协议,可以进行任何类文件的操作而不需要进一步的处理。
FTP服务器一般运行在20和21两个端口,20号端口用于数据传输,而21号端口用于控制传输,因此使用的时候非常方便[4]。
不过在本课题中,我不会侵犯到FTP协议中的熟知端口,而是在1024以外的任何一个端口进行通信。
不过目前的FTP服务器很多都没有设置对客户端文件的上传下载速度的限制以及IP连接数单IP连接数的控制。
这样导致一些不怀好意的客户端会海量的下载在服务器上面的共享资源,导致资源的一边倒,别的客户端要下载就需要花很长的时间,还有一些带宽比较好的客户端也会在无形当中占有了服务器上面的大部分资源,上传下载就会发生异常。
同样如果不对IP的连接数进行控制,会导致很多其它无关的人会乱下载服务器上面的资源,这点在学校的实验室里面表现的更明显。
不仅如此,IP连接数不受控制很有可能会导致一些内部机密的泄露。
针对以上的问题,我在本课题里面多加了对上传下载速度的限制以及IP连接数的控制来解决。
2基于Linux的FTP服务器设计要求
2.1基于Linux的FTP服务器组成框图
FTP服务器的的组成如图2-1所示。
主要由登录模块、目录操作模块、文件操作模块、文件传输模块、工作模式、监控模块。
通过登陆模块进行用户的用户名和密码登陆,然后判断其权限对共享资源进行操作。
图2-1基于Linux的FTP服务器框图
2.2服务器的设计要求
由图2-1可知,为了完成课题基于Linux的FTP服务器需要完成如表3-1的功能。
表2-2基于Linux的FTP服务器功能列表
模块
功能
说明
登录模块
本地用户登录验证及权限管理
匿名用户登录及权限管理
匿名用户目录限制在/var/ftp目录底下,
不能访问其它目录
目录操作
添加目录
MKD或XMKD
文件操作
删除目录
RMD或XRMD
重命名目录
RNFR,RNTO
返回父目录
CDUP
改变工作目录
CWD或XCWD
列出目录详细清单
LIST
删除文件
DELE
文件传输模块
重命名文件
RNFR,RNTO
上传文件
STOR
两种工作模式
下载文件
RETR
断点续传
REST,APPE
主动连接
PORT
监控模块
被动连接
PASV
能够统计服务器上传下载文件数目,该有上传下载的字节数目,以及服务器当前连接数
要求用共享内存与信号量来实现
进程模型
限速
限制上传速度与下载速度
限制最大连接数
421
限制每IP最大连接数,
421
服务器在处理控制连接时,若收到数据传输请求时立刻创建一个子进程来实现数据传输。
2.3服务器的性能指标
(1)编程语言:
标准C语言;
(2)运行平台:
redhatlinux9.0
(3)完成上述的各项功能;
(4)可以用脚本启动服务器;
(5)上传下载速度误差:
±%10;
(6)IP连接数可随意控制;
(7)可进行断点续传。
3基于Linux的FTP服务器设计方案及原理
3.1可行性分析及方案的确定
首先,因为服务端的软件是一个守护进程,不需要图形界面,因此可以用比较低级的语言来开发,但是C语言相对C++,JAVA等语言来说冗余比较少,不仅如此,C语言是一种结构式的语言,有指针的概念,用户可以自己自定义数据的类型,灵活性比较高。
同时C语言兼容于多种操作系统,比如windows,linux,unix,dos等,因此我采用C语言作为开发语言[5]。
其次,选择Linux作为开发平台的主要原因如下:
(1)Linux自带了一个便于调试的gcc编译器。
gcc随着自由开发者的加入和gcc自身的发展,已经能编译很多的语言了,比如C、C++、JAVA等等。
而且gcc因为可以在所有的平台上面使用同一个前端处理程序,所以通常用来作为跨平台软件的编译器[6]。
(2)Linux下的shell工具可以使命令重新初始化用户的登录会话。
当给出该命令时,就会重新设置进程的控制终端的端口特征,并取消对端口的所有访问。
然后shell命令为用户把进程凭证和环境重新设置为缺省值,并执行用户的初始程序。
根据调用进程的登录用户标识建立所有的凭证和环境。
如果在可信路径上调用shell命令,并且/etc/security/user文件中用户的tpath属性没有always值,那么就不维护终端的可信环境。
该命令应该被setuid为root用户,以重新设置用户的进程凭证、授权执行访问所有用户[7]。
并且Shell充许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输。
因此,本系统ftp的启动,重启,及关闭都是运用shell的强大功能来实现的。
(3)在Linux上面具有make工具,它的基本的功能是调用makefile文件并且通过makefile文件来描述源程序之间的相互依赖关系并自动维护编译工作,因此使用起来简单又方便。
最后,文件传输协议(FTP协议)主要包括UDP(用户数据报)协议和TCP(传输控制)协议,而采用TCP协议作为FTP的通信传输协议主要是因为TCP的连接建立采用的是三次握手,这样就不会出现已失效的连接请求报文段突然又传到了服务器,从而保证提供面向连接的、可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。
而UDP协议在传送数据之前不需要建立连接,远程的主机运输层在收到UDP报文后,不需要给出确认,也就是不需要经过三次握手,提供的是不可靠交付[8]。
当然使用TCP主要是根据字节流的传输,因此可能会出现接收方收的不够或者太多问题,还有可能会出现拥塞问题,可是对于这些问题,我都在程序中会做相对应的处理。
TCP连接的端点叫做套接字或插口,而Linux的系统正好也又包含套接字这些系统函数,因此编程起来会比较方便。
3.2模块功能简介
如图2-2所示,整个FTP服务器主要包括登录模块、目录操作模块、文件操作模块、文件传输模块、工作模式、监控模块。
下面对各个模块进行简单的介绍。
(1)登录模块包含本地用户登录和匿名用户登录两种方式,匿名用户登录时要注意只能将其控制在/var/ftp目录下但是在客户端只能默认出现在根部录下。
登录用户方式时登陆的用户名必须是运行该程序的Linux环境下的一个用户,否则将无权进行登陆。
因为用户登录是根据Linux下的用户来确定登录的用户名和密码是否正确。
(2)目录操作模块主要实现的功能有添加目录,删除目录,重命名目录,父目录,改变工作目录,列出目录详细清单等,这些都是用户对目录的一些基本操作,当然要求这个用户不可以是匿名用户。
(3)文件操作模块包括删除文件,重命名文件,它一般和目录操作命令混合使用。
这里说的混合使用是指在客户端进行相应的操作的时候,客户端时行会对所进行的操作转化成为多个命令发送到服务器端。
(4)文件传输模块所要实现的功能主要有上传文件,下载文件,断点续传等等。
这里上传,下载文件是FTP服务器的基本的一项功能,而断点续传也是大部分客户有用到的功能,所谓的断点续传就是可以再断点的地方继续传,这是为了解决TCP协议中的重传问题,因此极大地方便了用户上传,下载文件,因为例如说有时候用户的一个文件没传完的话,如果没有断点续传的功能,那么下次下载该文件时,就只能从头开始下了这样子很不方便而且浪费时间,而如果有了这项断点续传功能的话那么客户就可以在下次下载该文件时利用断点续传的功能实现整个文件在上传或下载没有传好的地方继续上传或是下载功能。
(5)工作模式指的是pasv模式和port模式。
pasv模式即我们平常说的被动模式,这里的主被动是针对服务器来说的,被动模式即由客户端主动连接服务器以实现通信,而port模式即我们平常说的主动模式是由服务器主动连接客户端以达到通信的目的之后我会在下面详细说明。
(6)监控模块是一个大的模块,它所运用到的技术点也很多比如说共享内存、哈希表、信号量还有进程等等,它监控的信息主要有:
上传,下载文件的速度限制(为了解决拥塞问题);服务器最大连接数限制;每IP的最大连接数的限制。
3.3FTP的基本工作原理
文件传输协议(FTP)只是提供一些文件传送的一些基本服务,使用TCP可靠传输。
它使用客户服务器的方式,一个服务器进程可以被多个客户进程连接,主要由两大部分组成,一个是主进程,负责接收新的请求,一个是负责单个请求的从属进程,FTP的工作情况图3-1所示。
主进程工作步骤如下:
(1)打开配置文件中所设置的端口号,使客户进程可以连接的上;
(2)等待客户进程发出连接请求;
(3)启动从属进程来处理客户进程发来的请求。
从属进程对客户的请求处理完毕后立即终止,但是从属进程在运行期间可以根据需求fork一些子进程来处理相关事务;
(4)回到等待状态,继续等待其他客户的连接请求,主进程与从属进程的处理时并发进行的,互不干扰。
[8]
TCP控制连接
FTP客户端
TCP数据连接
图3-1FTP使用的两个TCP连接
由上图可知FTP在进行文件传输时,客户端与服务端之间要建立两个并行的TCP连接,一个是在会话期间一直打开进行监听的“控制连接”,一个用来进行客户端与服务端之间进行数据传输即“数据连接”。
当服务器接收到文件传输请求后建立“数据传送进程”和“数据连接”,文件传送结束后关闭数据传送进程,并结束运行。
4基于Linux的FTP服务器的重点模块实现
4.1主程序流程图
图4-1是本课题的主程序流程图。
通过这个主程序流程图可以看出,在程序开始的时候要先从配置文件中读取相关的内容,然后创建一个守护进程来避免进程的挂起问题,最后就是跟根据TCP协议创建通信模型。
通信模型的程序ftp_service()在附件中。
否
是
图4-1程序主流程
4.2进程的启动
在Linux环境下编程可以利用一个很好的工具,这个工具就是功能非常强大的SHELL,在Linux中SHELL是“Bash”。
Bash的优点是命令补全功能,命令历史(就是正常退出登录时会自动保存历史文件),而且重点是可以在前台或者后台执行。
为了节省系统资源,我用脚本的形式写的进程启动可以再后台默默的执行而不打扰其它进程的执行。
而所谓的SHELL是一个交互式命令解释器和一种命令编程语言,采用的语法和C编程语言及其相似,只是写的字母顺序相反,是交互式地从终端键盘或者是从一个文件来执行命令的。
因此SHELL不仅可以用来执行命令,还可以用来编写程序,并且它使用的是解释型语言,对其调度相对C语言来说比较容易[9]。
不仅如此,使用SHELL进行程序编程可以简单的完成一些小任务,同时就算是最古老的版本的Linux也会在安装中提供一个SHELL,所以用SHELL编写出来的脚本易于移植。
以下是本课题FTP服务器项目中所写的启动,停止,重起服务器的SHELL脚本。
#!
/bin/bash//为本脚本解析使用哪种shell来解释一下的代码
#Sourcefunctionlibrary.//源程序的库函数
./etc/rc.d/init.d/functions
#Sourcenetworkingconfiguration.//网络状态
./etc/sysconfig/network
#Checkthatnetworkingisup.//检查网络是否连接${NETWORKING}是一个数组
[${NETWORKING}="no"]&&exit0//0表示正常退出1表示异常退出
[-x/usr/local/bin/hfftpd]||exit0
RETVAL=0//一个标志位
prog="hfftpd"//进程名字
start(){
echo$"Starting$prog..."
/usr/local/bin/hfftpd/etc/hfftpd/hfftpd.conf&
daemontrue//这句daemontrue是指要用servicehfftpdstart这种方式启动脚本,注意脚本要拷贝到/etc/init.d/中,并且没有.sh后缀
RETVAL=$?
echo
return$RETVAL
}
stop(){
echo$"Shutingdown$prog..."
killproc$prog-3//这句是为了删除共享内存而设置的,如果不删除就会消耗系统资源。
RETVAL=$?
echo
return$RETVAL
}
case"$1"in
"start")
start
;;
"stop")
stop
;;
"restart")
stop
echo"$progstarting..."
sleep1;
start
RETVAL=$?
;;
*)
echo$"Usingas:
$0start|stop|restart"
exit1
Esac
exit$RETVAL
其中#是注释的意思。
系统通过case程序中的$1的参数只能允许为start,stop,restart,来判断得到哪一个参数而做其所对应的工作。
如果是“start”的时候,系统会根据RETVAL的值判断是不是第一次启动,如果RETVAL是0那么就是还未被启动,因此系统允许启动服务器,如果不是就提示服务器已经启动的字眼。
当参数如果是“stop”命令时,就先把所有main进程关闭并向每个主函数进程发送SIGQUIT,和SIGKILL信号(SIGQUIT是退出信号,SIGKILL是杀进程的信号),SIGQUIT信号在main进程中都对它们进行了安装,处理函数中有对它们的进行处理,如果是restart命令时要先关闭进程再启动main进程也就是重启。
4.3守护进程的实现
Linux系统在启动过程中会开启很多后台服务和进程,而其中运用的一个重要技术就是守护进程。
守护进程是生存期很长的一种进程,它会自动转到后台运行而且脱离与终端的联系不受终端的控制,为了能够等待解决一些事件的发生,它执行任务的时候是用周期性重复的执行方式,因此为了避免挂起,我在FTP也创建了一个守护进程来守护本FTP服务器。
创建守护进程的关键步骤如下:
(1)在后台实现
要实现守护进程在后台实现,就必须让守护进程不被挂起,采用的方法是调用fork()函数让父进程结束,这样守护进程就会作为子进程在后台运行。
(2)脱离控制终端,登录会话和进程组
虽然守护可以在后台运行,但是调用fork()函数后产生的子进程的所拥有的资源是继承父进程,包括其进程组、登录会话、控制终端等,而这些是可以被系统收回的。
为了能够让守护进程独立出来,不受控制就可以调用setsid()函数,setsid()函数的主要功能就是使进程成为新的进程组长和会话组长,这样就能够从父进程那边继承下来的登录会话和进程组真正脱离。
(3)禁止进程重新打开控制终端
通过上面的设置进程就可以脱离控制终端限制,但是它仍然可以向系统申请一个新的控制终端,这样有了控制终端又会受到控制,为了避免这种情况,就要使进程不能成为会话组长。
(4)关闭打开的文件描述符
因为在fork()一个子进程的同时,子进程会创建它的父进程那里复制一份文件描述符。
而守护进程是一直在后台默默的运行的,只要不杀死它就不会停止运行。
关闭文件描述符不仅可以避免系统资源浪费,并且可以防止进程所在的文件系统因文件描述符一直存在而无法卸下导致的问题发生。
(5)改变当前工作目录
Linux规定进程的工作目录在其运行的时候是不允许被卸下的,如果把进程的工作目录放到自定义的目录的话,可能会出现被关闭而卸下的情况。
因此,最好把进程的工作目录改到系统的特定目录下,这样就不会被常规操作卸下。
(6)重设文件创建掩模
因为子进程的资源是从父进程那边继承下来的,它会继承文件创建掩模使守护进程所创建的文件存取位被修改。
因此要把这个文件创建掩模清除,自己再重新创建一个掩模。
(7)处理SIGCHLD信号
进程结束的时候,系统会发出SIGCHLD信号。
服务器进程在请求到来生成子进程处理请求时,子进程可能会成为僵尸进程导致系统资源消耗,因为父进程可能先于子进程结束[10]。
所以在这里要对这个信号进行一定的处理。
具体代码在附件中。
4.4工作模式的实现
FTP的过模式主要主动模式(port)好被动模式(pasv),两种模式的模型如图4-3所示。
(1)我打开了N端口,你来连接我吧
(1)我打开了N端口你来连接吧
(2)我主动来连接你的N端口
(2)我来连接你
图4-3potr(左)pasv(右)的模型
由图可知,FTP的主动模式主要是首先客户端发送了连接请求,然后服务端接收到请求后由服务端主动连接客户端的一种工作模式。
而被动模式的模型和主动正好相反,是先客户端发送了连接请求,然后服务端把自己的IP和端口号发给客户端,由客户端来连接服务端的一种工作模式。
基于以上的工作模式本实现方法是:
首先,先写一个测试函数通过data_conn_sock的返回值量来判断,data_conn_sock的返回值是通过客户端那边发送过来的命令被服务端截取之后和“port”与“pasv”比得出结果的。
然后,如果是主动连接的时候,就把从客户端得到的IP和端口号放入到哈希表里面,用于以后的IP连接数控制。
如果测试到被动连接的时候要客户端的IP和端口号从配置文件中获取出来当然也可以通过自己写的一个功能函数get_host_ip()功能是获取IP,并且通过系统函数getsocketname在还没调用bind之前绑定0端口得到系统内存分配的一个还没被使用的端口号,然后把点分十进制的IP和后面的端口号以“,”的形式组装出来给一个临时变量发送给客户端,所以当客户端接收到例如PORT192,168,203,5,9,91它表示客户端的IP地址是,端口是9*256+91[11]。
然后创建一个新的套接字,并设置IP和端口地址重用,用来绑定和监听客户端是否连接进来。
最后进入数据连接进程里面进行处理。
测试函数的流程图4-4如下:
否
是
否
否
是
图4-4测试函数流程图
4.4监控模块的