FTP伺服器專案的一些整理
幾個月前按照網上的教程寫了一個FTP的伺服器,現在回頭整理一下里面的一些知識。
FTP簡介
FTP是檔案傳輸協議(File Transfer Protocol),工作在TCP/IP協議族的應用層,其傳輸層使用的是TCP協議,它是基於客戶/伺服器模式工作的(C/S架構),TCP/IP協議中,FTP標準命令TCP埠號為21,Port方式資料埠為20。
FTP的兩種傳輸方式
FTP有兩種傳輸方式:ASCII檔案傳輸模式和二進位制檔案傳輸模式。
ASCII檔案和二進位制檔案的區別
ASCII檔案也稱為文字檔案,ASCII檔案和二進位制檔案在物理上沒有本質的區別,他們都是由一系列的位元位組成的,他們的差別僅僅在於邏輯之上,或者說系統對他們的解析方法不同。ASCII檔案由ASCII字元構成,一個ASCII字元有7個位元位,最高位總是0,而二進位制檔案的最高位有可能就是1。另一個差別是換行符,不同系統對換行符的表示方式不同,windows下換行符是\r\n,linux下的換行符是\n,其他的系統可能是其他的方式,ASCII傳輸方式和二進位制傳輸方式在處理換行符也有所不同。
ASCII傳輸方式
假定使用者正在拷貝的檔案包含的簡單ASCII碼文字,如果在我們使用的系統是windows系統,而執行ftp伺服器的遠端機器上的系統是Linux,那麼使用ASCII傳輸模式會將\r\n轉為\n。反過來,如果我們使用的系統是Linux系統,而執行ftp伺服器的遠端機器上的系統是Windows,那麼使用ASCII傳輸模式會將\n轉為\r\n。也就是說,當檔案傳輸時ftp通常會自動地調整檔案的內容以便於把檔案解釋成另外那臺計算機儲存文字檔案的格式。
二進位制傳輸模式
使用ASCII傳輸方式可能會改變我們的檔案,但是常常有這樣的情況,使用者正在傳輸的檔案包含的不是文字檔案,它們可能是程式,資料庫,字處理檔案或者壓縮檔案(儘管字處理檔案包含的大部分是文字,其中也包含有指示頁尺寸,字型檔等資訊的非列印字元)。FTP的兩種工作方式
FTP的連線分為控制連線和資料連線,控制連線用於傳輸控制命令,是隨客戶端一同存在的,而資料連線只是短暫存在,每次要發生資料的時候才建立資料連線,資料傳輸完畢後就斷開資料連線。FTP的控制連線總是由客戶端想伺服器端發起的,而FTP資料連線的建立有兩種途徑,一種是客戶端連線到伺服器端,另一種是伺服器連線到客戶端,這分別對應著FTP的兩種工作模式:
主動模式
FTP主動模式的工作過程如下:首先要建立控制連線通道,客戶端向FTP伺服器的21埠發起連線,經過3次握手建立控制連線通道,一旦控制連線通道建立之後,雙方便可以交換資訊了。在需要傳輸資料的時候,需要建立資料通道,選擇工作模式。當選擇主動模式時,客戶端通過控制連線通道傳送一個PORT命令並告知伺服器資料連線通道的埠BB,然後伺服器就向客戶端的BB埠發出連線請求,建立資料連線通道,資料連線通道一旦建立,就可以進行資料的傳輸,傳輸完畢之後資料連線就會關閉掉。其示意圖如下:
被動模式
FTP被動模式的工作過程如下:首先也是客戶端向伺服器端21埠發起連線,經過三次握手建立控制連線通道,
被動模式,需要進行資料傳輸的時候,客戶端要向伺服器傳送一個PASV表示進行被動傳輸,即資料通道的建立是由客戶端向伺服器端發起的,而此時客戶端需要知道連線到伺服器的哪一個埠,於是伺服器向客戶端傳送被動模式的埠XX,之後客戶端向伺服器的XX埠發起連線建立資料連線通道。其示意圖如下:
那麼FTP的資料連線為什麼要分為主動模式和被動模式呢?這個和NAT或防火牆對主被動模式的影響有關。
NAT或防火牆對主被動模式的影響
NAT是Network Address Translation,表示網路地址轉換,通過NAT可以將內網私有IP地址轉換為公網IP地址,一定程度上解決了公網地址不足的問題。FTP客戶端處於NAT或防火牆之後的主動模式
由於客戶端處於區域網之中,無法直接訪問公網上的伺服器,需要經過NAT伺服器(中間那個)進行地址轉換。而NAT有一個特徵,如果是從內向外發起連線,則可以建立成功(NAT會維護一個IP的表目),如果是從外部發起的連線,則無法建立連線。 開始時客戶端想伺服器發起連線建立控制連線通道,接著客戶端向伺服器傳送PORT命令和資料通道的埠BB,欲通過主動模式建立資料連線通道,而因為實際上連到FTP伺服器的IP地址是經過NAT伺服器進行轉換的,故伺服器實際上是連線到了NAT伺服器的BB埠(此時NAT的BB埠沒有啟用,故連線被拒絕),並且並沒有相應的條目可以找到客戶端,所以此時的主動模式時不能成功的。解決方式可以自己在NAT配置對映資訊,允許FTP伺服器連線過來。如果手工配置對映條目,那麼就必須知道FTP伺服器是哪一個埠發起連線過來,所以FTP的主動模式發起連線的埠規定為20埠而不是動態選擇,否則NAT對映的資訊會很多。
FTP客戶端處於NAT或防火牆之後的被動模式
如果FTP客戶端處於NAT或防火牆之後,並且使用被動連線,此時是可以連線成功的,示意圖如下圖所示,過程和之前的類似,這裡不再重複。
FTP伺服器處於NAT或防火牆之後的被動模式
如果FTP伺服器處於NAT或防火牆之後,在建立控制連線通道的時候,由於是客戶端向伺服器發起連線,因此需要在NAT配置一個對映條目(FTP伺服器固定是21埠),經過三次握手建立控制連線通道。若使用被動模式,則在建立資料連線通道的時候,處於外網的客戶端向處於內網的伺服器發起的連線可能建立不能成功,這個和之前的也是類似的。所以我們可以知道,當FTP伺服器處於NAT或防火牆之後的被動模式可能建立不成功。
FTP伺服器處於NAT或防火牆之後的主動模式
從上面的分析我們應該可以得到,FTP伺服器處於NAT或防火牆之後的被動模式是可以建立成功的。如下圖所示FTP的程序模型
FTP伺服器是採用多程序的方式實現的,而且每來一個連線,建立了兩個程序來為這個連線服務。
為什麼採用多程序
FTP伺服器是絕對不能採用多執行緒的。假如現在我們使用的是多執行緒的方式,此時有三個使用者(A,B,C)連線過來,則伺服器建立了三個執行緒(A,B,C)來進行處理。此時,假設三個客戶端登陸的是同一個使用者LCW,並且A將目錄切換到a,B將目錄切換到b,C將目錄切換到c,那麼他們是會相互影響到的,因為多個執行緒是共享同一個工作目錄的,當前執行緒對工作目錄的修改回影響到其他的執行緒,這是不允許的,所以不能採用多執行緒的方式。同時IO複用也是不可以的(單執行緒,會影響其他連線)
為什麼一個連線要用兩個程序
那為什麼一個客戶端連線過來要採用兩個程序呢?
這其實是出於一些安全性的考慮,一些許可權方面的限制。假如此時有一個普通使用者LCW連線過來,則當前程序會更改為LCW程序,而在要使用FTP的主動模式進行資料傳輸的時候,FTP要向客戶端發起連線,FTP伺服器需要繫結一個20埠,而LCW是一個普通的使用者,沒有許可權進行埠的繫結,這就意味著他無法建立正常的資料通道。所以需要一個程序nobody程序,來協助LCW程序(服務程序)。還有在其他某些操作的時候,我們不希望客戶端用擁有太大的許可權,反正某些危險的操作,因此把需要特殊許可權的操作都交由nobody程序來完成,而服務程序只是完成和客戶端的通訊。
LCW程序稱為服務程序,主要是用來實現與客戶端進行通訊,而nobody程序為協助程序,主要協助LCW程序完成一些和特殊許可權相關的操作,因而一個連線需要使用兩個程序來服務。其程序模式如下圖所示:
相關推薦
FTP伺服器專案的一些整理
幾個月前按照網上的教程寫了一個FTP的伺服器,現在回頭整理一下里面的一些知識。 FTP簡介 FTP是檔案傳輸協議(File Transfer Protocol),工作在TCP/IP協議族的應用層,
Windows Server 2012 搭建FTP伺服器的一些坑(二)
Windows Server 2012 搭建 IIS 的 FTP 伺服器被動模式連結失敗,出現 200 Type set to A. 227 Entering Passive Mode; 雲伺服器安全組已新增對應規則,伺服器防火牆已配置入站規則 20-21埠
Windows Server 2012 搭建FTP伺服器的一些坑(一)
初衷就是想在雲伺服器上寫程式,為了使本機和雲伺服器之間傳檔案更方便,於是乎搭建FTP伺服器。總結折磨我兩天的一些坑,唉,欲哭無淚啊== 首先從一個已經搭建好的FTP伺服器上下載搭FTP伺服器必須的應用程式:FileZilla,WinRA
Linux下載FTP並建立FTP伺服器的一些坑!
下載FTP服務 如果沒有yum命令,則需要配置本地yum 1. 首先將光碟裝載進有linux系統的物理機或虛擬機器中。 2. 進入linux系統。 進入/dev目錄下 cd /dev/ 可以看到系統已經識別到了光碟機。 cd /dev ls 是否可以找到cdrom
c語言實現模擬FTP伺服器專案
下載原始碼後,直接可以在ubuntu中編譯執行:FTP伺服器程式功能:客戶端:1.輸入命令: help 檢視FTP伺服器所支援的所有命令2.輸入名:ls 檢視伺服器上可以下載的所有檔案列表3.輸入命令:get filename 下載伺服器中指定檔案到本地目錄中
關於開源專案——C語言實現FTP伺服器的結構解析
專案地址:https://github.com/beckysag/ftp 針對此開源專案的說明,結構分析。 服務端整體框架: 1. 從命令列輸入得到服務端繫結埠號 2. 設定套介面選項,建立監聽套接字。 3. 用while迴圈 + fo
電商專案之springmvc實現富文字上傳到FTP伺服器
1、前端 富文字圖片上傳檔案 <form name="form1" action="/manage/product/richtext_img_upload.do" method="post" enctype="multipart/form-data"> <input t
電商專案之springmvc實現檔案上傳到FTP伺服器(超級重點)
1、前端(name的值和介面的@RequestParam的value相同,並且enctype為multipart/form-data) springmvc檔案上傳到ftp伺服器 <form name="form1" action="/manage/product/upload.do" me
[解決方案] 關於雲伺服器FTP搭建的一些小問題(PASV連線超時)
http://bbs.qcloud.com/thread-1343-1-1.html 在雲伺服器使用過程中,上傳檔案是必要的步驟,大家第一時間想到的工具就是FTP,相信大家在使用騰訊雲伺服器搭建FTP的時候或多或少都會遇到搭建成功,但是無法連線,通過filezilla客戶
Intellij IDEA自動部署專案至遠端FTP伺服器
因為各種原因,公司的測試伺服器是Windows Server,一臉懵逼的感覺,又因為各種原因,並不能重新安裝Linux伺服器,所以只好將就了,這邊也沒有jenkins,本著能偷懶就偷懶的想法,導致每次
關於量子計算機的一些整理 (精心整理原創) (一)
ole comm ip 協議 sse2 工程 5.0 tle 世界 sea 首先祝賀中國在量子計算方面的突出進步。 “5月3日,中國科技大學潘建偉教授宣布,研究團隊在去年首次實現十光子糾纏操縱的基礎上,構建了世界首臺超越早期經典計算機的單光子量子計算機。量子計算利用
在windows中建立ftp伺服器
大概流程敘述: 1.控制面板-程式-找到開啟或關閉windows功能,找到如下: 2.開啟管理,找到Internet資訊服務管理,建立ftp站點,如下: 3.建立完成後,在本地使用者和組裡面建立新的使用者,預設在user組下面,刪掉如下: 4.找到建立的ftp伺
ftp伺服器和nginx伺服器做圖片上傳伺服器
一,下載安裝ftp伺服器(vsftpd) 1. 使用命令安裝vsftpd伺服器: [[email protected] /]# yum -y install vsftpd 2. 新增一個使用者: [[email protected] /]# adduser ftp
Linux的Ftp伺服器搭建
FTP服務概述: FTP伺服器(File Transfer Protocol Server)是在網際網路上提供檔案儲存和訪問服務的計算機,它們依照FTP協議提供服務。 FTP(File Transfer Protocol: 檔案傳輸協議)作用: Internet 上用來傳送檔案的協議 常見FTP伺服器:
CentOS7 搭建FTP伺服器
本文來記錄一下自己的虛擬機器CentOS7搭建FTP伺服器的過程 用到了vsftpd,如果沒有需要安裝 在開始搭建FTP伺服器之前,首先要確保本地和伺服器網路是通的,我測試的 本地IP:192.168.1.5 (Windows系統IP) 遠端IP:192.168.1.7 (虛擬機器IP)
FTP伺服器檔案存在性判斷
在實際使用FTP檔案伺服器的過程中,經常需要遠端下載解析檔案。為提高效率,需要判斷檔案存在與否,有選擇的進行解析。 這裡對專案中的一個小片段進行備份,方便以後總結學習。 import org.apache.commons.net.ftp.FTP;
java操作FTP伺服器通用工具類
package cn.com.test.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStrea
如何在windows上建立FTP伺服器
建立FTP伺服器首先要在windows上開啟FTP和IIS相關服務。 1、下面就如何開通相關服務進行說明。 控制面板→程式和功能→開啟或關閉windows功能→開啟Internet資訊服務(三個相關服務都開啟,不完全開啟會開啟服務不成功),開啟相關服務後,一般會進行重啟。 2、開通F
Linux——FTP伺服器部署,FTP安全部署(匿名,本地,虛擬使用者的管理)
一、FTP的概念 FTP 是File Transfer Protocol(檔案傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制檔案的雙向傳輸 二、FTP的部署 服務端部署: 安裝vsftpd 安裝 lftp
Java實現FTP伺服器檔案的上傳和下載
一、前言: 最近剛好需要實現這個功能:實現ftp的上傳和下載。在網上找了下資料,總結了下。直接上程式碼: 二、程式碼示例: 首先使用到的maven依賴: <dependency> <groupId>commons-ne