名稱、實體與存取點#
分散式系統中的名稱(name)是一串位元或字元,用來指涉一個實體(entity)。實體幾乎可以是任何東西:主機、印表機、磁碟、檔案等資源,也包括行程、使用者、信箱、網頁、視窗、訊息、網路連線等。
實體可以被操作——例如印表機提供列印文件、查詢列印工作狀態等操作;網路連線提供收發資料、設定服務品質參數等操作。要操作實體,就必須先存取它,這需要一個存取點(access point):
- 存取點本身也是一種(特殊的)實體。
- 存取點的名稱稱為位址(address);實體的存取點位址也直接稱為該實體的位址。
- 一個實體可以有多個存取點。類比:電話是「人」這個實體的存取點,電話號碼就是位址;一個人可以有多支電話號碼。
- 分散式系統中典型的存取點是執行特定伺服器的主機,位址通常是「IP 位址 + 埠號」的組合(即伺服器的傳輸層位址)。
- 實體的存取點會隨時間改變:行動電腦換地點常被指派新 IP;人搬家換電話號碼;換工作或換 ISP 就換電子郵件位址。
為什麼不能拿位址當名稱#
位址其實只是一種特殊名稱:它指涉實體的存取點。既然存取點與實體緊密關聯,直接拿位址當實體的常用名稱似乎很方便——但實務上幾乎不這麼做,因為這種命名非常不靈活、也不友善:
- 存取點會變、也會被重新指派。系統重組後,某伺服器改跑在另一台主機上,舊主機可能被派給完全不同的伺服器。若用位址指涉實體,存取點一變或一被重新指派,引用立刻失效。
- 多存取點時無從取捨。許多組織把 Web 服務分散在多台伺服器上;若用伺服器位址來指涉整個 Web 服務,根本不清楚該選哪個位址才「最好」。
因此更好的做法是讓服務有一個獨立於伺服器位址的名稱。這種與位址無關的名稱稱為**位置無關(location independent)**的名稱,使用起來遠比位址靈活。
真識別碼#
另一類需要特別對待的名稱,是用來唯一識別實體的名稱。一個**真識別碼(true identifier)**具備以下性質(Wieringa 與 de Jonge,1995):
- 一個識別碼至多指涉一個實體。
- 每個實體至多被一個識別碼指涉。
- 識別碼永遠指涉同一個實體——永不重用。
有了識別碼,判斷「兩個引用是否指同一實體」只需比較兩個識別碼是否相等。若使用一般的、非唯一的名稱(如「John Smith」無法唯一指涉某個人),這種測試並不成立。
位址不能當識別碼,因為位址可能被重新指派給別的實體。電話號碼看似穩定,但會隨時間轉手——Bob 新開的麵包店可能長期接到打給 Alice 舊古董店的電話。這正是「可重用的名稱不是識別碼」的典型後果。
位址與識別碼是兩類用途截然不同的重要名稱,在許多電腦系統中都只以機器可讀的位元字串表示:例如 Ethernet 位址本質上是 48 位元的隨機字串,記憶體位址則是 32 或 64 位元字串。
人性化名稱#
第三類名稱是為人設計的人性化名稱(human-friendly names),一般以字元字串表示:UNIX 檔名可長達 255 字元、完全由使用者定義;DNS 名稱則是相對簡單、不分大小寫的字元字串。
名稱解析與訊息路由#
有了名稱、識別碼、位址,本章的核心問題就是:如何把名稱與識別碼解析成位址? 名稱解析與訊息路由之間常有密切關係:
- 命名系統維護名稱到位址的繫結(name-to-address binding),最簡形式就是一張(名稱, 位址)配對表。
- 但在橫跨大型網路、需命名大量資源的分散式系統中,集中式的表格行不通。
- 常見做法是把名稱分解成多個部分(如
ftp.cs.vu.nl),透過遞迴查找各部分完成解析。
範例:ftp.cs.vu.nl 的逐段解析
用戶端要找名為 ftp.cs.vu.nl 的 FTP 伺服器位址時,先解析 nl 找到負責所有以 nl 結尾名稱的伺服器 NS(nl),把剩下的名稱交給它;NS(nl) 再把 vu 解析到負責 vu.nl 結尾名稱的 NS(vu.nl),由它處理剩餘的 ftp.cs。整個解析請求的路由過程為:
NS(.) → NS(nl) → NS(vu.nl) → ftp.cs.vu.nl 的位址其中 NS(.) 是能回傳 NS(nl) 位址的伺服器,也就是根伺服器(root server);最終由 NS(vu.nl) 回傳 FTP 伺服器的實際位址。值得注意的是,名稱解析與訊息路由之間的界線正逐漸模糊。
接下來的小節將依序討論三類命名系統:先看識別碼如何解析成位址(其中會看到名稱解析與訊息路由幾乎無法區分的例子),再看人性化名稱,最後是描述式名稱(以一組名稱描述實體)。