FTP(File Transfer Protocol,文件傳輸協議),應用層協議,可跨平臺。如其名,只能實現文件傳輸功能,不能實現一些其他的功能,例如文件系統掛載等功能。
NFS(Network File System,網路文件系統),工作在內核模式下的,故難以實現跨平臺。由於基於文件系統實現,在linux下可實現掛載使用等功能。
win7已有NFS功能
win10暫時還沒
SMB(Service Message Block,服務消息塊協議),能夠實現Windows和Linux主機之間的文件共享服務,可實現跨平臺,在Linux上實現了CIFS(Common Internet File System)協議。
FTP協議
工作模式
主動模式:
客戶端請求服務端的21端口先建立命令連接
服務端響應客戶端,並以5000+隨機端口與客戶端建立數據連接
開始數據傳送
屬於C/S(Client/Server)架構,基於套接字通信。
FTP協議用到2種不同的tcp連接:一是命令連接,用於服務端與客戶端命令的傳達,監聽在tcp/21端口;另一個是數據連接,用來傳輸數據,監聽的端口是隨機的。
客戶端請求服務端的21端口先建立命令連接
客戶端使用5000+隨機端口用命令連接請求數據連接
服務端收到請求後隨機產生端口,反饋給客戶端。p1 p2
客戶端使用5000+端口與服務端隨機端口(p1*256+p2)之間傳輸數據
注:被動模式也會存在防火牆問題,但服務端防火牆有連接追蹤功能以解決此問題。故被動模式用的較多
用戶認證
匿名用戶:登錄名是anonymous,且不須密碼
系統用戶:FTP服務端本地用戶和密碼,默認訪問的是用戶家目錄
虛擬用戶:僅用於訪問服務端特定資源。可指定用戶文件或數據庫來使用。最終會將虛擬用戶映射爲系統用戶,所以默認訪問的爲系統用戶家目錄
服務端
Linux端:vsftpd,pureftp....
windows端:SerU,FileZilla-Server...
客戶端
Linux端:ftp,lftp,lftpget,wget,curl...
windows端:FileZilla
RPC(Remote Procedure Call Protocol)遠程過程調用協議
一部分功能由本地程序完成 另一部分功能由遠程主機上的函數完成。客戶端掛載了nfs服務器的文件系統時,進行一些操作。但該協議是在內核級別上實現的協議,RPC正是處理該問題的協議,它會將客戶端的操作的函數調用發送到服務器端,由服務器端執行這些函數調用。
idmapd
想想這種情形,nfs客戶端在掛載文件系統以後,在本地以某用戶的身份創建了一個文件,在服務器端這個文件的屬主和屬組是哪個用戶呢?早期是通過NIS(Network Information Services網絡信息服務)來解決這個問題的,但是在傳輸賬號和密碼時,使用的是明文傳輸,現在使用LDAP+clbbler來實現的。但是,NFS使用的是idmapd這個服務,有rpc提供,將所有的用戶後映射爲nfsnobody,但是在訪問的時候,還是以本地UID對應的本地用戶來使用的。
mounted
NFS是通過什麼來控制那些客戶端可以訪問,那些不可以訪問的呢?NFS只支持通過IP來控制客戶端,而這個功能是由守護進程mounted來實現的,它監聽的端口是半隨機的。所謂的半隨機指的是,這個隨機端口是由rpc服務來決定的,而rpc是通過隨機的方式。作用等等同於小區大門保安的作用。
NFS請求過程
請求過程:當客戶端試這去掛載使用nfs共享的文件系統是,客戶端首先回去與postmapper(tcp/111)端口去註冊使用,此時postmapper會隨機分配一個端口給mounted,然後mounted這個守護進程會來驗證客戶端的合法性,驗證通過後,會把請求交給nfs服務,客戶端此時可以掛載使用了,用戶在創建文件時,會使用到idmapd的守護進程來映射屬主。其實idmapd也是有rpc服務提供的,只不過在這裏,nfs服務使用到用戶映射的功能時,會自動的去調用此守護進程。
SMB:Service Message Block
CIFS:Common Internet File System 通用網絡文件系統,windows系統之間共享的協議,samba實現了該協議,故可實現windows與linux之間的文件共享服務
監聽的端口:
tcp/137 udp/137 tcp/139 udp/139
137:是實現NetBIOS協議,實現解析windows之間主機名的解析,實現在windwos的網絡鄰居可看到的Linux主機名
139:是實現cifs協議
交互式數據訪問;
smbclient -L HOST -U USERNAME
獲取共享信息後:
smbclient //SERVER/shared_name -U USERNAME
基於掛載的方式訪問;
mount -t cifs //SERVER/shared_name /mount_point -o uername=USERNAME,pasword=PASSWORD