SMB小传 —— SMB网络文件系统协议介绍
SMB網(wǎng)絡(luò)文件系統(tǒng)協(xié)議, 全名服務(wù)器消息塊(Server Message Block),曾用名CIFS(通用互聯(lián)網(wǎng)文件系統(tǒng) Common Internet File System), 公元1983年誕生于IBM[1],幼年得到英特爾和微軟的照料,最終在微軟的培養(yǎng)下成長(zhǎng)為當(dāng)今世上網(wǎng)絡(luò)文件系統(tǒng)協(xié)議兩極之一的存在。本文就來(lái)聊聊SMB的生平二三事。
一、未曾停下的演進(jìn)
作為一個(gè)誕生在谷歌、亞馬遜、雅虎、甚至思科都不曾存在的互聯(lián)網(wǎng)“遠(yuǎn)古”時(shí)代[2]的網(wǎng)絡(luò)協(xié)議,SMB的早期版本(SMB 1.0/CIFS,以下簡(jiǎn)稱SMB1)在不停地修修補(bǔ)補(bǔ)中卻也漸漸無(wú)法適應(yīng)現(xiàn)代的網(wǎng)絡(luò)環(huán)境了。如今的互聯(lián)網(wǎng)已經(jīng)不再簡(jiǎn)單不再純粹,互聯(lián)網(wǎng)上存儲(chǔ)著海量的數(shù)據(jù)并還在快速生產(chǎn)新數(shù)據(jù),運(yùn)行著各式各樣的網(wǎng)絡(luò)應(yīng)用,也同樣充斥著的無(wú)處不在的惡意攻擊。
SMB1協(xié)議有太多的缺點(diǎn),除了近期在2017年因?yàn)閃annaCry病毒事件而再次暴露出來(lái)的巨大安全漏洞之外,便是SMB1協(xié)議特性導(dǎo)致了其對(duì)于網(wǎng)絡(luò)資源的巨大耗費(fèi)以及在遠(yuǎn)距通信場(chǎng)景下極差的性能。SMB1顯著的性能問(wèn)題還使得CIFS加速器成為了WAN加速類產(chǎn)品[3]的必備組件,思科、riverbed等公司都研發(fā)過(guò)此類功能,當(dāng)然這些都是題外話了。對(duì)于SMB1的種種不足和為什么要停止使用SMB1,微軟SMB項(xiàng)目的負(fù)責(zé)人Ned Pyle已經(jīng)有了清晰的訴說(shuō)[4, 5],本文便不再贅述了。
下面(表-1),本文列表總結(jié)了SMB協(xié)議各個(gè)版本的發(fā)布時(shí)間以及各版本所帶來(lái)的重要協(xié)議特性。可以看到,從1983年到2007年這整整24年中,SMB作為一個(gè)網(wǎng)絡(luò)文件系統(tǒng)的基本功能已經(jīng)比較完整了,各種文件系統(tǒng)操作、用戶認(rèn)證、消息簽名、客戶端緩存等等的功能都有,更是取消了對(duì)NetBIOS協(xié)議層的依賴從而直接使用445端口運(yùn)行在TCP/IP之上。至于為何SMB在1996年一度改名為CIFS呢?那都是源于微軟面對(duì)Sun公司的NFS(Network File System)協(xié)議面向Web服務(wù)的擴(kuò)張(WebNFS),而進(jìn)行的一次失敗的IETF網(wǎng)絡(luò)文件系統(tǒng)標(biāo)準(zhǔn)化嘗試[6],對(duì)此本文不多作細(xì)說(shuō)。不過(guò)這一次改名導(dǎo)致了人們現(xiàn)在有時(shí)也會(huì)以CIFS來(lái)稱呼SMB協(xié)議,而在Linux平臺(tái)的SMB客戶端甚至一直保持了CIFS的命名。
隨著互聯(lián)網(wǎng)產(chǎn)業(yè)的快速發(fā)展,SMB堪憂的安全性和愈發(fā)跟不上時(shí)代的性能使得微軟不得不對(duì)SMB協(xié)議進(jìn)行大刀闊斧的修訂,并在2007年發(fā)布了SMB 2.0。仔細(xì)觀察就會(huì)發(fā)現(xiàn),SMB 2.X和SMB 3.X帶來(lái)的眾多新特性基本都是是圍繞著增加安全性和提升性能這兩個(gè)主題來(lái)設(shè)計(jì)的。
| SMB版本 | 年代 | 相應(yīng)操作系統(tǒng)版本 | 重要協(xié)議特性 |
| SMB 3.1.1 | 2015 | Windows 10 Windows Server 2016 | - 傳輸加密算法協(xié)商 - 預(yù)認(rèn)證完整性檢查(pre-authentication integrity) |
| SMB 3.0.2 | 2013 | Windows 8.1 Windows Server 2012 R2 | - 客戶端直讀直寫請(qǐng)求 - SMB Direct(RDMA)性能改進(jìn) |
| SMB 3.0 | 2012 | Windows 8 Windows Server 2012 | - 目錄級(jí)元數(shù)據(jù)客戶端緩存(directory lease) -?持久句柄(persistent handle) -?基于AES-CCM算法的數(shù)據(jù)傳輸加密 -?消息簽名(message signing)改用AES-CMAC算法 -?SMB Direct(RDMA)支持 -?多通道(multi-channel) |
| SMB 2.1 | 2009 | Windows 7 Windows Server 2008 R2 | -?基于Lease的文件數(shù)據(jù)客戶端緩存 -?多協(xié)議版本支持協(xié)商(multi-protocol negotiate) -?彈性句柄(resilient handle) |
| SMB 2.0.2 | 2008 | Windows Vista SP1 Windows Server 2008 | -?SMB指令數(shù)量減至19個(gè) -?基于信用點(diǎn)(credit)的流控機(jī)制 -?改進(jìn)復(fù)合請(qǐng)求機(jī)制(request compounding) -?耐用句柄(durable handle) -?消息簽名(message signing)改用SHA-256算法 - 支持軟鏈接(symbolic link) -?提升最大數(shù)據(jù)塊尺寸(maximum block size) |
| SMB 2.0 | 2007 | Windows Vista | |
| ======================== 時(shí)代的分割線 ======================== | |||
| SMB 1.0/CIFS | 2000 | Windows 2000 | -?包含100+指令的指令集 -?打開(kāi)(open)、讀(read)、修改(modify)、關(guān)閉(close)等文件操作 -?取消(cancel)操作 -?直接運(yùn)行于TCP/IP協(xié)議之上(Direct hosting of SMB over TCP/IP) -?查詢、設(shè)定文件和卷屬性(attributes) -?基于NTLM、Kerbeors等協(xié)議的用戶認(rèn)證 -?基于MD5算法的消息簽名(message signing) -?基于機(jī)會(huì)鎖(opportunistic lock / oplock)的文件數(shù)據(jù)客戶端緩存 |
| CIFS | 1996 | Windows NT 4.0 | |
| 早期SMB | 1983 | MS-DOS OS/2 | |
表-1 SMB協(xié)議版本歷史與重要特性[7]
然而,如果用戶們想要真正用上新版SMB協(xié)議帶來(lái)的新特性,就必須保證SMB客戶端和SMB服務(wù)端都能夠支持帶有該特性的協(xié)議版本。更因?yàn)槲④洸⒉恢С窒蚺f版Windows系統(tǒng)移植新版的SMB客戶端或服務(wù)端程序,用戶只能更新操作系統(tǒng)之后才能夠體驗(yàn)更新的SMB特性。在表-2中,我們列出了不同Windows系統(tǒng)組合之間所能夠支持的最高的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協(xié)議版本歷史與重要特性 (* WS = Windows Server)
二、一次完整的SMB會(huì)話
簡(jiǎn)單地聊完SMB的演進(jìn)之后,本小節(jié)再來(lái)簡(jiǎn)述一下SMB的網(wǎng)絡(luò)報(bào)文格式以及一個(gè)典型SMB會(huì)話的各個(gè)生命階段。本節(jié)講述關(guān)于SMB2和SMB3相關(guān)的協(xié)議內(nèi)容,對(duì)于已經(jīng)被摒棄的SMB1協(xié)議便略去不提了。
SMB報(bào)文格式
圖-1詳細(xì)展示了SMB2和SMB3的報(bào)文頭部結(jié)構(gòu),對(duì)這些技術(shù)細(xì)節(jié)不感興趣的讀者可跳過(guò)本節(jié)。至于每個(gè)單獨(dú)的SMB指令的報(bào)文格式便不在本文中展開(kāi)了,有興趣的讀者可自行翻閱MS-SMB2協(xié)議文檔。細(xì)心的讀者可能會(huì)好奇,為什么SMB3沒(méi)有獨(dú)立的協(xié)議文檔呢?一則SMB2和SMB3在報(bào)文格式上并沒(méi)有太大差異,并不需要單獨(dú)開(kāi)一篇文檔;二則,其實(shí)SMB 3.0在WIndows 8測(cè)試版階段還是命名為SMB 2.2的,但微軟工程師們經(jīng)過(guò)再三考慮,認(rèn)為以SMB3新增的代碼之多、新特性之豐富,一個(gè)單獨(dú)的主版本號(hào)才是理所應(yīng)當(dāng)?shù)腫8]。
圖-1 SMB報(bào)文格式
SMB會(huì)話的生命階段
如圖-2所示,一個(gè)普通的SMB會(huì)話從開(kāi)始到結(jié)束一般會(huì)經(jīng)過(guò)以下六個(gè)生命階段:
1. SMB協(xié)議協(xié)商(Negotiate)在一個(gè)SMB還沒(méi)有開(kāi)始的時(shí)候,由客戶端率先發(fā)出一個(gè)協(xié)商請(qǐng)求。在請(qǐng)求中,客戶端會(huì)列出所有它所支持協(xié)議版本以及所支持的一些特性(比如加密Encryption、持久句柄Persistent Handle、客戶端緩存Leasing等等)。而服務(wù)端在回復(fù)中則會(huì)指定一個(gè)SMB版本且列出客戶端與服務(wù)端共同支持的特性。 2. 建立SMB會(huì)話(Session Setup)
客戶端選擇一個(gè)服務(wù)端支持的協(xié)議來(lái)進(jìn)行用戶認(rèn)證,可以選擇的認(rèn)證協(xié)議一般包括NTLM、Kerberos等。按照選擇的認(rèn)證協(xié)議的不同,這個(gè)階段可能會(huì)進(jìn)行一次或多次SESSION_SETOP請(qǐng)求/回復(fù)的網(wǎng)絡(luò)包交換。至于NTLM或Kerberos認(rèn)證協(xié)議的細(xì)節(jié),我們會(huì)另文再敘。 3. 連接一個(gè)文件分享(Tree Connect)
在會(huì)話建立之后,客戶端會(huì)發(fā)出連接文件分享的請(qǐng)求。源于文件系統(tǒng)的樹(shù)形結(jié)構(gòu),該請(qǐng)求被命名為樹(shù)連接(Tree Connect)。以SMB協(xié)議的阿里云NAS為例,一般的SMB掛載命令為: net use z: \\XXX.nas.aliyuncs.com\myshare其中的“ \\XXX.nas.aliyuncs.com\myshare”便是我們將要連接的那個(gè)文件分享,也便是那棵“樹(shù)”。如果在“myshare”中創(chuàng)建有子目錄“abc”,那直接連接“abc”這棵子樹(shù)也是可以的: net use z: \\XXX.nas.aliyuncs.com\myshare\abc 4. 文件系統(tǒng)操作
在文件分享連接成功之后,用戶通過(guò)SMB客戶端進(jìn)行真正的對(duì)于目標(biāo)文件分享的業(yè)務(wù)操作。這個(gè)階段可以用到的指令有CREATE、CLOSE、FLUSH、READ、WRITE、SETINFO、GETINFO等等。 5. 斷開(kāi)文件分享連接(Tree Disconnect)
當(dāng)一個(gè)SMB會(huì)話被閑置一定時(shí)間之后,Windows會(huì)自動(dòng)斷開(kāi)文件分享連接并隨后中止SMB會(huì)話。這個(gè)閑置時(shí)間可以通過(guò)Windows注冊(cè)表進(jìn)行設(shè)定[9]。當(dāng)然,用戶也可以主動(dòng)發(fā)起斷開(kāi)連接請(qǐng)求。
6. 終止SMB會(huì)話(Logoff)
當(dāng)客戶端發(fā)出會(huì)話中止請(qǐng)求并得到服務(wù)端發(fā)回的中止成功的回復(fù)之后,這個(gè)SMB會(huì)話至此便正式結(jié)束了。
圖-2 SMB會(huì)話的六個(gè)階段
三、現(xiàn)狀與展望
聊過(guò)了SMB的過(guò)往歷史和一小部分技術(shù)細(xì)節(jié)之后,本文再來(lái)說(shuō)說(shuō)關(guān)于SMB的一些其他的故事,也對(duì)SMB協(xié)議的未來(lái)做一個(gè)淺薄的展望。
與開(kāi)源社區(qū)的恩怨情仇
雖然微軟長(zhǎng)久以來(lái)主導(dǎo)著SMB協(xié)議標(biāo)準(zhǔn)的訂立與發(fā)展,是SMB協(xié)議的實(shí)質(zhì)擁有者。不過(guò)我們無(wú)法忽視開(kāi)源社區(qū)對(duì)SMB發(fā)展的貢獻(xiàn)。最早發(fā)布于1992年的SAMBA則是開(kāi)源界對(duì)SMB協(xié)議支持最完整也是使用者最多的項(xiàng)目。SAMBA是一個(gè)松散的開(kāi)發(fā)者團(tuán)隊(duì),開(kāi)發(fā)SAMBA本身并不會(huì)獲得收入或盈利,所以這個(gè)團(tuán)隊(duì)的成員大多還有另一份謀以生計(jì)的正職工作[10]。在2018年6的微軟互操作研討會(huì)上[11],筆者便有幸遇到幾位SAMBA的開(kāi)發(fā)者,他們中有SAMBA主要維護(hù)者,來(lái)自谷歌的Jeremy Allison和當(dāng)時(shí)剛剛受聘于微軟的Linux CIFS客戶端開(kāi)發(fā)者Steve French。表-3和表-4列出了歷年來(lái)SAMBA對(duì)在Unix/Linux平臺(tái)上支持SMB協(xié)議作出的努力和成績(jī)。
現(xiàn)在的微軟每年都會(huì)和開(kāi)源社區(qū)的開(kāi)發(fā)者們一起參加各種研討會(huì),有微軟主辦的互操作研討會(huì)、全球網(wǎng)絡(luò)存儲(chǔ)工業(yè)協(xié)會(huì)(SNIA,Storage Networking Industry Association)舉辦的存儲(chǔ)開(kāi)發(fā)者大會(huì)等等。然而,早年的微軟和開(kāi)源社區(qū)之間的關(guān)系并沒(méi)有現(xiàn)在這般和諧,甚至整個(gè)開(kāi)源社區(qū)都曾將微軟視為頭號(hào)公敵。微軟和SAMBA之間也曾一度在歐洲對(duì)簿公堂[12]。但這些都在2010前后發(fā)生了轉(zhuǎn)變,微軟逐漸確立了其云優(yōu)先的公司路線,也逐漸以開(kāi)放的心態(tài)來(lái)對(duì)待開(kāi)源社區(qū),時(shí)至今日,微軟已經(jīng)成為了全球最大的開(kāi)源代碼貢獻(xiàn)者之一了[13]。從2011年起,微軟便遵循GPL開(kāi)源協(xié)議開(kāi)始向SAMBA項(xiàng)目貢獻(xiàn)代碼[14]。甚至其最近還收購(gòu)了全球最大的開(kāi)源代碼平臺(tái)Github。
| SAMBA版本 | 發(fā)布日期 | SMB協(xié)議支持版本 |
| 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(實(shí)驗(yàn)性支持) |
表-3 SAMBA對(duì)SMB協(xié)議的支持(SMB服務(wù)端)[15]
| Linux內(nèi)核版本 | 發(fā)布日期 | Linux CIFS重要更新內(nèi)容 |
| 4.17 | 2018年6月 | 支持SMB 3.1.1 |
| 4.13 | 2017年9月 | 默認(rèn)SMB協(xié)議版本由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月 | 以內(nèi)核模塊形式新增CIFS虛擬文件系統(tǒng) |
表-4 Linux內(nèi)核對(duì)SMB協(xié)議的支持(SMB客戶端)[16]
兼收并蓄是未來(lái)
雖然很多人知道,Windows可以連接NFS協(xié)議的文件分享,Linux上也可以掛載SMB協(xié)議的網(wǎng)絡(luò)存儲(chǔ)。但是大家也都普遍認(rèn)為,這種“跨平臺(tái)”的網(wǎng)絡(luò)文件系統(tǒng)會(huì)有很多不可知的問(wèn)題,性能也不好。在過(guò)去的很長(zhǎng)的一段時(shí)間里,也確實(shí)大致如此。
不過(guò)隨著近年來(lái)微軟和開(kāi)源社區(qū),特別是和SAMBA的緊密合作,Unix/Linux平臺(tái)上對(duì)SMB協(xié)議的支持已經(jīng)比較完整了,功能和性能上都有了長(zhǎng)足的進(jìn)步。特別是近期在Linux 4.18內(nèi)核版本中,CIFS客戶端增加了SMB 3.1.1版協(xié)議對(duì)POSIX extension的實(shí)驗(yàn)性支持[17]。一直以來(lái),Windows和POSIX的文件系統(tǒng)語(yǔ)義的兼容性問(wèn)題都在阻礙著用戶進(jìn)行跨平臺(tái)文件方位(Windows、Linux、MAC等)。而在云計(jì)算大發(fā)展的當(dāng)下,Linux系統(tǒng)和Windows系統(tǒng)分別統(tǒng)治消費(fèi)者市場(chǎng)[18]和服務(wù)器市場(chǎng)[19],數(shù)據(jù)和文件的跨平臺(tái)訪問(wèn)會(huì)是一個(gè)可以預(yù)見(jiàn)的強(qiáng)大需求。隨著SMB POSIX extension的到來(lái),必將使SMB協(xié)議在跨平臺(tái)的網(wǎng)絡(luò)文件訪問(wèn)上得以大展身手。在今天,主要的云計(jì)算廠商幾乎都已經(jīng)推出了云上的文件存儲(chǔ)服務(wù),用戶一般可以使用SMB或者NFS協(xié)議來(lái)掛載訪問(wèn)這些云文件存儲(chǔ),本文也對(duì)各家廠商對(duì)SMB和NFS的協(xié)議支持情況做了個(gè)簡(jiǎn)單總結(jié)(見(jiàn)表-5)供讀者參考。
| 云廠商 | 產(chǎn)品 | SMB?協(xié)議支持 | NFS協(xié)議支持 |
| 阿里云 | ?文件存儲(chǔ) 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 |
| 騰訊云 | ?文件存儲(chǔ) CFS? | SMB1, SMB2, SMB3 | NFS3, NFS4 |
| 華為云 | ?彈性文件服務(wù) SFS? | X (即將上線) | NFS3 |
| *表中資料收集自2018年11月29日 | |||
表-5 主要云廠商文件存儲(chǔ)產(chǎn)品對(duì)SMB和NFS協(xié)議的支持
四、寫在最后
隨著存儲(chǔ)行業(yè)的發(fā)展,云文件存儲(chǔ)也會(huì)向跨地域大集群的方向發(fā)展,如SMB、NFS之類的網(wǎng)絡(luò)文件系統(tǒng)協(xié)議為了不被淘汰出歷史舞臺(tái),也必然會(huì)做出更多的改變。SMB的故事還會(huì)繼續(xù),我們且繼續(xù)關(guān)注。
參考資料
[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協(xié)議 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總結(jié)
以上是生活随笔為你收集整理的SMB小传 —— SMB网络文件系统协议介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言:用链表实现集合的并和交
- 下一篇: java信息管理系统总结_java实现科