您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > C网络编程专题12实现一个简单的FTP服务器
[C#网络编程系列]专题十二:实现一个简单的FTP服务器(转载:)引言:休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的,现在差不多进入状态了,所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务器。在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传、下载文件),例如我们经常用到微软的SkyDrive网盘,115网盘等,然而我们经常用到的都是网页版本的,网页版本和客户端版本的不同,网页版本的FTP客户端,它与服务器的交流是使用HTTP协议发出对服务器的请求的,而客户端版本采用的是FTP协议发出命令对服务器进行请求。然后我们接触到FTP服务器却很少的,所以本专题中将和大家介绍下如何实现一个FTP服务器(不要觉得服务器很深奥一样的,大家可以简单的认为服务器也是一个程序,该程序是对客户端发来的请求做处理的,请求大家可以简单理解为字符串,从这个角度看,服务器程序就是一个对字符串解析的过程。),也是为后面的一个专题做一个铺垫,因为后面专题将和大家介绍下FTP客户端——文件上传下载器,有了自己自定义的FTP服务器后,自定义的FTP客户端就可以对自定义的FTP服务器进行访问,使两者形成一个完整的软件,从而也让大家对基于FTP协议的工具有一个初步的了解。一、基于FTP协议的客户端和服务器是如何沟通的?FTP客户端和FTP服务器之间的“沟通”分为四个阶段的:1.启动FTP客户通过FTP客户端软件,发起FTP交互式的命令,就是告诉服务器(也就是一台电脑,服务器上与一个程序(FTP服务)会接收命令,并解析发来的命令,然后发出回复信息)说:“我想和你聊聊天,可以吗?”2.建立控制连接客户端TCP层根据客户给出的服务器IP地址,向服务器提供FTP服务的21号端口发出主动建立连接的请求,服务器接收到请求后,通过3次握手之后,客户端和服务器之间就建立一个TCP连接(就是一条通道,就好比生活中马路,有了马路之后车才能够在两地之间运送东西),之后,所有用户发出的FTP命令和服务器的回应都是通过该连接来传送的,所以也把这个TCP连接叫做控制连接,控制连接在用户退出之前一直存在。3.建立数据连接和进行文件传输现在客户端和服务器端已经建立聊天的通道了(控制连接),但是两者聊天过程中如果互相想赠送礼物要怎么办呢?(这里形象的把客户端和服务器端文件的传输比喻两个人通过聊天后互相赠送礼物的过程),此时我们就需要另外一条马路(数据连接)来进行“礼物的赠送”了,具体赠送礼物的过程如下:客户端通过控制连接向服务器发送一个上传文件的命令时,会自己分配一个临时的TCP端口号。客户端通过控制连接向服务器发送一个命令(下面将会介绍的PORT命令)来告诉服务器自己的IP地址和临时的端口号,然后再发送一条上传文件的命令(可以理解为——客户端要送礼物给服务器时,实际上不是简单的发送一个送礼物命令的,在这之前还需要发送一条自我介绍命令(就是告诉服务器自己的IP地址和端口号)来告诉服务器自己就是刚刚和它聊天的那位,这也很符合我们日常送礼物的流程的,一般大家接到礼物都要弄明白送礼物的人是谁,是不是自己认识的)服务器接收到客户端的IP地址和临时端口号后,以这个IP地址和端口号为目标,使用服务器上的20端口(该端口是用来传输数据的端口)向客户端发出主动建立连接的请求。客户端收到请求后,通过3此握手后就与服务器之间建立了另外一条TCP连接——数据连接,即用来互相送礼物的通道。客户端在自己的文件系统中选择要赠送(上传)的文件客户端将文件写入到文件传输进程中(写入网络流中)服务器端将传输来的文件在服务器端的文件系统中进行存储文件传输完成后,由服务器主动关闭该数据的连接4关闭FTP当用户退出FTP时,通关客户端发送退出命令,之后控制连接被关闭,FTP服务结束。二、从上面的沟通过程中你明白了什么?从上面客户端与服务器端的沟通过程中,这里可以概括几点:(1)客户端与服务器端进行交互过程中,传输层使用的是TCP协议而不是其他传输层协议(2)沟通过程有两条TCP连接——一条是控制连接,即传输命令和响应信息的通道,另一条是数据连接,即传输文件的马路,并且必须先有控制连接才能建立数据连接,因为要进行文件传输首先必须知道客户的IP地址和端口号,这个过程就是通过控制连接传送的命令来告知服务器客户端的IP地址和端口号,之后再在两者之间建立数据连接来传输文件(3)在服务器端,控制连接(端口号为21)和数据连接(端口号为20)使用了不同的端口号三、赠送礼物的方式?——文件传输模式客户端与FTP服务器建立数据连接之后,首先需要告诉服务器采用哪种文件传输模式,FTP提供了两种文件传输模式,一种是主动(Port)模式,另一种是被动(Passive)模式。主动模式——服务器向客户端发起数据连接请求,被动模式——客户端向服务器发起数据请求。然而两种模式有什么相同点和不同点呢?两种模式的相同点:服务器都使用21号端口进行用户验证和管理。不同点:传送文件数据的方式不一样,主动模式的FTP服务器数据端口固定在20,而被动模式的FTP服务器数据端口则在1025~65535之间的随机数。3.1主动模式主动模式——服务器主动连接客户端,然后传输文件,在这种模式下,FTP客户端先用一个端口N(N1024)向服务器的21号端口发起控制连接,连接成功后,在发出PORTN+1命令告诉服务器自己监听的端口为N+1;服务器接受到该命令后,用一个新的数据端口(20号端口)与客户端的端口N+1建立连接,然后进行文件传输,而客户端则通过监听N+1端口接受文件数据。注意:采用主动模式存在一个问题,如果客户端安装了防火墙或在内网时,由于防火墙一般不允许接受外部发起的标准端口以外的连接请求,因此外部FTP服务器就无法使用主动模式穿过防火墙主动连接客户端(这里与客户端连接的端口为N+1(N1024),非标准端口),从而造成无法传送文件数据,此时就需要采用被动模式传送文件了。3.2被动模式被动模式——服务器被动接受客户端连接请求,即控制连接请求和数据连接请求都是由客户端发起,在这种模式下,FTP客户端先随机开始一个端口N向服务器的21号端口发起控制连接,然后向服务器发送PASV命令。服务器收到该命令后,会用一个新的端口P(P1024)进行监听,同时将该端口号告诉客户端,客户端接受到响应命令后,再通过新的端口N+1连接服务器的端口P,然后进行文件数据传输。注意:采用被动模式与主动模式也存在相同的问题,如果服务器安装了防火墙,客户端同样可能无法与服务器端的端口P建立数据请求,因为该请求可能会被防火墙过滤掉。在实际应用中,服务器一般指定一个端口范围,允许客户端与该范围内的端口建立数据连接,而不再这个范围内的端口会被服务器的防火墙过滤掉,从而在一定程度上消除了针对服务器的恶意攻击。四、FTP协议中有哪些命令的?协议简单说就是一个规范,就好比打牌一样,制定一个大家都能明白的规则,斗地主的规则被大家都认可的,但是私下我们也可以自定义规则来玩的(例如说三个只能带一个等这样的规则),同样FTP规则也是大家都认可的一个协议,我们当然也可以自定义协议。由于.Net平台下目前还没有提供对FTP服务器端开发的类库,因此要实现一个FTP服务器端的应用程序,就必须了解FTP协议的详细内容。4.1FTP命令有哪些?FTP协议中规定了一些大家都认识的命令和组成。FTP协议中的命令都由3~4个字母组成,命令与参数之间用空格隔开,每个命令用回车换行结束。(1)访问命令(1)访问命令有:USER命令——格式为:USERusername,指定登录的用户名,以便服务器进行身份验证。这个命令通常是控制连接后第一个发出的命令PASS命令——格式为:PASSpassword,指定用户密码,该命令必须跟在登录用户名命令之后。REIN命令——格式为:REIN,表示重新初始化用户信息,该命令终止当前USER的传输,同时终止正在传输的数据,然后重置所有参数,并打开控制连接,以便客户端再次发生USER命令。QUIT命令——格式为:QUIT,关闭与服务器的连接(2)模式设置命令:PASV命令——格式为:PASV,该命令告诉FTP服务器,让FTP服务器在指定的数据端口进行监听,被动接受客户端的请求。如果未指定任何模式,FTP服务器默认使用PASV模式PORT命令——格式为:PORTaddress,该命令告诉FTP服务器,客户端监听的端口号是address,让FTP服务器采用主动模式连接客户端。TYPE命令——格式为:TYPEdatatype,该命令指定要传输的数据类型,有ASCII和BINARY两种类型。MODE命令——格式为:MODEmode,该命令指定传输模式,S表示流,B表示块,C表示压缩。(3)文件管理命令CWD命令——格式为:CWDdirectory,该命令是用户可以在不同的目录或数据集下工作而不用改变登录信息,directory一般是目录名或与系统相关的文件集合。PWD命令——格式为:PWD,该命令返回当前工作目录。MKD命令——格式为:MKDdirectory,该命令表示在指定路径下创建新目录,directory表示特定目录的字符串。CDUP命令——格式为:CDUP,该命令表示回到上层目录RMD命令——格式为:RMDdirectory,删除指定目录,directory表示特定目录的字符串。LIST命令——格式为:LISTname,该命令返回指定路径下的子目录及文件列表,name为路径。省略路径时,返回当前路径下的文件列表。NLIST命令——格式为:NLISTdirectory,该命令返回指定路径下的目录列表,省略路径时,返回当前目录。RNFR命令——格式为:RNFRoldpath,该命令表示重新命名文件,该命令的下一条命令用RNTO指定新的文件名。RNTO命令——格式为:RNTOnewpath,该命令和RNFR命令共同完成对文件的重命名。DELE命令——格式为:DELEfilename,该命令表示删除指定路径下的文件(4)文件传输命令:RETR命令——RETRfilename,表示下载指定路径的文件STOR命令——STORfilename,表示上传一个指定的文件,并将其存储在指定的位置,如果文件已存在,原文件将被覆盖,如果文件不存在,则创建新文件。(5)其他命令SYST命令——格式为:SYST,该命令返回服务器使用的操作系统。4.2FTP响应码客户端发送FTP命令后,服务器需要返回FTP响应码,响应码即是回答,我们平常聊天中别人问了说了话或者问了问题,另外一方就需要回答,FTP协议中定义以响应码的形式来作为回答,FTP响应码由ASCII编码的3位数字开头,后面接一行文本提示信息,数字和提示信息中有一个空格,如XXX接收请求。每个响应码同样以回车换行结束。FTP响应码的3位数字每位都有特定的意义,具体见下表:响应码表示第1位1XX表示信息已被服务器正确接收,但尚未被处理2XX表示信息已被服务器正确处理完毕3XX彪西信息已被服务器正在接受,并正在处理中数字4XX表示信息处理错误(暂时)5XX表示信息处理错误(永久)第2位数字X0X表示语法错误X1X表示系统状态与信息X2X表示与FTP服务器系统连接状态X3X表示与用户认证有关的信息X4X表示未定义X5X表示与文件系统有关的信息下表列出了常用的响应码所代表的意义:响应码意义响应码意义110重新启动标记应答332登陆是需要账户信息120服务在指定时间内准备好350请求的文件操作需要进一步命令125数据连接打开——开始传输421服务关闭150文件状态良好,将要打开数据连接425不能打开数据连接200命令成功426关闭连接,终止传输202命令没有执行450文件不可用211
本文标题:C网络编程专题12实现一个简单的FTP服务器
链接地址:https://www.777doc.com/doc-2907727 .html