Microsoft SMB 通訊協定封包交換案例

本主題提供用戶端與伺服器之間 Microsoft SMB 通訊協定封包交換的範例。 下列步驟是程式的概觀:

  1. 用戶端和伺服器會建立 NetBIOS 會話。
  2. 用戶端和伺服器會交涉 Microsoft SMB 通訊協定方言。
  3. 用戶端會登入伺服器。
  4. 用戶端會連線到伺服器上的共用。
  5. 用戶端會在共用上開啟檔案。
  6. 用戶端會從檔案讀取。

首先,用戶端會使用伺服器建立全雙工 TCP 連線。 然後,用戶端會透過 TCP 連線建置並傳送 NetBIOS 會話要求封包。 如果封包的格式正確,則伺服器會傳回封包,其中包含確認會話已建立的訊息。 之後,用戶端會將第一個 Microsoft SMB 通訊協定封包傳送至伺服器。

封包 1:SMB_COM_NEGOTIATE
方向: 用戶端對伺服器
描述: 用戶端要求伺服器交涉 Microsoft SMB 通訊協定方言。 字串清單,識別用戶端可以使用的方言會包含在封包中。
封包 2:SMB_COM_NEGOTIATE
方向: 伺服器對用戶端
描述: 伺服器會回應用戶端的要求,以識別要在會話中使用的 Microsoft SMB 通訊協定方言。 傳回的封包也包含 8 位元組的隨機字串,將在下一個步驟中用來在登入程式期間驗證用戶端。
封包 3:SMB_COM_SESSION_SETUP_ANDX
方向: 用戶端對伺服器
描述: 此封包包含用戶端功能的相關資訊,因此即使伺服器只實作共用層級安全性,也必須傳送此封包。
封包 3:SMB_COM_SESSION_SETUP_ANDX
方向: 伺服器對用戶端
描述: 如果伺服器接受挑戰/回應,則會在傳回給用戶端的封包中包含有效的 UID。 如果不接受,伺服器將會在此封包中傳回錯誤碼,並拒絕存取。
封包 4:SMB_COM_TREE_CONNECT_ANDX
方向: 用戶端對伺服器
描述: 用戶端會要求存取共用。 封包包含 UNC 格式共用的完整指定路徑。
封包 5:SMB_COM_TREE_CONNECT_ANDX
方向: 伺服器對用戶端
描述: 如果授與共享的存取權,則伺服器會傳回對應至此封包中共用的 16 位樹狀結構識別碼 (TID) 。 如果共用不存在,或使用者沒有足夠的認證存取共用,伺服器將會在此封包中傳回錯誤碼,並拒絕存取共用。
封包 6:SMB_COM_OPEN_ANDX
方向: 用戶端對伺服器
描述: 用戶端會要求伺服器代表用戶端開啟存取共用上的檔案。 此封包包含要開啟的檔案名。
封包 7:SMB_COM_OPEN_ANDX
方向: 伺服器對用戶端
描述: 如果授與檔案的存取權,則伺服器會傳回所要求檔案的檔案識別碼。 如果檔案不存在,或使用者沒有足夠的認證存取檔案,伺服器會傳回此封包中的錯誤碼,並拒絕存取檔案。
封包 8:SMB_COM_READ_ANDX
方向: 用戶端對伺服器
描述: 用戶端要求伺服器代表用戶端從開啟的檔案讀取資料,並將此資料傳回給用戶端。 此封包中包含開啟檔案時用戶端取得的檔案識別碼,以識別伺服器應該從中讀取資料的開啟檔案。
封包 9:SMB_COM_READ_ANDX
方向: 伺服器對用戶端
描述: 伺服器會傳回此封包中要求的檔案資料。 此處的錯誤不太可能因為已授與伺服器、共用和檔案的存取權。 不過,在某些情況下可能會發生此情況:例如,如果在開啟檔案和讀取檔案的時間之間,共用的存取權就會變更。

注意

如果您實作不支援變更通知的 CIFS,Windows 無法保留檔案系統的未處理控制碼,而且 SMB 連線可以消失而沒有通知。