NetBIOS與SMB/CIFS協議
在個人計算機和局域網發展的早期,為了在個人計算機上實現網絡能力,Microsoft和IBM合作開發了一套協議NetBIOS,這是一套用於網絡通訊的調用接口,開發者IBM認為這套協議將如同它們設計的計算機BIOS一樣成為最基本的網絡訪問接口,因此使用了NetBIOS這個名字。而Microsoft就使用NetBIOS接口開發網絡服務器及相應的客戶軟件。
然後IBM在Token Ring和Ethernet上直接實現了NetBIOS驅動,實現了位於NetBIOS 和物理網絡層之間的各種具體接口,這些程序遵循的標准被稱為NetBEUI。NetBEUI直接控制Token Ring和Ethernet驅動程序,因此它只能運行在局域網上。但是NetBIOS本身並沒有對下層使用的協議進行限制,因此它除了可以在NetBEUI支持下運行之外,也可以在其他協議支持下運行。其他的網絡開發者在另外的一些協議的基礎上也實現了NetBIOS接口,例如TCP/IP,IPX以及Decnet等。其中NetBIOS over IP由於使用TCP/IP協議,因而在低層與Unix計算機相容,成為Unix和個人計算機系統通信的基礎。
Windows系列計算機並不一定使用IP作它的網絡傳輸協議,它也能使用IPX或NetBEUI作傳輸協議,但是FreeBSD不支持IPX或NetBEUI上的NetBIOS,必須為Windows客戶配置IP協議,才能與FreeBSD相互共享資源。
NetBIOS名字解析
由於NetBIOS事實上是一種與TCP/IP獨立發展的標准,雖然它可以使用TCP/IP作為傳輸協議,但是由於概念上的不同,它並沒有利用TCP/IP提供的全部能力,而是使用自己的方式來完成類似的工作。其中最大的區別就在於名字解析方式上,NetBIOS具備自己獨立的名字解析概念和能力,因此它使用的名字解析方式就與TCP/IP 中標准解析方式 ── DNS不同。在必須經過NetBIOS名字解析獲得了一台命名相應的IP地址之後,NetBIOS 會話就可以建立在普通TCP連接的基礎上了。因此在NetBIOS中,名字解析是NetBIOS會話與普通TCP 連接最大的不同之處。
NetBIOS名字解析與DNS名字解析的最大不同在於NetBIOS是動態的,計算機需要首先注冊自己的名字,然後才能解析到該名字。動態解析雖然帶來的很大的方便性,但卻復雜和低效的多,因此只能用於小范圍的局域網上。
每個NetBIOS的名字可以多達16個字符,第16個字符用來標識輸入名字時使用的程序類型。當NetBIOS 的計算機進行通信時,它必須基於NetBIOS名字,而不能基於IP地址。一個NetBIOS服務程序必須首先注冊自己的NetBIOS名字,而一個應用程序則需要查詢所需要的NetBIOS名字。例如每台Windows計算機在啟動之後初始化網絡時就使用所配置的計算機名字來初始化其使用的NetBIOS名字。
NetBIOS名字解析方式
從NetBIOS名字查找相應的節點地址(TCP/IP協議中為IP地址)有幾種不同的查找方式。
本地廣播: 在本地網絡上發送廣播,通過廣播某設備的NetBIOS名字,查找其對應的IP地址。廣播方式也能用於注冊自己的NetBIOS名字,例如一台計算機可以通過廣播本機的名字,向其他計算機宣告自己使用了這個NetBIOS名字。
緩沖: 每個支持NetBIOS的計算機中,維護一個NetBIOS名字和相應IP地址的列表,這些對應的名字都有一定的生存期,以便能及時更新。
NetBIOS名字服務器:使用一個名字服務器來提供名字與IP之間的解析任務,這個NetBIOS 名字服務器被稱為NBNS(NetBIOS Name Server),Miscrosoft實現的NBNS名字服務器為WINS(Windows Internet Name Service)。NetBIOS計算機首先要向NBN S登記自己的NetBIOS名字,完成名字的注冊過程。
預定義文件lmhosts:Microsoft Windows能通過查找存放在本地文件lmhos ts中的數據,來識別網絡上NetBIOS名字和IP的關系,這個方式不是NetBIOS名字識別的標准,但它是Microsoft 的實現方式,因此是一種事實標准。
通過DNS和hosts文件解析:DNS服務器和本地hosts文件中存放的數據是用於標准TCP/IP 協議中名字和IP之間轉換使用的方式,但使用其他方式查找不出對應的節點地址時,Microsft Window s中通常也能通過標准的TCP/IP名字解析方式,進行名字和IP的轉換。同樣這也不是NetBIOS的標准,而是Micorsoft 的擴展。
從這五種NetBIOS識別方式,以及其中的不同的名字注冊方式出發,進行不同的組合方式,就構成不同的名字識別策略。在NetBIOS標准中,將使用不同名字識別策略的模式稱為不同的NetBIOS節點類型。
B-node:通過廣播方式來進行注冊和進行識別NetBIOS名字。對於IP協議上的Net BIOS,就需要基於UDP進行廣播,在小網絡上這種方式工作得很好,但當網絡增大時,就會被使用路由器將大網絡分割為幾個小網。在一般情況下路由器不轉發廣播數據,廣播包僅發送到本地網絡。雖然可以配置路由器進行b-node廣播轉發,但是這將使UDP廣播產生大量的無用網絡數據,且名字注冊和解析的難度也增加了。因此對於較大的網絡,這種方式不可取。
P-node(peer-to-peer):對等方式能為識別名字提供非常有效的方法,它使用 NetBIOS名字服務器進行名字的注冊登記和名字識別。因此對於每個NetBIOS計算機,必須指定同樣的NBNS 服務器的IP地址。這樣在NBNS服務器停機或更改了設置(如IP地址等情況)的情況下,名字解析不能完成,就不能進行NetBIOS通信。當然NetBIOS計算機可以配置為使用多個NBNS服務器,以便在其中一個出現問題時使用備份的服務器。
M-node(Mixed):為了正確解析NetBIOS名字,最好綜合使用廣播和名字服務器的方式,這樣的名字識別是一個復合的過程。M-node首先通過B-node廣播方式進行名字識別過程,當廣播方式失敗之後,再使用P-node方式進行查詢。
H-Node(Hybrid):H-node模式也是一種復合模式,它與M-node不同的地方是查找的順序不同。H-node先查找NBNS名字服務器,然後再使用廣播方式進行查詢。
Windows中實際使用的名字識別方式是對標准H-node方式的擴展,Windows系列的計算機將首先檢查緩存中的內容,然後再查看WINS服務器,之後進行廣播,然後將查找lmhosts文件,以及通過hosts和DNS 進行查找。實際進行NetBIOS識別是一個復雜的過程,主要就是由於NetBIOS是一個動態的名字解析方式,每一台計算機都必須注冊自身。
NetBIOS名字識別的過程
與DNS不同,NetBIOS名字使用動態方式進行管理。DNS數據是靜態的,增加和刪除DNS名字需要管理員手工更改配置文件。但NetBIOS要求計算機在網絡上自動注冊其名字,計算機停機之後占用的名字會被釋放,這個過程不需要管理員干預。因為它需要額外的網絡數據以完成名字登記等過程,使得它不適合象Internet這樣的大型網絡。NetBIOS名字識別需要三個步驟:
名字注冊:在NetBIOS啟動時,計算機向整個網絡聲明占用了一個NetBIOS名字,如果已經有其他計算機占用了這個名字,這個計算機就會收到錯誤信息。注冊是通過向網絡廣播聲明信息或向NetBIOS名字服務器登記的方式來實現的。
名字解析:通過廣播或查詢NetBIOS名字服務器來解析一個NetBIOS名字。此外還可以通過lmhosts 文件和DNS輔助解析名字。
名字刪除:在系統關機或提供的工作站服務結束時,會刪除其占用的NetBIOS名。
通過NetBIOS名字和共享的目錄名,就能夠定位Windows計算機上的資源。Microsoft使用U NC的形式來確定一個網絡資源的位置,一個UNC以雙反斜線開始,接下來是提供資源計算機的NetBIOS名字,然後是該台計算機上提供資源的共享名,接下來就是下面的目錄和文件名。如:\\ntserver\share\files ,因此使用一個資源的命令為:
C:\> net use f: \\ntserver\share
C:\> f:
F:\>
上面的net use命令將ntserver上的share資源映射為F:盤。
名字服務器的工作原理
由於b-node廣播會在網絡上產生大量的信息流,尤其是在網絡是由多個子網構成的時候,而使用路由器本來就是要隔離廣播信息,可是為了進行名字解析,就不得不轉發b-node廣播信息包,這就達不到縮減無用網絡流量的目的。
使用名字服務器進行解析就能避免這個問題,客戶通過對名字服務器進行查詢而非廣播,信息流就不必傳播到各個子網上,就能減少廣播數據,減輕網絡的負擔節省帶寬,並且能有效的提高名字解析的速度及准確性。
實際存在的Windows網絡甚至很少利用名字服務器進行名字解析,這就使得這些網絡名字解析存在很大問題,常常會出現不同計算機的網絡鄰居列表不同,根本原因就是廣播方式是沒有保證的,必須轉向名字服務器方式才能解決名字解析問題。
普通NetBIOS計算機和NBNS服務器進行通信有四個不同的通信過程:
名字注冊:每台NetBIOS計算機啟動時,都在名字服務器上注冊。這樣就保持了數據庫的自動更新,並具備動態更新的特性。名字服務器將返回確認信息,以及這個名字的生存期TTL。如果客戶要求的名字已經被占用了,服務器就查詢占用這個名字的客戶是否還在網絡上,以判斷這個名字是否可以再次被使用。這種情況主要發生在Windows計算機死機後重新登記的過程中,因為此時在計算機死機之前,它在名字服務器中登記的名字還存在,如果名字服務器簡單的拒絕提供名字,那麼這個計算機就無法再次獲得自己的名字。只有在真正發生沖突的情況下,客戶的名字注冊才會失敗。
名字更新:由於每個名字都存在一個生存期TTL,那麼當經歷了這個TTL一半的時間,客戶會向服務器進行更新請求,刷新服務器上的TTL設置。
名字釋放:客戶停機時會與服務器通信釋放其占用的NetBIOS名字,其名字TTL超時也會使得服務器釋放這個名字。
名字識別:客戶可以向NBNS服務器發送查詢名字的請求,進行名字解析。
有些情況下,客戶沒有設置支持名字服務器,或者使用的客戶軟件還不支持名字服務器進行解析,可以通過設置一個 WINS代理,由它來在廣播數據和查詢名字服務器之間進行轉換,它可以幫助客戶注冊並回應客戶的廣播查詢。