SMB小传 —— SMB网络文件系统协议介绍
SMB網絡文件系統協議, 全名服務器消息塊(Server Message Block),曾用名CIFS(通用互聯網文件系統 Common Internet File System), 公元1983年誕生于IBM[1],幼年得到英特爾和微軟的照料,最終在微軟的培養下成長為當今世上網絡文件系統協議兩極之一的存在。本文就來聊聊SMB的生平二三事。
一、未曾停下的演進
作為一個誕生在谷歌、亞馬遜、雅虎、甚至思科都不曾存在的互聯網“遠古”時代[2]的網絡協議,SMB的早期版本(SMB 1.0/CIFS,以下簡稱SMB1)在不停地修修補補中卻也漸漸無法適應現代的網絡環境了。如今的互聯網已經不再簡單不再純粹,互聯網上存儲著海量的數據并還在快速生產新數據,運行著各式各樣的網絡應用,也同樣充斥著的無處不在的惡意攻擊。
SMB1協議有太多的缺點,除了近期在2017年因為WannaCry病毒事件而再次暴露出來的巨大安全漏洞之外,便是SMB1協議特性導致了其對于網絡資源的巨大耗費以及在遠距通信場景下極差的性能。SMB1顯著的性能問題還使得CIFS加速器成為了WAN加速類產品[3]的必備組件,思科、riverbed等公司都研發過此類功能,當然這些都是題外話了。對于SMB1的種種不足和為什么要停止使用SMB1,微軟SMB項目的負責人Ned Pyle已經有了清晰的訴說[4, 5],本文便不再贅述了。
下面(表-1),本文列表總結了SMB協議各個版本的發布時間以及各版本所帶來的重要協議特性。可以看到,從1983年到2007年這整整24年中,SMB作為一個網絡文件系統的基本功能已經比較完整了,各種文件系統操作、用戶認證、消息簽名、客戶端緩存等等的功能都有,更是取消了對NetBIOS協議層的依賴從而直接使用445端口運行在TCP/IP之上。至于為何SMB在1996年一度改名為CIFS呢?那都是源于微軟面對Sun公司的NFS(Network File System)協議面向Web服務的擴張(WebNFS),而進行的一次失敗的IETF網絡文件系統標準化嘗試[6],對此本文不多作細說。不過這一次改名導致了人們現在有時也會以CIFS來稱呼SMB協議,而在Linux平臺的SMB客戶端甚至一直保持了CIFS的命名。
隨著互聯網產業的快速發展,SMB堪憂的安全性和愈發跟不上時代的性能使得微軟不得不對SMB協議進行大刀闊斧的修訂,并在2007年發布了SMB 2.0。仔細觀察就會發現,SMB 2.X和SMB 3.X帶來的眾多新特性基本都是是圍繞著增加安全性和提升性能這兩個主題來設計的。
| SMB版本 | 年代 | 相應操作系統版本 | 重要協議特性 |
| SMB 3.1.1 | 2015 | Windows 10 Windows Server 2016 | - 傳輸加密算法協商 - 預認證完整性檢查(pre-authentication integrity) |
| SMB 3.0.2 | 2013 | Windows 8.1 Windows Server 2012 R2 | - 客戶端直讀直寫請求 - SMB Direct(RDMA)性能改進 |
| SMB 3.0 | 2012 | Windows 8 Windows Server 2012 | - 目錄級元數據客戶端緩存(directory lease) -?持久句柄(persistent handle) -?基于AES-CCM算法的數據傳輸加密 -?消息簽名(message signing)改用AES-CMAC算法 -?SMB Direct(RDMA)支持 -?多通道(multi-channel) |
| SMB 2.1 | 2009 | Windows 7 Windows Server 2008 R2 | -?基于Lease的文件數據客戶端緩存 -?多協議版本支持協商(multi-protocol negotiate) -?彈性句柄(resilient handle) |
| SMB 2.0.2 | 2008 | Windows Vista SP1 Windows Server 2008 | -?SMB指令數量減至19個 -?基于信用點(credit)的流控機制 -?改進復合請求機制(request compounding) -?耐用句柄(durable handle) -?消息簽名(message signing)改用SHA-256算法 - 支持軟鏈接(symbolic link) -?提升最大數據塊尺寸(maximum block size) |
| SMB 2.0 | 2007 | Windows Vista | |
| ======================== 時代的分割線 ======================== | |||
| SMB 1.0/CIFS | 2000 | Windows 2000 | -?包含100+指令的指令集 -?打開(open)、讀(read)、修改(modify)、關閉(close)等文件操作 -?取消(cancel)操作 -?直接運行于TCP/IP協議之上(Direct hosting of SMB over TCP/IP) -?查詢、設定文件和卷屬性(attributes) -?基于NTLM、Kerbeors等協議的用戶認證 -?基于MD5算法的消息簽名(message signing) -?基于機會鎖(opportunistic lock / oplock)的文件數據客戶端緩存 |
| CIFS | 1996 | Windows NT 4.0 | |
| 早期SMB | 1983 | MS-DOS OS/2 | |
表-1 SMB協議版本歷史與重要特性[7]
然而,如果用戶們想要真正用上新版SMB協議帶來的新特性,就必須保證SMB客戶端和SMB服務端都能夠支持帶有該特性的協議版本。更因為微軟并不支持向舊版Windows系統移植新版的SMB客戶端或服務端程序,用戶只能更新操作系統之后才能夠體驗更新的SMB特性。在表-2中,我們列出了不同Windows系統組合之間所能夠支持的最高的SMB版本以供參考。
| Windows版本 | Windows 10 WS 2016 | Windows 8.1 WS 2012 R2 | Windows 8 WS 2012 | Windows 7 WS 2008 R2 | Windows Vista WS 2008 | 更早版本 |
| Windows 10 WS 2016 | SMB 3.1.1 | SMB 3.0.2 | SMB 3.0 | SMB 2.1 | SMB 2.0.2 | SMB 1 |
| Windows 8.1 WS 2012 R2 | SMB 3.0.2 | SMB 3.0.2 | SMB 3.0 | SMB 2.1 | SMB 2.0.2 | SMB 1 |
| Windows 8 WS 2012 | SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0.2 | SMB 1 |
| Windows 7 WS 2008 R2 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0.2 | SMB 1 |
| Windows Vista WS 2008 | SMB 2.0.2 | SMB 2.0.2 | SMB 2.0.2 | SMB 2.0.2 | SMB 2.0.2 | SMB 1 |
| 更早版本 | SMB 1 | SMB 1 | SMB 1 | SMB 1 | SMB 1 | SMB 1 |
表-2 SMB協議版本歷史與重要特性 (* WS = Windows Server)
二、一次完整的SMB會話
簡單地聊完SMB的演進之后,本小節再來簡述一下SMB的網絡報文格式以及一個典型SMB會話的各個生命階段。本節講述關于SMB2和SMB3相關的協議內容,對于已經被摒棄的SMB1協議便略去不提了。
SMB報文格式
圖-1詳細展示了SMB2和SMB3的報文頭部結構,對這些技術細節不感興趣的讀者可跳過本節。至于每個單獨的SMB指令的報文格式便不在本文中展開了,有興趣的讀者可自行翻閱MS-SMB2協議文檔。細心的讀者可能會好奇,為什么SMB3沒有獨立的協議文檔呢?一則SMB2和SMB3在報文格式上并沒有太大差異,并不需要單獨開一篇文檔;二則,其實SMB 3.0在WIndows 8測試版階段還是命名為SMB 2.2的,但微軟工程師們經過再三考慮,認為以SMB3新增的代碼之多、新特性之豐富,一個單獨的主版本號才是理所應當的[8]。
圖-1 SMB報文格式
SMB會話的生命階段
如圖-2所示,一個普通的SMB會話從開始到結束一般會經過以下六個生命階段:
1. SMB協議協商(Negotiate)在一個SMB還沒有開始的時候,由客戶端率先發出一個協商請求。在請求中,客戶端會列出所有它所支持協議版本以及所支持的一些特性(比如加密Encryption、持久句柄Persistent Handle、客戶端緩存Leasing等等)。而服務端在回復中則會指定一個SMB版本且列出客戶端與服務端共同支持的特性。 2. 建立SMB會話(Session Setup)
客戶端選擇一個服務端支持的協議來進行用戶認證,可以選擇的認證協議一般包括NTLM、Kerberos等。按照選擇的認證協議的不同,這個階段可能會進行一次或多次SESSION_SETOP請求/回復的網絡包交換。至于NTLM或Kerberos認證協議的細節,我們會另文再敘。 3. 連接一個文件分享(Tree Connect)
在會話建立之后,客戶端會發出連接文件分享的請求。源于文件系統的樹形結構,該請求被命名為樹連接(Tree Connect)。以SMB協議的阿里云NAS為例,一般的SMB掛載命令為: net use z: \\XXX.nas.aliyuncs.com\myshare其中的“ \\XXX.nas.aliyuncs.com\myshare”便是我們將要連接的那個文件分享,也便是那棵“樹”。如果在“myshare”中創建有子目錄“abc”,那直接連接“abc”這棵子樹也是可以的: net use z: \\XXX.nas.aliyuncs.com\myshare\abc 4. 文件系統操作
在文件分享連接成功之后,用戶通過SMB客戶端進行真正的對于目標文件分享的業務操作。這個階段可以用到的指令有CREATE、CLOSE、FLUSH、READ、WRITE、SETINFO、GETINFO等等。 5. 斷開文件分享連接(Tree Disconnect)
當一個SMB會話被閑置一定時間之后,Windows會自動斷開文件分享連接并隨后中止SMB會話。這個閑置時間可以通過Windows注冊表進行設定[9]。當然,用戶也可以主動發起斷開連接請求。
6. 終止SMB會話(Logoff)
當客戶端發出會話中止請求并得到服務端發回的中止成功的回復之后,這個SMB會話至此便正式結束了。
圖-2 SMB會話的六個階段
三、現狀與展望
聊過了SMB的過往歷史和一小部分技術細節之后,本文再來說說關于SMB的一些其他的故事,也對SMB協議的未來做一個淺薄的展望。
與開源社區的恩怨情仇
雖然微軟長久以來主導著SMB協議標準的訂立與發展,是SMB協議的實質擁有者。不過我們無法忽視開源社區對SMB發展的貢獻。最早發布于1992年的SAMBA則是開源界對SMB協議支持最完整也是使用者最多的項目。SAMBA是一個松散的開發者團隊,開發SAMBA本身并不會獲得收入或盈利,所以這個團隊的成員大多還有另一份謀以生計的正職工作[10]。在2018年6的微軟互操作研討會上[11],筆者便有幸遇到幾位SAMBA的開發者,他們中有SAMBA主要維護者,來自谷歌的Jeremy Allison和當時剛剛受聘于微軟的Linux CIFS客戶端開發者Steve French。表-3和表-4列出了歷年來SAMBA對在Unix/Linux平臺上支持SMB協議作出的努力和成績。
現在的微軟每年都會和開源社區的開發者們一起參加各種研討會,有微軟主辦的互操作研討會、全球網絡存儲工業協會(SNIA,Storage Networking Industry Association)舉辦的存儲開發者大會等等。然而,早年的微軟和開源社區之間的關系并沒有現在這般和諧,甚至整個開源社區都曾將微軟視為頭號公敵。微軟和SAMBA之間也曾一度在歐洲對簿公堂[12]。但這些都在2010前后發生了轉變,微軟逐漸確立了其云優先的公司路線,也逐漸以開放的心態來對待開源社區,時至今日,微軟已經成為了全球最大的開源代碼貢獻者之一了[13]。從2011年起,微軟便遵循GPL開源協議開始向SAMBA項目貢獻代碼[14]。甚至其最近還收購了全球最大的開源代碼平臺Github。
| SAMBA版本 | 發布日期 | SMB協議支持版本 |
| 4.3.0 | 2015年9月 | SMB 3.1.1 |
| 4.1.0 | 2013年10月 | SMB 3 |
| 3.6.0 | 2011年8月 | SMB 2 |
| 3.5.0 | 2010年3月 | SMB 2(實驗性支持) |
表-3 SAMBA對SMB協議的支持(SMB服務端)[15]
| Linux內核版本 | 發布日期 | Linux CIFS重要更新內容 |
| 4.17 | 2018年6月 | 支持SMB 3.1.1 |
| 4.13 | 2017年9月 | 默認SMB協議版本由SMB1改為SMB3 |
| 4.11 | 2017年4月 | 支持SMB DFS; 支持SMB3傳輸加密 |
| 3.12 | 2013年11月 | 支持SMB 3.0.2 |
| 3.8 | 2013年2月 | 支持SMB 2.0.2 |
| 3.7 | 2012年12月 | 支持SMB 2.1 |
| 2.5.42 | 2002年10月 | 以內核模塊形式新增CIFS虛擬文件系統 |
表-4 Linux內核對SMB協議的支持(SMB客戶端)[16]
兼收并蓄是未來
雖然很多人知道,Windows可以連接NFS協議的文件分享,Linux上也可以掛載SMB協議的網絡存儲。但是大家也都普遍認為,這種“跨平臺”的網絡文件系統會有很多不可知的問題,性能也不好。在過去的很長的一段時間里,也確實大致如此。
不過隨著近年來微軟和開源社區,特別是和SAMBA的緊密合作,Unix/Linux平臺上對SMB協議的支持已經比較完整了,功能和性能上都有了長足的進步。特別是近期在Linux 4.18內核版本中,CIFS客戶端增加了SMB 3.1.1版協議對POSIX extension的實驗性支持[17]。一直以來,Windows和POSIX的文件系統語義的兼容性問題都在阻礙著用戶進行跨平臺文件方位(Windows、Linux、MAC等)。而在云計算大發展的當下,Linux系統和Windows系統分別統治消費者市場[18]和服務器市場[19],數據和文件的跨平臺訪問會是一個可以預見的強大需求。隨著SMB POSIX extension的到來,必將使SMB協議在跨平臺的網絡文件訪問上得以大展身手。在今天,主要的云計算廠商幾乎都已經推出了云上的文件存儲服務,用戶一般可以使用SMB或者NFS協議來掛載訪問這些云文件存儲,本文也對各家廠商對SMB和NFS的協議支持情況做了個簡單總結(見表-5)供讀者參考。
| 云廠商 | 產品 | SMB?協議支持 | NFS協議支持 |
| 阿里云 | ?文件存儲 NAS? | SMB2,SMB3 | NFS3,NFS4 |
| ?亞馬遜AWS | ?EFS? | X | NFS4 |
| ?FSx for Windows File Server? | SMB2, SMB3 | X | |
| 微軟Azure | ?File Storage? | SMB3 | X |
| 谷歌GCP | ?Filestore? | X | NFS3 |
| 騰訊云 | ?文件存儲 CFS? | SMB1, SMB2, SMB3 | NFS3, NFS4 |
| 華為云 | ?彈性文件服務 SFS? | X (即將上線) | NFS3 |
| *表中資料收集自2018年11月29日 | |||
表-5 主要云廠商文件存儲產品對SMB和NFS協議的支持
四、寫在最后
隨著存儲行業的發展,云文件存儲也會向跨地域大集群的方向發展,如SMB、NFS之類的網絡文件系統協議為了不被淘汰出歷史舞臺,也必然會做出更多的改變。SMB的故事還會繼續,我們且繼續關注。
參考資料
[1] Myths about Samba http://www.groklaw.net/article.php?story=20050205010415933 [2] History of the Internet https://en.wikipedia.org/wiki/History_of_the_Internet [3] CIFS acceleration techniques https://www.snia.org/sites/default/orig/sdc_archives/2009_presentations/monday/MarkRabinovich-IgorGokhman-CIFS_Acceleration_Techniques.pdf [4] Stop Using SMB1 https://blogs.technet.microsoft.com/filecab/2016/09/16/stop-using-smb1/ [5] 禁用SMB1協議 https://www.anquanke.com/post/id/97002 [6] Common Internet File System Protocol (CIFS/1.0) https://tools.ietf.org/html/draft-heizer-cifs-v1-spec-00 [7] MS-SMB2 https://msdn.microsoft.com/en-us/library/cc246482.aspx [8] SMB 2.2 is now SMB 3.0 https://cloudblogs.microsoft.com/windowsserver/2012/04/19/smb-2-2-is-now-smb-3-0/ [9] SMB timeout https://blogs.msdn.microsoft.com/openspecification/2013/03/27/smb-2-x-and-smb-3-0-timeouts-in-windows/ [10] Samba team https://www.samba.org/samba/team/ [11] Redmond Interoperability Plugfest 2018 https://www.interopevents.com/redmond2018 [12] Samba and the PFIF https://www.samba.org/samba/PFIF/ [13] Microsoft open source https://opensource.microsoft.com/ [14] Microsoft contributes open source code to samba https://www.zdnet.com/article/microsoft-contributes-open-source-code-to-samba/ [15] SAMBA release History https://www.samba.org/samba/history/ [16] Linux CIFS Kernel https://wiki.samba.org/index.php/LinuxCIFSKernel [17] POSIX extension https://interopevents.com/uploads/2074091-4_40_1100_SMB3.11%20POSIX%20Extensions.pdf [18] Desktop OS market share https://www.statista.com/statistics/218089/global-market-share-of-windows-7/ [19] Server OS market share https://w3techs.com/technologies/overview/operating_system/all總結
以上是生活随笔為你收集整理的SMB小传 —— SMB网络文件系统协议介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:用链表实现集合的并和交
- 下一篇: 金融FRM和CFA哪个含金量高?