Networking

如何使用卓悅?

  • July 11, 2018
  1. 首先,Bonjour 到底做了什麼(請閱讀我下面寫的猜測)?

在這裡,我發現 Bonjour 可以自動發現 IP 網路上的電腦、設備和服務。但我認為它不僅“發現 IP 網路上的設備”,還通過將 IP 地址分配給執行 Bonjour 的設備來創建 IP 網路。我對嗎? 2. 我仍然懷念本質。它是否以下列方式工作?首先,我以物理方式連接設備(例如筆記型電腦),以便它們可以相互通信。然後,假設在一些筆記型電腦上我執行 Bonjour,然後,這些筆記型電腦會自動為它們分配 IP 地址。因此,筆記型電腦(執行 Bonjour 的地方)建構了一個 IP 網路。它以這種方式工作嗎? 3. 或者可能是執行 Bonjour 的電腦不被視為一項服務,並且它不會僅僅因為 Bonjour 在這台電腦上執行而廣播自己。我的意思是電腦上執行的應用程序需要使用 Bonjour 進行廣播。因此,是應用程序自己廣播(而不是電腦)並且它不是自動完成的(應用程序需要明確地廣播自己)。這樣對嗎? 4. 我的應用程序究竟如何廣播自己?我可以使用命令行註冊服務(以便所有使用 Bonjour 的應用程序都知道出現了新服務)嗎? 5. 此外,我想要一個使用 Bonjour 創建的 IP 網路的應用程序。為此,我的應用程序需要知道網路中存在哪些設備/服務。更詳細地說,我的應用程序需要有一個服務列表。列表中的每個服務都應該有一個名稱、執行它的 IP 地址和應用程序使用的埠。**Bonjour 能否以某種方式提供此資訊?**如果是這樣,它究竟是如何工作的。我的程序如何從 Bonjour 獲取這些資訊?我的程序可以讀取一些由 Bonjour 創建並包含上述資訊的文件嗎?我可以在命令行中使用一些命令來檢索這些資訊嗎? 6. 我對從文件、環境變數或命令行中的命令訪問有關服務的資訊特別感興趣。這些選項在我看來是最簡單的!因為在這些情況下,我不需要使用任何其他庫來通過特定程式語言與 Bonjour 進行通信。

PS如果我的問題不清楚,請提出問題。我將嘗試以更清晰的方式提出我的問題。

PPS我使用的是 Windows 7

補充:我打算用 PHP 編寫我的應用程序。每台電腦都應該執行 Apache Web 伺服器。我想使用 Bonjour 幫助電腦發現彼此(電腦在本地網路中工作)。

  1. 是的。Stuart Cheshire 是 Apple Rendezvous/Bonjour 的創建者和主要維護者,他也是 IETF ZeroConf 工作組的聯合主席,並撰寫了 O’Reilly 關於零配置網路的書,他將 Bonjour 描述為“三-腿凳”,腿在哪裡:

  2. IPv4(和 IPv6)鏈路本地定址

  3. 多播名稱解析 (mDNS)

  4. DNS 服務發現 (DNS-SD)IETF ZeroConf 工作組和 Apple 都認為鏈路本地定址,尤其是 IPv4 鏈路本地定址(169.254.0.0/16地址)是 ZeroConf/Bonjour 的一部分,儘管鏈路本地定址比其他兩個“凳子腿”早了好幾年。

請注意,由於即使沒有安裝 Apple 的 Bonjour for Windows 軟體,Windows 也已經支持自動連結本地定址,因此許多 Windows 使用者並不認為 IPv4 連結本地定址是 Bonjour/ZeroConf 的一部分。 2. 是的。預設情況下,Mac 和 Windows 機器在配置為 DHCP 但沒有可用的 DHCP 伺服器時執行 IPv4 鏈路本地定址。安裝了 Avahi(或可能其他 ZeroConf 實現)的 Linux 和 BSD 機器也將執行此操作。 3. 如果一台電腦正在執行 Bonjour,它的主機名會通過 mDNS 在 LAN 上發布。如果您的機器名稱是“Alice”,它將Alice.local通過 mDNS。在同一 LAN(特別是在同一個本地鏈路多播域)上的另一台電腦(我們稱之為“Bob”)上,您應該能夠簡單地鍵入ping Alice.local,並且 Bob 應該進行 mDNS 查找Alice.local以發現 Alice 的 IP 地址( es),並 ping (其中一個) 它返回的地址。

