在Whois++結構中,由客戶負責進行網狀漫游,因為每個主機僅通知客戶與它相鄰的主機是什麼,這個協議倒不是復雜,客戶打開到一台服務器的連接,發送查詢請求,接收應答,關閉連接。客戶在接收到應答後進行分析,然後決定下一個聯系哪一台主機。這樣使得客戶必須有一種算法使得客戶查詢的主機沒有重復的,而且能夠盡快找到要找的主機。
每個Whois++客戶應該被配置為自動和一個特定的Whois++服務器聯系。這個默認的服務器可能有這樣那樣的要求,但是最基本的要求就是最好是本地服務器。
在接收到服務器的應答後,如果命中數大於0,則把結果返回用戶。如果客戶被要求和一個或多個服務器進行通信,客戶要能夠知道這些服務器指針是什麼。
查詢的方法有兩種一種是擴充查詢,一種是使用服務器目錄。如果命中數為0,或用戶希望擴展查詢,客戶機應該進行擴展查詢,它只需要向服務器發送下面兩種消息即可:'polled-by'或'polled-for',客戶可以向新指定的主機進行擴充查詢。
客戶必須保留查詢過的服務器,不要查詢過的服務器再查詢一次。
3.1.1. 優化網絡
如果A希望經常使用B的WHOIS++服務器,A會希望通過創建一個本地索引服務器將B的服務器成為本地可用的。當A的客戶通過擴充查詢希望查詢B時,解析的速度就會快得多。
Whois++網絡已經不是一個樹了,B和F之間已經建立了直接通道。這樣查詢的速度就快得多了,不用在查詢完B後查詢A,再查詢C,最後再查詢F。因為B和F已經建立了聯結,所以,當客戶只需要查詢其中之一的數據時需要指時要的是哪一個,不然會返回B和F結點的內容。在客戶方還可以使用黑名單方法將查詢中的一些服務器屏蔽掉,因為訪問這些服務器代價太大或其它原因不願意讓用戶訪問這些服務器。
3.1.2. 客戶使用的算法
Query := 需要查詢的數據;
QueriedServers := {};
AnswerList := {};
OriginalServers := { 客戶所知的服務器 };
while OriginalServers非空 do:
ServerList = OriginalServers;
while ServerList非空 do:
Server := ServerList[1];
if Server未包括在QueriedServers中 then do:
send Query to Server;
Answer := 從Server返回的響應;
將ServersToAsk附加到ServerList;
將Server從ServerList刪除;
將Answers附加到AnswerList;
end;
done;
if 應該擴充查詢 then do:
ServerList := OriginalServers;
OriginalServers := {};
while ServerList非空 do:
Server := ServerList[1];
發送Polled-For-Query到Server;
Answer := 從Server返回的響應;
將Answer附加到OriginalServers;
將Server從ServerList刪除;
end;
done;
done;
顯示AnswerList;
3.2. 服務器目錄
第二個尋找正確服務器的方法是使用一個單獨的服務,我們稱為服務器目錄。服務器目錄實際上是一個特殊的Whois++服務器。這個服務器內包括了所有服務器上信息,用戶在查詢前先查詢些服務器,由此服務器指出應該查詢哪一個服務器,未來的技術可能允許客戶選擇服務器,而不是由服務器。
3.2.3. 例子
下面是一個客戶與服務器聯系的例子。
> % 220-This is services.bunyip.com running Bunyip-Whois++: DIGGER 1.0.5
> % 220 Ready to go!
< template=serverhandle and bunyip
> % 200 Search is executing
> # FULL SERVERHANDLE BUNYIPCOM01 BUNYIPCOM01
> SERVER-HANDLE: BUNYIPCOM01
> HOST-NAME: services.bunyip.com
> HOST-PORT: 63
> ADMIN-NAME: Patrik Faltstrom
> ADMIN-EMAIL: [email protected]
> ORGANIZATION-NAME: Bunyip Information Systems Inc.
> DESCRIPTION: USER information
> DESCRIPTION: Directory of Servers
> DESCRIPTION: Toplevel Index server in the world
> MENU-ITEM: World (Bunyip Information Systems inc)
> CITY: Montreal
> COUNTRY: Canada
> # END
>
> # FULL SERVERHANDLE BUNYIPCOM01 BUNYIPCOM02
> SERVER-HANDLE: BUNYIPCOM02
> HOST-NAME: services.bunyip.com
> HOST-PORT: 7778
> ADMIN-NAME: Patrik Faltstrom
> ADMIN-EMAIL: [email protected]
> ORGANIZATION-NAME: Bunyip Information Systems Inc.
> DESCRIPTION: USER information
> MENU-ITEM: Bunyip Information Systems
> CITY: Montreal
> COUNTRY: Canada
> # END
>
> % 226 Transaction complete
> % 203 Bye, bye
4. 緩沖
客戶可以緩沖它從服務器取得的信息。客戶自行選擇緩沖多長時間更新。
4.1. 緩沖Whois++服務器主機名
下面是一個緩沖算法:
response := 從服務器A獲得的servers-to-ask響應
IP-address := 尋找DNS中response.hostname的IP地址
連接IP地址上的端口
if 連結失敗 {
連結服務器目錄服務器
查詢主機
response := 由服務器目錄服務器獲得的響應
IP-address := 尋找DNS中response.hostname的IP地址
connect to ip-address at port response.portnumber
if 連結失敗 {
以錯誤消息返回
}
}
查詢這個新服務器
5. 安全問題
客戶應該維護一個黑名單,因為在網絡上可能有假的Whois++服務器,一旦發現這樣的服務器,應該把它加入黑名單,以後不再查詢。因為在擴充查詢時比較費時,應該允許用戶在操作進行中退出。