FTP使用command channel與data channel進行連線傳輸
command channel 一般是走port 21,而data channel則是
port 20(server 預設)
FTP的傳輸模式可分為Active mode 與 Passive mode
(主動模式)Active mode:
在client先用command channel連上Server之後,
如果需要傳輸資料,client端會再發出一個PORT
cmd給Server提出資料連線的需求
ex: PORT 172,17,21,100,210,102
Server收到後會利用port20向 client端的某一個port進行
連線(使用3-way handshake),其中這個某一port要從
PORT cmd算出,計算方式如下:
ex:
PORT 172,17,21,100,
210,102
210x256+
102=53862(client port)
整個流程大概是這樣
(command channel 3-way handshake)
(port >1024)Clinet------SYN------------>Server(port 21)
(port >1024)Client<------SYN,ACK------------Server(port 21)
(port >1024)Client------ACK------------>Server(port 21)
.
.
(port >1024)Client------PORT 172,17,21,100,210,102----->Server(port 21)
(port >1024)Client<---PORT command successful-----Server(port 21)
cleint與server協調好要用的port後,主動式(active)模式下
是由Server發起連線通知給Client
(data channel 3-way handshake)
(port 20)Server------SYN------------>Client(port 53862)
(port 20)Server<------SYN,ACK------------Client(port 53862)
(port 20)Server------ACK------------>Client(port 53862)
(被動模式)Passive mode:
client用command channel連上Server之後
再發出PASV cmd,Server端收到這個PASV cmd
之後會回傳 Entering Passive Mode後面代一串數字
(172,17,21,74,181,15)代表Server所要使用的data channel port
計算方式相同
ex:
172,17,21,74,
181,15
181x256+
15=46351(Server欲使用的data chaenel port)
(port >1024)Clinet------SYN------------>Server(port 21)
(port >1024)Client<------SYN,ACK------------Server(port 21)
(port >1024)Client------ACK------------>Server(port 21)
.
.
(port >1024)Client---------PASV---------------->Server(port 21)
(port >1024)Client<---Entering Passive Mode-----Server(port 21)
(172,17,21,74,181,15)
server與Client協調好要用的port後,被動式(Passive)模式下
是由Client發起連線通知給Server
(data channel 3-way handshake)
(port >1024)Client------SYN------------>Server(port 46351)
(port >1024)Client<------SYN,ACK------------Server(port 46351)
(port >1024)Client------ACK------------>Server(port 46351)
主動模式的缺點是如果client端在firewall或是NAT之後,就會造成server用port 20要連到client端時可能被firewall擋住就進不到client端,這時可能會發現明明就連接上 FTP 伺服器了 (命令通道已建立),但是就是無法取得檔案名稱的列表,而是在超過一段時間後顯示『 Can't build data connection: Connection refused,無法進行資料傳輸』之類的訊息, 那肯定就是這個原因所造成的困擾了。
被動模式則可以解決這個問題,因為主動式是由Server向Client端發起連線,而被動式就是由Client向Server端發起連線, 既然是由Client發起連線,那麼自然就不需要考慮來自 port 20 的連線,所以就不會有firewall/NAT的問題了。
詳細可以參考鳥哥:
http://linux.vbird.org/linux_server/0410vsftpd.php