但請注意,Bonjour 區分主機名和服務名。例如,如果您有兩台單獨的 USB 列印機,比如說“HP”和“Canon”,它們連接到 Alice,並且 Alice 充當lpr它們兩者的列印伺服器,它們都可以顯示為自己的服務,它映射回Alice.local主機。

他們的服務名稱將向使用者顯示為“HP”和“Canon”,而沒有提及 Alice。在幕後,它們被稱為HP._printer._tcp.localand Canon._printer._tcp.local,對這些服務名稱的 DNS-SD 查找將顯示這些服務Alice.local在兩個不同的 TCP 埠上可用。

所以是的,應用程序必須通知 Bonjour 守護程序(mDNSResponder在 Apple 的實現中呼叫)他們有他們想要宣傳的服務。macOS 具有自動處理原生服務不支持 Bonjour 的服務廣告的機制。例如,macOSsshd是 OpenSSH,它不直接支持 Bonjour,但 macOS 負責ssh通過 Bonjour 宣傳該服務,這樣您就可以ssh username@Alice.local從 LAN 上的其他機器訪問。 4. 在 macOS 上,有一個“dns-sd”命令行工具可以使用以下語法註冊服務:

dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]  
# (Register a service)

例如:

dns-sd -R MyWebsite _http._tcp local 80

如果它包含在適用於 Windows 的 Bonjour 或適用於 Windows 的 Bonjour SDK 中,或者如果您可以從 Apple 的mDNSResponder開源項目為 Windows 編譯它,我不會感到驚訝。Google搜尋dns-sd.exe,我看到這樣的事情存在。我不確定我是否會為它下載一個二進製文件。相反,我會嘗試從上面提到的軟體包之一中獲取它,或者自己從 mDNSResponder 項目源中編譯它。 5. 您還可以使用dns-sd命令行工具瀏覽和查找服務。以下是查找本地 Web 服務的範例:

使用以下命令瀏覽本地 Web 服務-B

$ dns-sd -B _http._tcp local  
Browsing for _http._tcp.local  
Timestamp     A/R Flags if Domain                    Service Type              Instance Name  
16:30:59.870  Add     3  6 local.                    _http._tcp.               My Cool Web App  
16:30:59.871  Add     3  6 local.                    _http._tcp.               Someone Else's Web Service  
16:30:59.871  Add     3  6 local.                    _http._tcp.               A Third One  
^C

使用以下命令查找我想要的“My Cool Web App” -L

$ dns-sd -L "My Cool Web App" _http._tcp local  
Lookup My Cool Web App._http._tcp.local  
16:31:52.678  My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)  
^C  

使用以下命令查詢 MyWebServer.local 的 IP 地址-Q

$ dns-sd -Q MyWebServer.local  
Timestamp     A/R Flags if Name                             T   C Rdata  
16:32:40.786  Add     2  6 MyWebServer.local.               1   1 169.254.45.209  
^C  

請注意,在這些範例中,您必須Ctrl-C退出該dns-sd工具。否則它將永遠保持打開狀態,持續觀察網路並報告您發出的查詢結果的任何變化(例如網路伺服器在網路上來來往往,而您坐著-B瀏覽查詢打開)。我發現由於這個和其他原因,該dns-sd工具不太適合從腳本呼叫。畢竟,您可能想看看您首選語言的 ZeroConf 庫。

要回答您的其他問題之一,我不知道有任何 ZeroConf 實現允許您僅通過讀取/寫入文件來執行查詢並獲得結果。大多數使用 Bonjour 的應用程序都是通過直接呼叫 API(C/C++/Obj-C/Swift 應用程序)或通過特定於語言的庫(解釋/腳本語言)來實現的。

引用自:https://serverfault.com/questions/118652