java ftp主动模式和被动模式_FTP 的主动模式和被动模式
FTP 是一種基于 TCP 的應用層協議,它不支持 UDP 協議。 FTP 工作在一種特殊的服務機制上,它使用兩個端口,一個 '數據' 端口和一個 '命令' 端口(也稱為控制端口)。 通常情況下,端口 21 用作命令端口,端口 20 用作數據端口。 然而,我偶然間發現,數據端口有時候并不是在端口 20 上時,這就要談到 FTP 的被動模式了。
主動模式
在主動模式的 FTP 中,客戶端從一個隨機的非系統端口(N > 1023)連接到 FTP 服務器的命令端口端口 21。然后,客戶端開始監聽端口 N+1,并將 FTP 命令端口 N+1 告訴 FTP 服務器,“請把數據發送給我的 N+1 端口”。然后,服務器將從本地數據端口 (端口20) 連接回客戶端的數據端口,也就是 N+1 端口。
因為服務器防火墻的隔離作用,我們應該確保服務器 FTP 到客戶端的一下幾個通道的暢通:
FTP 服務器端口 21 (接受全部客戶端)
FTP 服務器端口 21 到 > 1023 的端口 ( 服務器響應客戶端控制端口 )
FTP 服務器端口 20 到 > 1023 的端口 ( 服務器發起到客戶端的數據端口的連接 )
從 > 1023的端口到 FTP 服務器端口 20 ( 客戶端發送 ack 到服務器的數據端口 )
用圖來表示這些通道:
activeftp.gif
第 1 步,客戶端的命令端口與服務器的命令端口連接并發送命令端口 1027。然后,服務器在第 2 步時將一個 ACK 發送回客戶端的命令端口。第 3 步,服務器在其本地數據端口上啟動連接,連接到前面指定的客戶端的數據端口。最后,客戶端返回 ACK,如第 4 步所示。
主動模式的 FTP 主要問題實際上落在客戶端。FTP 的客戶端并不會主動連接到服務器的數據端口,而是是告訴服務器它正在監聽哪個端口,然后服務器發起連接到客戶端上指定的端口。但是,這樣的連接有時候會被客戶端的防火墻阻止?!?/p>
被動模式
為了解決服務器主動發起到客戶端連接會北阻止的問題,另一種更完善的工作模式出現了,它就是 FTP 的被動模式,縮寫作 PASV,它工作的前提是客戶端明確告知 FTP 服務器它使用被動模式。
在被動模式的 FTP 中,客戶端啟動到服務器的兩個連接,解決了防火墻阻止從服務器到客戶端的傳入數據端口連接的問題。FTP 連接建立后,客戶端在本地打開兩個隨機的非系統端口 N 和 N + 1(N > 1023)。第一個端口連接服務器上的 21 端口,但是客戶端這次將會發出 PASV 命令,也就是不允許服務器連接回其數據端口。這樣,服務器隨后會打開一個隨機的非系統端口 P (P > 1023),并將 P 發送給客戶端作為 PASV 命令的響應。然后客戶端啟動從端口 N+1 到端口 P 的連接來傳輸數據。
在被動模式中,要保持一下通道的暢通:
FTP服務器的 21 端口(接受所有客戶端)
FTP服務器的 21端口到 > 1023 的遠程端口 ( 服務器響應客戶端控制端口 )
FTP服務器 > 1023 的端口(接受所有客戶端發起的連接到服務器指定的隨機端口)
FTP服務器 > 1023 的端口到 > 1023 的遠程端口(服務器發送 ack 和數據到客戶端數據端口)
被動模式用圖表示:
passiveftp.gif
第 1 步,客戶端在命令端口上與服務器連接,并發出 PASV 命令。然后,服務器在第 2 步時使用端口 2024 進行響應,告訴客戶端它正在監聽的數據連接端口。第 3 步,客戶端啟動從其數據端口到指定服務器數據端口的數據連接。最后,服務器在第 4 步將 ACK 發送回客戶端的數據端口。
服務器防火墻需要給 FTP 的被動模式開放一個端口范圍允許所有客戶端連接,比如 5000 - 6000。
個人博客同步更新,獲取更多技術分享請關注:鄭保樂的博客
總結
以上是生活随笔為你收集整理的java ftp主动模式和被动模式_FTP 的主动模式和被动模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模拟电路】波形产生与变换设计(555+
- 下一篇: 常用xsl符号