有關網上鄰居的問題,問的人一直比較多,在理解上存在的誤區也普遍較為嚴重。鑒於Microsoft的NETBIOS文檔不是很細致,筆者四處收集了一些相關資料加上自己的實踐經驗寫了這個系列,希望能對大家有所幫助。
本來想為了增加可讀性,把這個系列寫成問答的形式,不過一時之間腦袋裡也編不出這麼多的問題,還是按部就班先感性的對微軟的浏覽服務作一大致介紹,然後再深入剖析NETBIOS的具體工作機理,大家要是有什麼問題,可以提出來我們一起討論。
一、微軟網絡浏覽過程簡介
在“Windows NT系統管理技術內幕”一書中,講到了一個非常具有代表性的問題,我把它摘抄了下來:
問:什麼情況下會導致在網絡鄰居中計算機能看見卻無法訪問或可以訪問卻看不見?請選擇最佳答案:
A.你的網絡存在物理問題,比如網線
B.作為域主浏覽器的Windows NTserver的浏覽服務壞了
C.Windows NTserver網卡有問題
D.你的網絡沒有問題,用戶描述的是正常的微軟浏覽現象
正確答案,書上的解釋:D。微軟的網絡浏覽可能在使用中出現"中斷",而實際上它們並沒有中斷, 這種誤解是由於用戶對微軟網絡浏覽的處理過程不熟悉造成的。
就象同學們經常在抱怨的“為什麼別人的網上鄰居可以用,我的卻不行?”“為什麼有時候可以浏覽,有時候卻無法浏覽網絡?”解鈴還須系鈴人,讓我們一起去看看微軟的網絡浏覽到底是如何實現的。鑒於大家可能對NT的“域”概念還不甚了解,出現浏覽故障的也多為98的機子,我將以98的“工作組模式”為大家講解
二、網絡浏覽
1.什麼是浏覽列表(Browsing List)
在微軟網絡中,用戶可以在浏覽列表裡看到整個網絡(何指?子網還是廣播域?大家可以考慮考慮)上所有的計算機。當你通過網上鄰居窗口打開整個網絡時,你將看到一個工作組列表,再打開某個工作組,你將看到裡面的計算機列表(也可在 DOS方式下用net view /domain:workgroupname命令得到),這就是我們所說的 Browsing List。工作組從本質上說就是共享一個浏覽列表的一組計算機,所有的工作組之間都是對等的,沒有規定不可以讓所有的計算機同處於一個工作組中。
2.浏覽列表在哪裡
有人說:網上鄰居裡的計算機列表是廣播查詢得來的。可有人舉反例說:我的同學都關機了,可我還是能在網上鄰居裡看到它,應該是從HUB或交換機之類較為固定的設備的緩存中取得的。其實他們都只說對了一個方面,把他們二人的說法結合起來就是正確答案了--- 浏覽列表是通過廣播查詢浏覽主控服務器,由浏覽主控服務器提供的。
3.浏覽主控服務器又是什麼
浏覽主控服務器是工作組中的一台最為重要的計算機,它負責維護本工作組中的浏覽列表及指定其他工作組的主控服務器列表,為本工作組的其他計算機和其他來訪本工作組的計算機提供浏覽服務,每個工作組都為會每個傳輸協議選擇一個浏覽主控服務器,而我們經常遇到的無法浏覽網絡的錯誤大多是因為你所處的工作組沒有浏覽主控服務器而造成的。你可以在一個工作組中用NBTSTAT -a computername 命令找出使用NBT協議的浏覽主控服務器,它的標識是含有\\_MSBROWSE_ 名字段。
4.浏覽主控服務器是如何指定的
缺省情況下,win98工作組中的浏覽主控服務器是該工作組中第一台啟用文件及打印機共享功能的計算機,也允許手工將一台win計算機配置為浏覽主控服務器(方法會在後面講述網絡配置時具體介紹,但由於浏覽主控服務器需要維護動態浏覽列表,性能會受影響),如果一個工作組中有多台計算機配置了這個選項,或是當前的浏覽主控服務器關閉了系統,又沒有其他計算機啟用主控設置時,就要進行主控浏覽器的選舉。
5.如何通過浏覽器選舉產生浏覽主控服務器
關於浏覽器的選舉報文,不太好抓包,我就只好按書上的東西來講述了.其實過程很簡單,首先由一台計算機發送一個選舉臨界報文,該報文包含了來自發送計算機的信息(操作系統,版本及NET名等),選舉報文向網絡中廣播,工作組中的每一台計算機都會用自身信息與選舉報文進行優先級比較,主要是操作系統起主要作用,記得好像是NT Server>NT Workstation>Win98>WFWG,反正到最後是那個自身條件最好的成為新的浏覽主控服務器.
6.整個網絡浏覽的過程是怎樣的
當一台win98進入網絡時,如果它帶有服務器服務(啟用了文件及打印機共享)會向網絡廣播宣告自己的存在,而浏覽主控服務器會取得這個宣告並將它放入自己維護的浏覽列表中;而沒有在相應協議上綁定文件及打印機共享的計算機則不會宣告,因而也就不會出現在網絡鄰居裡了。當客戶計算機想獲得需要的網絡資源列表時,首先會廣播發出浏覽請求,浏覽主控服務器收到請求後,如果請求的是本組的浏覽列表,則直接將客戶所需的資源列表發回;如果請求的是其它工作組的浏覽列表,浏覽主控服務器會根據本身Browsing List中的記錄找到相應工作組的主控浏覽器返回給用戶,用戶可從那裡得到它想要的浏覽列表。至於如何去和另一台計算機共享交換資源,就不是我們這裡要討論的問題了。
明白了網絡浏覽的原理,下面我給大家講一個有用的應用,現在很多同學出於安全的考慮都不太歡迎陌生人通過網上鄰居訪問自己的機子,可有時下部電影又需要給認識的同學共享出來,因而還不能刪除文件及打印機共享服務。怎麼辦?有些人給共享名加個$,以達到隱藏的效果,可這用DOS下的net share是可被看到的;有些人給共享加上密碼,可聽說這也是有辦法破解的,而且很容易激起“黑客同志”的好奇心。有沒有辦法將自己的機器在網絡鄰居裡隱藏起來呢?而對於認識的同學可以讓他用\\IP 來訪問。想對了,關鍵就是要阻止自己的機器向網絡中去宣告自己,而且我知道我們其中的一些
人已經將此變成了現實,至於方法嘛,就不要來問我了。
注:因為有關win98浏覽服務的資料很少,涉及的書籍也多為以NT的“域”模型進行介紹,因而我只能根據自己的理解結合netxray的實踐來測試,細節部分難 免有錯,歡迎大家指正。
7.在我的網上鄰居裡為什麼有些機子訪問不了
如果微軟的網上鄰居真能做到所見即所得,相信抱怨它的人不會象現在這麼多,可通過前面對浏覽服務的介紹,大家已經知道這是不可能的,因為浏覽列表的獲得不是通過訪問其中每一台機子得到的,很多時候網絡中的計算機並不能正確更新浏覽列表。當一台計算機正常關機時,它會向網絡發出廣播宣告,使浏覽主控服務器及時將它從浏覽列表中刪除;而非正常關機後,浏覽列表裡仍會把該條目保持很長一段時間(NT下是45分鐘),這就是我們仍能在網絡鄰居裡看到它的原因.而98的穩定性是眾所周知的 ----在還沒來得及關機前就已經崩潰了^-^
SMB(Server Message Block)協議在NT/2000中用來作文件共享,在NT中,SMB運行於NBT(NetBIOS over TCP/IP)上,使用137,139(UDP),139(TCP)端口。在2000中,SMB可以直接運行在tcp/ip上,而沒有額外的NBT層,使用TCP 445端口。因此在2000上應該比NT稍微變化多一些。
可以在“網絡連接/屬性/TCPIP協議/屬性/高級/WINS中設置啟用或者禁用NBT(NetBIOS over TCP/IP)。
當2000使用網絡共享的時候,就面臨著選擇139或者445端口了。下面的情況確定會話使用的端口:
1、如果客戶端啟用了NBT,那麼連接的時候將同時訪問139和445端口,如果從445端口得到回應,那麼客戶端將發送RST到139端口,終止這個端口的連接,接著就從445端口進行SMB的會話了;如果沒有從445端口而是從139得到回應,那麼就從139端口進行會話;如果沒有得到任何回應,那麼SMB會話失敗。
2、如果客戶端禁用了NBT,他就將只從445端口進行連接。當然如果服務器(開共享端)沒有445端口進行SMB會話的話,那麼就會訪問失敗了,所以禁用445端口後,對訪問NT機器的共享會失敗。
3、如果服務器端啟用NBT,那麼就同時監聽UDP 137、138端口和TCP139,445。如果禁用NBT,那麼就只監聽445端口了。
所以對於2000來說,共享問題就不僅僅是139端口,445端口同樣能夠完成。
三、關於空會話
The NULL session,關於空會話
NULL會話(空會話)使用端口也同樣遵循上面的規則。NULL會話是同服務器建立的無信任支持的會話。一個會話包含用戶的認證信息,而NULL會話是沒有用戶的認證信息,也就好比是一個匿名的一樣。
沒有認證就不可能為系統建立安全通道,而建立安全通道也是雙重的,第一,就是建立身份標志,第二就是建立一個臨時會話密匙,雙方才能用這個會話進行加密數據交換(比如RPC和COM的認證等級是PKT_PRIVACY)。不管是經過NTLM還是經過Kerberos認證的票據,終究是為會話創建一個包含用戶信息的令牌。(這段來自Joe Finamore)
根據WIN2000的訪問控制模型,對於空會話同樣需要提供一個令牌。但是空會話由於是沒有經過認證的會話,所以令牌中不包含用戶信息,因此,建立會話雙方沒有密匙的交換,這也不能讓系統間發送加密