FTP相關文章:html
Linux上的ftp服務器 vsftpd 之配置滿天飛--設置匿名用戶訪問(不彈出用戶名密碼框)以及其餘用戶可正常上傳面試
ftp服務器Serv-U 設置容許自動建立不存在的目錄windows
昨天遇到個ftp相關的問題,關於ftp匿名訪問的。花費了大量的腦細胞後,終於搞定了服務端的配置,如今客戶端能夠像下圖同樣,直接在瀏覽器輸入url,便可直接訪問。瀏覽器
期間不會彈出輸入用戶名密碼來登陸的窗口。服務器
今天我主要是有點好奇,在此過程當中,到底是否是用匿名帳戶「anonymous」該帳戶登陸了,仍是根本不須要登陸呢?tcp
因而用wireshark抓包了一下。post
我這邊直接用了捕獲過濾器抓本機和ftp之間的包。抓包後直接ctrl+F進行文本查找。url
果真發現是發送了USER anonymous命令的。.net
來源於:https://blog.csdn.net/iloli/article/details/58052623d
FTP是File Transfer Protocol(文件傳輸協議)的縮寫,用來在兩臺計算機之間互相傳送文件。相比於HTTP,FTP協議要複雜得多。複雜的緣由,是由於FTP協議要用到兩個TCP鏈接,一個是命令鏈路,用來在FTP客戶端與服務器之間傳遞命令;另外一個是數據鏈路,用來上傳或下載數據。
FTP協議有兩種工做方式:PORT方式和PASV方式,中文意思爲主動式和被動式。
PORT(主動)方式的鏈接過程是:客戶端向服務器的FTP端口(默認是21)發送鏈接請求,服務器接受鏈接,創建一條命令鏈路。當須要傳送數據時,客戶端在命令鏈路上用PORT命令告訴服務器:「我打開了XXXX端口,你過來鏈接我」。因而服務器從20端口向客戶端的XXXX端口發送鏈接請求,創建一條數據鏈路來傳送數據。
PASV(被動)方式的鏈接過程是:客戶端向服務器的FTP端口(默認是21)發送鏈接請求,服務器接受鏈接,創建一條命令鏈路。當須要傳送數據時,服務器在命令鏈路上用PASV命令告訴客戶端:「我打開了XXXX端口,你過來鏈接我」。因而客戶端向服務器的XXXX端口發送鏈接請求,創建一條數據鏈路來傳送數據。
總結來講,主動模式時,由客戶端提供數據傳輸端口。。被動時,由服務器端提供數據傳輸的端口。
在windows的cmd裏面,通常默認就是有ftp命令的。
操做步驟很簡單,只是匿名用戶登陸,查看目錄下文件,而後退出登陸。
前面幾個抓包爲創建鏈接。
而後是服務端發回的響應:(請求的包沒看到,不知道是否是對應我上面的ftp 10.10.20.2操做)
而後是登陸成功的響應:
接下來是ls命令觸發的一個包:
該包主要是客戶端向服務端發起的一個請求。
當 PORT 命令被提交時,它指定了客戶端(10.15.4.46)上的一個端口而不是服務器的。
該端口號的計算規則就是:211*256 + 220 = 54236,211與220也就是下面紅框標識出來的數字的最後兩位.
下面是服務器端的響應,表示鏈接已創建。再下面一條是客戶端發送的ls命令,查看目錄下的文檔。
再下來是服務端要返回數據了,因而主動向客戶端的54236端口請求創建tcp鏈接。(就是上面計算出來的那個)
見下圖,這期間,夾雜了原有的21端口與客戶端的鏈接的響應消息。
鏈接斷開分了兩部分,一部分是ftp層面的。一部分是tcp層面的鏈接斷開。
其中tcp鏈接斷開由服務器端發起。
之前面試騰訊時,被問過tcp粘包相關的問題。問到說ftp是怎麼解決粘包的。
當時沒答上來。後來才知,ftp的每一個包都在包的結尾用了\r\n進行標識。
以下:
其中的0d、0a在asicc中就是回車、換行的意思。