如何编写并配置局域网内FTP服务器程序

本文详细介绍了如何在局域网内搭建FTP服务器,包括FTP协议的握手过程、不同网络环境下可能遇到的问题及解决方案,特别关注了主动模式与被动模式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=31794243),在优快云作同步更新。如需转载,请保留本段文字,并发邮件通知: zhangmeng@sina.com

 

如何编写并配置局域网内FTP服务器程序

 

一、FTP协议握手过程

 

要理解FTP协议的握手过程,首先需要理解两个基本概念:

1.       FTP协议需要服务端程序打开两个端口。一个作为监听端口,通常情况下为21,但是建议在代码编写过程中,将此端口设置为可配置端口,以防在系统实施过程中与其他系统冲突。另一个端口作为数据传输端口,由监听端口获得连接请求后打开并连接客户端,通常使用1024以上的非保留端口。在代码编写过程中,建议可以设置传输端口可使用范围,因为大多数企业使用了防火墙等网络安全设备,并非所有端口都可以暴露给Internet,而这也是广域网访问局域网内FTP主机的技术限制之一。

2.       FTP协议有两种连接方式:主动模式(Port模式)、被动模式(Passive模式),其区别在于由哪一方指定传输端口,因服务端连接的主、被动关系而命名。如果由客户端指定端口,服务端主动连接则称为主动模式;如果由服务端指定端口,客户端主动连接则称为被动模式。

 

了解了这两个基本概念后,我们分别以图形化的方式阐述两种连接模式的过程。

1.       主动模式

a)       服务端程序在监听端口(21)上监听连接请求;客户端选择可用端口1531连接服务端,先后发送命令“USER ****”、“PASS ****”,验证用户名密码。如果验证通过,服务器返回以“230”开头的字符串(以下简称为“230”),通知客户端验证通过。如果验证未成功,则返回“530”。

b)      客户端发送命令“PORT 172,16,0,1,5,252”,通知服务端连接IP地址为172.16.0.115325*256+252)端口。服务器将返回“220”。

c)      服务器选择一个可用端口20,连接172.16.0.1:1532。如果无法获得可用端口,返回“421”;如果无法连接客户端,返回“425”;成功则返回“150”。

d)      客户端返回“ACK”,表示连接成功。至此,握手过程完成。

2.       被动模式

a)       服务端程序在监听端口(21)上监听连接请求;客户端选择可用端口1531连接服务端,先后发送命令“USER ****”、“PASS ****”,验证用户名密码。如果验证通过,服务器返回以“230”开头的字符串(以下简称为“230”),通知客户端验证通过。如果验证未成功,则返回“530”。

b)      客户端发送“PASV”命令,要求服务端程序以被动模式连接。

c)      服务端程序挑选可用端口5660,并返回“227 Entering Passive Mode (172,16,0,1,22,28).”。通知客户端连接IP地址为172.16.0.1566022*256+28)端口。

d)      客户端通过端口1532连接172.16.0.1:5660

e)       服务端返回“ACK”,表示连接成功。至此,握手过程完成。

 

二、不同网络环境的分析

在实际使用情况中,服务器和客户端所处的网络环境可分为一下四种:在同一网络中;服务器在公网,客户端在局域网;服务器在局域网,客户端在公网;两者在不同的局域网中。下面就分别叙述在四种网络环境中可能导致的问题。

1.  在同一网络中

这是最理想的使用环境。但是如果两者之间有防火墙,那么连接上也会出现一点问题,但是很容易解决。

如果使用主动模式,则客户端的端口传入访问受限,服务器连接客户端指定端口时,可能会因为防火墙阻止而失败。

同理,如果使用被动模式,服务端传入访问受限,则客户端连接服务器指定端口时,可能因防火墙阻止而失败。

可以通过在防火墙上开放一部分端口解决这个问题。

 

2.  服务器在公网,客户端在局域网

这是一般会出现的情况。两者之间无法直接访问,如果防火墙设置合理,则客户端可以连接服务器指定端口,但是服务端无法连接客户端指定端口。

