FTP的传输有两种方式:ASCII、二进制。html
FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)。算法
FTP 客户端首先和服务器的TCP 21端口创建链接,用来发送命令,客户端须要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端经过本身的TCP 20端口链接至客户端的指定端口发送数据。FTP server必须和客户端创建一个新的链接用来传送数据。安全
创建控制通道和Standard模式相似,但创建链接后发送Pasv命令。服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)而且通知客户端在这个端口上传送数据的请求,客户端链接FTP服务器此端口,而后FTP服务器将经过这个端口传送数据。服务器
不少防火墙在设置的时候都是不容许接受外部发起的链接的,因此许多位于防火墙后或内网的FTP服务器不支持PASV模式,由于客户端没法穿过防火墙打开FTP服务器的高端端口(例如防火墙只开放了20、21端口);而许多内网的客户端不能用PORT模式登录FTP服务器,由于从服务器的TCP 20没法和内部网络的客户端创建一个新的链接,形成没法工做。说白了就是取决于防火墙限制了客户端仍是服务器,若是双方都关闭了防火墙那么这两种模式应该都是能够的。网络
当你在FTP服务器上收发文件的时候,你面临两个风险。第一个风险是在上载文件的时候是明文传输。第二个风险是,这些文件在你等待接收方下载的时候将停留在FTP服务器上。框架
FTPS和SFTP都使用非对称算法(RSA,DSA),对称算法(DES / 3DES,AES,Twhofish等)和密钥交换算法的组合。对于验证FTPS(或更准确地说,FTP下的SSL / TLS协议)使用X.509证书,而SFTP(SSH协议)使用SSH密钥。ssh
X.509证书包括公钥和有关证书全部者的某些信息。此信息容许另外一方验证证书自己的完整性和证书全部者的真实性。验证能够经过计算机和在必定程度上由人来完成。 X.509证书具备关联的私钥,出于安全缘由,一般与证书分开存储。编码
SSH密钥只包含公钥(相关的私钥是单独存储的)。它不包含有关密钥全部者的任何信息。 一样也不包含容许可靠地验证完整性和真实性的信息。 一些SSH软件实现使用X.509证书进行身份验证,但实际上它们不验证整个证书链 - 只使用公钥(这使得此类身份验证不完整,相似于SSH密钥身份验证)。加密
FTPS也称做“FTP-SSL”和“FTP-over-SSL”,SSL是一个在客户机和具备SSL功能的服务器之间的安全链接中对数据进行加密和解密的协议。SL/TLS协议在传输层(TCP/IP)之上、可是在应用层之下工做的。所以,它能够很容易在诸如HTTP,Telnet,POP3,IMAP4,SMTP和FTP等应用层协议上实现。SSL安全扩展至少有两种不一样的初始化方法:显式安全和隐式安全。 spa
优势:
缺点:
SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。能够为传输文件提供一种安全的加密方法。SFTP 与 FTP 有着几乎同样的语法和功能。SFTP 为 SSH的一部分。其实在SSH软件包中,已经包含了一个叫做SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP自己没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的链接操做,因此从某种意义上来讲,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP一样是使用加密传输认证信息和传输的数据,因此,使用SFTP是很是安全的。可是,因为这种传输方式使用了加密/解密技术,因此传输效率比普通的FTP要低得多,若是您对网络安全性要求更高时,可使用SFTP代替FTP。
优势:
缺点:
一般,答案取决于您的目标和要求。 通常来讲,SFTP在技术上优于FTPS。 固然,实现对两个协议的支持是一个好主意,可是它们在概念,支持的命令和许多其余方面是不一样的。
当您具备须要从我的设备(智能手机,PDA等)访问的服务器或具备FTP支持但没有SSH / SFTP客户端的某些特定操做系统时,最好使用FTPS。 若是您正在构建自定义安全解决方案,SFTP多是更好的选择。
对于客户端,需求由您计划链接的服务器定义。 当链接到Internet服务器时,SFTP更受欢迎,由于它默认由Linux和UNIX服务器支持。
对于私有主机到主机传输,您可使用SFTP和FTPS。 对于FTPS,您须要搜索一个免费的FTPS客户端和服务器软件或购买商业许可证。 对于SFTP支持,您能够安装OpenSSH软件包,它提供免费的客户端和服务器软件。 对于商业用途,咱们建议使用Bitvise SSH服务器。
[敲黑板、划重点] 若是您是软件开发人员,而且须要在应用程序中实现文件传输功能,则您将搜索组件以执行该做业。
.NET 中,对.NET Framework中的FTPS有内置支持(请参阅FtpWebRequest类)。 可是这个类的功能受到严格限制,特别是在SSL / TLS控制方面。
.NET Framework不包括对SSH或SFTP的任何支持。
注意.NET内置语法仅支持显式的FTP over SSL,通常FTP服务器隐式端口为990,而显式端口是21,必定要勾选容许显式加密访问。
VCL 中,您能够选择提供FTP功能的免费组件和库。 当您向他们添加OpenSSL时,您能够免费获取FTPS。 若是您不想处理OpenSSL DLL,您可使用一个商业上可用的库来支持SSL和FTPS。 再次提醒,没有免费的SFTP组件可用于.NET。
Java 中,FTPS和SFTP客户端存在几个不受支持和错误。
以上参考原文: https://blog.csdn.net/shmilychan/article/details/51848850
以上参考原文: https://www.cnblogs.com/OLDMAN-LU/p/6428274.html
FTP文件上传代码展现:
FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.ContentLength = fileInf.Length; int buffLength = 20480; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); Stream strm = null; strm = reqFTP.GetRequestStream(); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); }
FTPS文件上传代码展现:
//验证服务器证书,举例默认返回true public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; } FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; //相比FTP,SFTP要求支持SSL req.EnableSsl = true; //首次链接颁发证书 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); reqFTP.ContentLength = fileInf.Length; int buffLength = 20480; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = fileInf.OpenRead(); Stream strm = null; strm = reqFTP.GetRequestStream(); while (contentLen != 0) { strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); }
SFTP文件上传代码就不展现了,C#需借第三方DLL之手实现SSH,流这块的处理都封装起来了,推荐Renci.SshNet.dll。