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。