1. 簡介:(ServerMessage Block)服務消息塊通信協議是微軟(Microsoft)和英特爾(Intel)在1987年制定的協議,主要是作為Microsoft網絡的通訊協議。SMB從ISO/OSI網絡分層的眼光來看是在會話層(session layer)和表示層(presentation layer)以及小部分應用層(application layer)的協議。如果以TCP/IP協議划分的眼光來看,則SMB是一個工作在應用層的協議。
2. 端口:139,445,使用NetBIOS的應用程序接口,或者TCP接口。
3. 允許協議擴展,最近微軟又把 SMB 改名為 CIFS(Common Internet File System),並且加入了許多新的特色。
4. 應用平台:從 Windows 95 開始,Microsoft Windows 操作系統都包括了客戶機和服務器 SMB 協議支持。Microsoft 為 Internet 提供了 SMB 的開源版本,即通用 Internet 文件系統 (CIFS)。與現有 Internet 應用程序如文件傳輸協議(FTP)相比, CIFS 靈活性更大。對於 UNIX 系統,可使用一種稱為 Samba 的共享軟件。
5. 結構:
報頭將消息標識為SMB消息,指定要執行的命令並提供上下文。在響應消息中,標題還包含指示命令成功或失敗(以及如何)的狀態信息。
參數塊是是可變長的,用來存放SMB執行的命令的參數。
數據塊是也是邊長的,最大為64 KB,結構與參數塊相似,但有一點不同(在介紹完結構后提到。)
5.1 SMB_header:
Protocol (4 bytes): 這個字段必須包含4字節的字符串'\ xFF','S','M','B',其中所顯示的順序由各自的ASCII值表示。在最早的可用SMB文檔中,該字段被定義為一個字節的消息類型(0xFF),后跟一個三字節的服務器類型標識符。
Command (1 byte):一個字節的命令代碼
Status (4 bytes):一個32位字段,用於從服務器向客戶端傳遞錯誤消息
Flags (1 byte):1位標志的8位字段,用於描述對消息有效的各種功能
Flags2 (2 bytes):1位標志的16位字段,表示消息有效的各種功能。未指定的位是保留的,必須為零
PIDHigh (2 bytes):如果設置為非零值,則該字段表示進程標識符(PID)的高位字節。它與下面的PIDLow字段組合形成一個完整的PID
SecurityFeatures (8 bytes): 這個8字節的字段有三種可能的解釋;
5.1.1 在協商安全簽名的情況下,必須遵守以下格式
如果已經協商SMB簽名,則該字段必須包含一個8字節的加密消息簽名,可用於檢測郵件在傳輸過程中是否被修改。消息簽名的使用與無連接傳輸是相互排斥的。
5.1.2 如果SMB/CIFS通過無連接傳輸進行傳輸,則必須遵守以下格式
其中,
key (4bytes): 用於驗證無連接傳輸上的消息的加密密鑰。
CID(2bytes): 連接標識符(CID)。
SequenceNumber(2bytes):一個數字,用於標識無連接傳輸上的消息序列。
5.1.3 如果上述兩種情況都不適用,則SecurityFeatures字段將被視為保留字段,必須由客戶端設置為零,並且必須被服務器忽略。
Reserved (2 bytes): 該字段保留,應該設置為0x0000
TID (2 bytes): 樹標識符(TID),用來標識這個CIFS數據包指的是什么資源(通常為磁盤共享或者打印機)。當數據包交換沒有牽涉到某個資源時,這個域是無意義的,可以忽略的。
PIDLow (2 bytes):PID的低16位
UID (2 bytes):用戶標識符(UID)
MID (2 bytes):多路復用標識符(MID),用來標示一對請求和應答。
5.2 參數塊:
WordCount(1字節):參數的長度,單位是2bytes
Words(變長):參數,大小事2 bytes的倍數。如果WordCount是0x00,則不包括該字段。
5.3 數據塊:
ByteCount(2個字節):Bytes字段的大小(以字節為單位)。該字段可以是0x0000,表示字節 字段是空的。由於SMB_Parameters.Words字段未對齊,且SMB_Data.ByteCount字段的大小為兩個字節,因此SMB_Data.Bytes的第一個字節 也是未對齊的。
Bytes (變長):長度是ByteCount個字節。
通過上述對結構的描述我們可以看出數據塊和參數塊在結構上是相似的,但是,數據塊長度的單位是1bytes而參數塊長度的單位是2bytes。
6. 批量消息:"AndX" Messages
批量消息通過在單個消息中發送多個命令請求或響應來減少完成一系列命令所需的消息數量。應用AndX構造的SMB命令被稱為“AndX命令”,並且由NT LAN Manager約定將“_ANDX”附加到命令名中。這種類型的消息被稱為AndX消息。
在AndX消息中,僅發送一個SMB報頭。然后在頭部之后是零個或多個參數和數據塊對,每個對應一個附加的命令請求/響應。消息中塊對的數量沒有限制,只針對總消息的大小有限制。即批量消息的總大小不能超過協商的MaxBufferSize。AndX消息的結構,在概念上類似於鏈表,用於連接批處理塊對。結果列表被稱為AndX鏈。這個結構如下所示。
AndXCommand (1 byte): 與AndX鏈中下一個塊對關聯的命令代碼。
AndXReserved (1 byte): 這個字段是保留的,必須是0x00。
AndXOffset (2 bytes): AndX消息中下一個參數塊的相對於SMB報頭起始字節的偏移量。該偏移與命令內的任何其他大小參數或偏移無關。該偏移量可以指向當前塊對尾部的位置。
AndX構造位於AndX命令請求/響應的參數塊的起始位置。
如果AndX鏈的最后一個命令是non-AndX SMB命令或AndX SMB命令,(AndXCommand字段設置為SMB_COM_NO_ANDX_COMMAND(0xFF,代表鏈終止符)),則認為AndX鏈已終止。SMB_COM_NO_ANDX_COMMAND命令代碼不用於任何其他上下文中。
7. 功能:服務器信息塊(SMB)協議是一種IBM協議,用於在計算機間共享文件、打印機、串口等。通過 SMB 協議,客戶端應用程序可以在各種網絡環境下讀、寫服務器上的文件,以及對服務器程序提出服務請求。此外通過 SMB 協議,應用程序可以訪問遠程服務器端的文件、以及打印機、郵件槽(mailslot)、命名管道(named pipe)等資源。
主要功能類別:
* Session management
* Transaction subprotocol
* File/directory access methods
* Read/write/lock methods
* Query directory information
* Query/set attributes methods
* Printing methods
* Other
* Obsolete
* Reserved but not implemented
8. 命令:目前SMB協議共包含75種命令,不同命令通過SMB_Header中1字節大小的Command字段來區別定義,其中:SMB_COM_TRANSACTION2命令用於打開或創建一個共享文件或文件夾,設置它們的擴展屬性。SMB_COM_NT_TRANSACT命令用於打開或創建一個文件或文件夾,並應用擴展屬性EA或安全描述符SD。
9. 傳輸(通信過程):
SMB協議的傳輸方式主要有三種:
9.1 基於NetBIOS的傳輸:
的網絡基本輸入/輸出系統(NetBIOS)是一個軟件接口層。NetBIOS在[NETBEUI]中指定。NetBIOS對底層傳輸機制施加語義要求。基於NetBIOS的傳輸必須支持三種常見的服務:
- · 該NetBIOS名稱服務
- · 該NetBIOS數據報服務
- · 該NetBIOS會話服務
9.2 直接托管:
直接IPX傳輸(也稱為Direct Hosting IPX) 傳輸IPX協議的CIFS,而不使用NetBIOS 接口層。
與用於CIFS的其他傳輸協議不同,Direct IPX傳輸協議是不對稱的。盡可能將處理從服務器移動到客戶端,以便服務器可以高效地擴展到大量客戶端。例如,服務器不會重新啟動丟失的響應。在任何一個方向丟失數據包的情況下,完全由客戶端重新發送請求。
IPX也是無連接協議,因此CIFS本身提供了確保客戶端和服務器之間的消息的順序傳送以及從客戶端節點或服務器節點的故障中檢測和恢復的機制。為了實現這些目標,SMB報頭被修改為包括一個連接標識符(CID)和一個序列號(SequenceNumber)。該CID是由服務器生成的值,並返回到在SMB_COM_NEGOTIATE響應客戶端。在這個資源共享會話期間,客戶端必須在將來與所有服務器的SMB交換中使用這個CID。
所述的SequenceNumber值是由客戶端提供。如果序列號為零,則該命令被稱為“非序列化命令”,客戶端必須使用PID和MID字段將響應消息與產生請求的客戶端進程相匹配。特別是,客戶端必須確保它永遠不會有相同的MID有一個以上明顯的未確定的無序請求。
已排序的命令具有非零的SequenceNumber 值。順序命令用於導致服務器上不能重復的狀態更改的操作。例如,文件打開,文件關閉或字節范圍鎖定。無序的命令用於每次都可以執行的次數相同的操作。例如,讀取或寫入磁盤文件。
使用直接IPX傳輸的 CIFS服務器必須為每個客戶端維護一個小緩沖區。該緩沖區用於臨時存儲來自最近排序命令的響應信息。如果客戶端沒有收到對順序請求的響應,則應該重新發送請求。如果服務器已經處理了請求,那么響應必須仍然在緩沖區中並且可以被重新發送。如果服務器未收到原始請求,則可以處理重新發送的請求。當客戶端發送下一個順序命令請求時,它表示之前的順序響應已經收到,並且緩沖區可以被重新使用。
由於Direct IPX Transport的不對稱性,服務器會為響應緩沖區分配有限的空間。因此,客戶端必須發送所有具有“大”響應大小的命令作為未被序列化的。這些命令包括文件讀取和目錄搜索操作。如果對順序命令的響應對於響應緩沖區來說太大,那么服務器必須通過ERRSRV / ERRerror使請求失敗。
SMB事務能夠將大量數據從服務器傳輸到客戶端。事務可以用來改變服務器狀態,所以不能作為無序的命令發送。客戶有辦法組織這些命令來解決這個限制。事務可以包含多部分請求和/或多部分響應。響應消息的大小可以調整以適應響應緩沖區。因此,SMB事務處理為一組有序的命令。
將SMB事務描述為在面向連接的傳輸中使用。當CIFS通過無連接傳輸(如Direct IPX傳輸)傳輸時,會修改事務處理。
當通過無連接傳輸進行事務時,每個請求消息都作為一個有序的命令發送。每個消息必須有一個一致的MID值和一個非零的SequenceNumber 值,在事務中每個新消息增加1。服務器必須響應每個請求消息,除了最后一個請求消息,其響應指示服務器已准備好進行下一個次要請求。對於最初的交易請求消息和所有后續的交易次要請求,除了最后的請求消息之外,服務器必須發送臨時響應。
通過無連接傳輸的CIFS事務消息
當事務完成時,客戶端務必發送另一個順序命令給服務器。這向服務器指示所有事務最終響應消息已經被接收,並且參數和數據傳輸已經完成。分配給事務命令的資源可以由服務
器釋放。
通過無連接傳輸的CIFS事務完成消息
9.3 虛擬電路:
在CIFS中,虛擬電路(VC) 表示客戶端和服務器之間的傳輸層連接。在多個物理連接被組合以提供改進的SMB連接的整體帶寬的情況下,VC有用。例如,VC可以通過多個撥號調制解調器連接復用來自單個SMB連接的SMB消息,以提高吞吐量。虛擬電路很少用於面向連接的傳輸,如NBT;它們通常與無連接傳輸(如直接托管IPX)相關聯。VC多路復用是在命令級別執行的,SMB_COM_READ_MPX和SMB_COM_WRITE_MPX命令(專門設計為多路復用)除外。
VC使用SMB_COM_SESSION_SETUP_ANDX命令建立,並根據SMB_COM_NEGOTIATE響應中提供的SessionKey進行組合。使用相同SessionKey在客戶端和服務器對之間創建的每個VC都被認為是同一SMB連接的一部分。每個創建的VC必須在SMB_COM_SESSION_SETUP_ANDX請求中有一個唯一的VcNumber來建立它。創建的第一個VC應該有一個零(0)的VcNumber。客戶端可以為每個SMB連接建立的實現定義的最大虛擬電路數由 服務器的SMB_COM_NEGOTIATE響應中的MaxNumberVcs字段指示。
一個零(0)的VcNumber具有特殊的意義。當客戶端出現故障或重置時,無連接傳輸可能無法提供任何故障指示。 無論SessionKey的值如何,VcNumber為零(0)的虛擬電路被定義為向服務器指示客戶端已經放棄了所有以前的虛擬電路,並且服務器也必須關閉這些VC,以確保正確地清理資源。<9>在同一客戶機上運行的獨立應用程序與相同服務器建立單獨連接的情況下,或在多個客戶機通過網絡地址轉換(NAT)設備連接到單個服務器的情況下,此行為可能會產生意想不到的后果。在這些情況下,來自同一客戶端(或NAT設備)的每個連接嘗試都可能導致該客戶端的所有其他客戶端斷開連接。為避免這種情況,客戶端可以使用大於或等於1 的VcNumber,或者可以將服務器配置為繞過 面向連接的傳輸的VcNumber零的特殊處理。
10. 建立連接過程:
11. 斷開過程:
12. 簽名過程:
13. 獲取文件屬性:
14. 設置文件屬性:
15. 下載文件過程:
16. 上傳文件過程:
17.window 官方文檔:
https://msdn.microsoft.com/en-us/library/ee442092.aspx