根据上面所讲的FTP握手方式,很容易得出解决方法,即使用被动模式(Passive模式)连接,由客户端主动连接服务端指定端口。

当然,如果客户端防火墙指定了端口映射的话,那么也可以使用主动模式。

 

3.  服务器在局域网,客户端在公网

这种情况比较少见。两者之间也无法直接访问。跟第二种情况相反,可以使用主动模式连接,或者设置服务端端口映射。

 

4.  两者在不同的局域网中

这种情况在企业环境中很常见。公司内部实施的系统会把FTP服务器配置在局域网内,但是又会有需求:员工不在公司时也要能访问到。那么员工在外部访问时使用的网络就很有可能处于另一个局域网内。

我们可以分析下在这种情况下会遇到的问题,分析的基础是服务端端口映射已经设置正确。如果不能设置不在本文讨论范围。

主动模式:客户端可以顺利连接服务端监听端口,并发送指定端口,要求服务端连接。但是一般情况下,程序都是使用微软提供的MFC类库,或者其他封装好的FTP连接函数。这些函数发送PORT命令时,只能发送本机的IP地址。而现在本机的IP地址是局域网内部的地址,服务端无法连接!即使客户端程序不使用封装好的函数,可以指定发送广域网中的IP地址,也不能保证客户端防火墙做了端口映射。所以,主动模式不能使用。

被动模式:客户端可以顺利连接服务端监听端口,服务端收到PASV命令后,返回本机IP地址和端口。这时候问题就出现了:服务端返回的也是服务器在局域网内的IP地址,客户端无法连接!

从上面的分析我们可以知道,当服务器和客户端在不同的局域网内时,普通的程序将无法顺利连接。我们需要对程序进行修改,使服务端程序在接收到PASV命令后,返回公网的IP地址。那么客户端可以通过公网IP地址连接到服务端路由,再经过路由端口映射,连接到服务端。

 

三、总结

如果要基于FTP协议,编写应用服务器,那么要注意以下几点:

1.       应用服务器的监听端口要可配置。

2.       应用服务器的数据传输端口要可配置。

3.       应用服务器在Passive模式下,可以选择返回本机IP地址,还是公网IP地址。

4.       实施时,在路由、防火墙等设备上做好端口映射。

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=31794243),在优快云作同步更新。如需转载,请保留本段文字,并发邮件通知:zhangmeng@sina.com

 

 

自己写的ftp服务端程序代码,支持{"USER", do_user }, {"PASS", do_pass }, {"CWD", do_cwd }, {"XCWD", do_cwd }, {"CDUP", do_cdup }, {"REIN", do_rein },//重新初始化,此命令终止USER,重置所有参数,控制连接仍然打开,用户可以再次使用USER命令 {"QUIT", do_quit }, /*------------传输参数命令------------*/ {"PORT", do_port },//数据端口,主要向服务器发送客户数据连接的端口 //格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用p1,p2表示 {"PASV", do_pasv },//此命令要求服务器数据传输进程在指定的数据端口侦听,进入被动接收请求的状态 {"TYPE", do_type },//文件类型,可指定ASCII码、EBCDIC码、Image、本地类型文件等参数 /*------------服务命令----------------*/ {"RETR", do_retr },//下载文件 {"STOR", do_stor },//上传 {"APPE", do_appe },//上传,如文件已存在,数据附加到尾部 {"REST", do_rest },//重新开始 {"RNFR", do_rnfr }, {"RNTO", do_rnto },//重命名文件或目录 {"ABOR", do_abor },//异常终止 {"DELE", do_dele },//删除文件 {"RMD", do_rmd },//删除目录 {"XRMD", do_rmd }, {"MKD", do_mkd },//新建目录 {"XMKD", do_mkd }, {"PWD", do_pwd },//打印当前目录 {"XPWD", do_pwd }, {"LIST", do_list },//列目录详细清单 {"NLST", do_nlst },//列目录短清单 {"SYST", do_syst },//获取系统信息 {"STAT", do_stat },//返回服务器状态 {"SIZE", do_size },//获得文件大小 {"HELP", do_help }, {"NOOP", do_noop }, {"SITE", do_site }, }等命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值