Làm thế nào để sử dụng Bonjour?


26
  1. Đầu tiên, chính xác thì Bonjour làm gì (những lời cầu xin đọc những dự đoán của tôi được viết dưới đây)?
    Ở đây tôi phát hiện ra rằng Bonjour cho phép tự động phát hiện ra máy tính, thiết bị và dịch vụ trên mạng IP. Nhưng tôi nghĩ rằng nó không chỉ "phát hiện ra các thiết bị trên mạng IP" mà nó còn tạo ra một mạng IP bằng cách gán địa chỉ IP cho các thiết bị nơi Bonjour đang chạy. Tôi có đúng không

  2. Và tôi vẫn nhớ bản chất. Nó hoạt động theo cách sau? Đầu tiên tôi kết nối các thiết bị (ví dụ: máy tính xách tay) để chúng có thể giao tiếp với nhau. Sau đó, giả sử, trên một số máy tính xách tay tôi có Bonjour đang chạy và do đó, những máy tính xách tay này tự gán địa chỉ IP cho chúng theo cách tự động. Vì vậy, máy tính xách tay (nơi Bonjour đang chạy) xây dựng một mạng IP. Nó hoạt động theo cách này?

  3. Hoặc có thể máy tính đang chạy Bonjour không được coi là một dịch vụ và nó không tự phát sóng chỉ vì Bonjour đang chạy trên máy tính này. Ý tôi là các ứng dụng chạy trên máy tính cần sử dụng Bonjour để tự phát sóng. Vì vậy, đó là các ứng dụng phát sóng chính chúng (không phải máy tính) và nó không được thực hiện tự động (ứng dụng cần phát sóng chính chúng một cách rõ ràng). Đúng không?

  4. Làm thế nào chính xác ứng dụng của tôi có thể phát sóng chính nó? Tôi có thể sử dụng dòng lệnh để đăng ký một dịch vụ (để tất cả các ứng dụng sử dụng Bonjour đều biết rằng một dịch vụ mới đã xuất hiện) không?

  5. Hơn nữa, tôi muốn có một ứng dụng sử dụng mạng IP được tạo bởi Bonjour. Vì vậy, ứng dụng của tôi cần biết thiết bị / dịch vụ nào có trong mạng. Để biết thêm chi tiết, ứng dụng của tôi cần phải có một danh sách các dịch vụ. Mỗi dịch vụ trong danh sách nên có một tên, địa chỉ IP nơi nó đang chạy và cổng được ứng dụng sử dụng. Bonjour có thể cung cấp thông tin này theo một cách nào đó không? Nếu nó là trường hợp, làm thế nào chính xác nó hoạt động. Làm thế nào chương trình của tôi có thể nhận được thông tin này từ Bonjour? Chương trình của tôi có thể đọc một số tệp được tạo bởi Bonjour và chứa thông tin được đề cập ở trên không? Tôi có thể sử dụng một số lệnh trong dòng lệnh để lấy thông tin này không?

  6. Tôi có một mối quan tâm đặc biệt trong việc truy cập thông tin về các dịch vụ từ các tệp, biến môi trường hoặc các lệnh trong dòng lệnh. Những lựa chọn này đối với tôi là đơn giản nhất! Vì trong những trường hợp này, tôi không cần sử dụng bất kỳ thư viện bổ sung nào để giao tiếp với Bonjour từ một ngôn ngữ lập trình cụ thể.

PS Pleas đặt câu hỏi nếu có gì đó không rõ ràng trong câu hỏi của tôi. Tôi sẽ cố gắng xây dựng câu hỏi của tôi một cách rõ ràng hơn.

PPS Tôi sử dụng Windows 7 .

THÊM: Tôi dự định viết các ứng dụng của mình bằng PHP. Mỗi máy tính nên chạy một máy chủ web Apache. Và tôi muốn sử dụng Bonjour để giúp máy tính khám phá lẫn nhau (các máy tính đang hoạt động trong một mạng cục bộ).

Câu trả lời:


54
  1. Vâng. Stuart Cheshire, người sáng tạo và là người duy trì chính của Rendezvous / Bonjour tại Apple, người đồng chủ trì nhóm làm việc IETF ZeroConf, và đã viết cuốn sách O'Reilly trên Mạng cấu hình Zero, đã mô tả Bonjour là một người ba phân có chân, nơi chân là:

    1. Địa chỉ liên kết cục bộ IPv4 (và IPv6)
    2. Độ phân giải tên Multicast (mDNS)
    3. Khám phá dịch vụ DNS (DNS-SD)

    Nhóm làm việc của IETF ZeroConf và Apple đều coi việc đánh địa chỉ liên kết cục bộ, đặc biệt là địa chỉ liên kết cục bộ IPv4 ( 169.254.0.0/16địa chỉ) là một phần của ZeroConf / Bonjour, ngay cả khi địa chỉ liên kết cục bộ được vận chuyển nhiều năm trước hai nhánh khác của phân.

    Lưu ý rằng vì Windows đã hỗ trợ địa chỉ liên kết cục bộ tự động ngay cả khi không cài đặt phần mềm Bonjour cho Windows của Apple, nhiều người dùng Windows không nghĩ rằng địa chỉ liên kết cục bộ IPv4 là một phần của Bonjour / ZeroConf.

  2. Vâng. Theo mặc định, máy Mac và Windows sẽ thực hiện đánh địa chỉ liên kết cục bộ IPv4 nếu chúng được cấu hình cho DHCP nhưng không có máy chủ DHCP. Các máy Linux và BSD có cài đặt Avahi (hoặc có thể là các triển khai ZeroConf khác) cũng sẽ làm điều này.

  3. Nếu một máy tính đang chạy Bonjour, tên máy chủ của nó được xuất bản trên mạng LAN thông qua mDNS. Nếu tên máy của bạn là Drake Alice, nó sẽ Alice.localthông qua mDNS. Từ một máy tính khác (hãy gọi nó là Miền Bob Bob) trên cùng một mạng LAN (cụ thể, trên cùng một miền phát đa hướng liên kết cục bộ), bạn có thể chỉ cần nhập ping Alice.localvà Bob nên thực hiện tra cứu mDNS Alice.localđể khám phá địa chỉ IP của Alice ( es) và ping (một trong) địa chỉ mà nó nhận được.

    Tuy nhiên, xin lưu ý rằng Bonjour phân biệt giữa tên máy chủ và tên dịch vụ. Ví dụ: nếu bạn có hai máy in USB riêng biệt, giả sử là HP HP và và Canon Canon, được kết nối với Alice và Alice đóng vai trò là một lprmáy chủ in cho cả hai, họ có thể hiển thị như một dịch vụ riêng của họ , bản đồ trở lại Alice.locallà máy chủ lưu trữ.

    Tên dịch vụ của họ sẽ hiển thị cho người dùng với tên là HP HP và và Canon Canon mà không đề cập đến Alice. Đằng sau hậu trường, chúng sẽ được biết đến HP._printer._tcp.localCanon._printer._tcp.local, và tra cứu DNS-SD trên các tên dịch vụ đó sẽ cho thấy các dịch vụ đó khả dụng Alice.localtrên hai cổng TCP khác nhau.

    Vì vậy, có, các ứng dụng phải thông báo cho trình nền Bonjour (được gọi là mDNSRespondertrong triển khai của Apple) rằng họ có các dịch vụ mà họ muốn quảng cáo. macOS có các cơ chế để tự động xử lý quảng cáo dịch vụ cho các dịch vụ cũ mà Bonjour không biết. Chẳng hạn, macOS sshdlà OpenSSH, không hỗ trợ trực tiếp Bonjour, nhưng macOS chăm sóc quảng cáo sshdịch vụ qua Bonjour để bạn có thể ssh username@Alice.localtừ các máy khác trong mạng LAN.

  4. Trên macOS, có một công cụ dòng lệnh "dns-sd" có thể đăng ký một dịch vụ bằng cú pháp này:

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

    Ví dụ:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Tôi sẽ không ngạc nhiên nếu nó được bao gồm trong Bonjour cho Windows hoặc Bonjour SDK cho Windows hoặc nếu bạn có thể biên dịch nó cho Windows từ dự án nguồn mở mDNSResponder của Apple . Googling cho dns-sd.exe, tôi thấy một điều như vậy tồn tại. Tôi không chắc chắn tôi sẽ chỉ tải xuống một nhị phân cho nó. Thay vào đó, tôi sẽ cố gắng lấy nó từ một trong các gói được đề cập ở trên hoặc tự biên dịch nó từ các nguồn dự án mDNSResponder.

  5. Bạn cũng có thể sử dụng dns-sdcông cụ dòng lệnh để duyệt các dịch vụ và tìm kiếm chúng. Đây là một ví dụ về việc tìm kiếm một dịch vụ web địa phương:

    Duyệt các dịch vụ web địa phương với -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
    

    Tra cứu cái tôi muốn, "Ứng dụng web tuyệt vời của tôi", với -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  
    

    Truy vấn địa chỉ IP cho MyWebServer.local, với -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  
    

    Lưu ý trong các ví dụ này là bạn phải Ctrl-Cra khỏi dns-sdcông cụ. Nếu không, nó sẽ mở mãi mãi, liên tục xem mạng và báo cáo bất kỳ thay đổi nào trong kết quả của truy vấn bạn đã đưa ra (chẳng hạn như máy chủ web đến và đi trên mạng, trong khi bạn ngồi với một -Btruy vấn duyệt mở). Tôi đã thấy rằng vì lý do này và các lý do khác, dns-sdcông cụ này không phù hợp để được gọi từ một kịch bản. Bạn có thể muốn xem xét tất cả các thư viện ZeroConf cho ngôn ngữ ưa thích của bạn.

Để trả lời một trong những câu hỏi khác của bạn, tôi không biết về bất kỳ triển khai ZeroConf nào cho phép bạn thực hiện các truy vấn và nhận kết quả chỉ bằng cách đọc / ghi tệp. Hầu hết các ứng dụng sử dụng Bonjour đều làm như vậy bằng cách gọi API, trực tiếp (ứng dụng C / C ++ / Obj-C / Swift) hoặc thông qua thư viện dành riêng cho ngôn ngữ (ngôn ngữ diễn giải / kịch bản).


Giải thích tốt nhất về Bonjour / Zeroconf tôi đã thấy. Bạn nên đóng góp một số cho bài viết trên wikipedia :)
Kamil Kisiel

Điều này khá hoàn chỉnh nhưng nếu bạn muốn mở rộng về cách sử dụng bản ghi DNS, vui lòng lấy cắp từ serverfault.com/questions/18565/
Kẻ

4

Đầu tiên, chính xác thì Bonjour làm gì (những lời cầu xin đọc những dự đoán của tôi được viết dưới đây)? Ở đây tôi phát hiện ra rằng Bonjour cho phép tự động phát hiện ra máy tính, thiết bị và dịch vụ trên mạng IP. Nhưng tôi nghĩ rằng nó không chỉ "phát hiện ra các thiết bị trên mạng IP" mà nó còn tạo ra một mạng IP bằng cách gán địa chỉ IP cho các thiết bị nơi Bonjour đang chạy. Tôi có đúng không

Không hẳn; như Jon chỉ ra, DHCP (thường) được sử dụng để phân bổ địa chỉ IP. Theo cách tương tự như DNS thông thường dịch tên miền thành địa chỉ IP, Bonjour được sử dụng để dịch tên miền tạm thời (trong mạng cục bộ) sang địa chỉ IP cung cấp chúng.

Và tôi vẫn nhớ bản chất. Nó hoạt động theo cách sau? Đầu tiên tôi kết nối các thiết bị (ví dụ: máy tính xách tay) để chúng có thể giao tiếp với nhau. Sau đó, giả sử, trên một số máy tính xách tay tôi có Bonjour đang chạy và do đó, những máy tính xách tay này tự gán địa chỉ IP cho chúng theo cách tự động. Vì vậy, máy tính xách tay (nơi Bonjour đang chạy) xây dựng một mạng IP. Nó hoạt động theo cách này?

Không; các máy tính xách tay hầu như có thể nhận địa chỉ IP của họ từ máy chủ DHCP cục bộ. Bonjour chỉ giúp họ tìm ra những dịch vụ mà mỗi dịch vụ có thể cung cấp cho những người khác.

Hoặc có thể máy tính đang chạy Bonjour không được coi là một dịch vụ và nó không tự phát sóng chỉ vì Bonjour đang chạy trên máy tính này. Ý tôi là các ứng dụng chạy trên máy tính cần sử dụng Bonjour để tự phát sóng. Vì vậy, đó là các ứng dụng phát sóng chính chúng (không phải máy tính) và nó không được thực hiện tự động (ứng dụng cần phát sóng chính chúng một cách rõ ràng). Đúng không?

Có - nói chung, ứng dụng của bạn sẽ cần phải quảng cáo rõ ràng sự tồn tại của nó. Điều này thường có thể được thực hiện bằng các thư viện do hệ thống cung cấp (phổ biến trên OS X) hoặc thư viện tùy chỉnh (ví dụ: perl's Net :: Bonjour).

Làm thế nào chính xác ứng dụng của tôi có thể phát sóng chính nó? Tôi có thể sử dụng dòng lệnh để đăng ký dịch vụ không (để tất cả các ứng dụng sử dụng Bonjour đều biết rằng dịch vụ mới đã xuất hiện)

Tôi không biết về một công cụ dòng lệnh thực hiện việc này, nhưng nhiều ngôn ngữ lập trình chính có sẵn các thư viện để làm việc này.

Hơn nữa, tôi muốn có một ứng dụng sử dụng mạng IP được tạo bởi Bonjour. Vì vậy, ứng dụng của tôi cần biết thiết bị / dịch vụ nào có trong mạng. Để biết thêm chi tiết, ứng dụng của tôi cần phải có một danh sách các dịch vụ. Mỗi dịch vụ trong danh sách nên có một tên, địa chỉ IP nơi nó đang chạy và cổng được ứng dụng sử dụng. Bonjour có thể cung cấp thông tin này theo một cách nào đó không?

Hầu hết các thư viện Bonjour sẽ có thể làm điều này cho bạn; xem ví dụ đầu tiên tại http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Nếu nó là trường hợp, làm thế nào chính xác nó hoạt động. Làm thế nào chương trình của tôi có thể nhận được thông tin này từ Bonjour? Chương trình của tôi có thể đọc một số tệp được tạo bởi Bonjour và chứa thông tin được đề cập ở trên không? Tôi có thể sử dụng một số lệnh trong dòng lệnh để lấy thông tin này không?

Sử dụng các thư viện thích hợp, chương trình sử dụng giao thức Bonjour để yêu cầu tất cả các máy tính khác trong mạng cục bộ của bạn cho họ biết những dịch vụ nào họ có sẵn. Thư viện đó sau đó sẽ phân tích các câu trả lời và trình bày chúng cho bạn ở định dạng hữu ích hơn.

Tôi có một mối quan tâm đặc biệt trong việc truy cập thông tin về các dịch vụ từ các tệp, biến môi trường hoặc các lệnh trong dòng lệnh. Những lựa chọn này đối với tôi là đơn giản nhất! Vì trong những trường hợp này, tôi không cần sử dụng bất kỳ thư viện bổ sung nào để giao tiếp với Bonjour từ một ngôn ngữ lập trình cụ thể.

Tôi không biết về một công cụ làm việc này, nhưng nó có thể tồn tại.

PS Pleas đặt câu hỏi nếu có gì đó không rõ ràng trong câu hỏi của tôi. Tôi sẽ cố gắng xây dựng câu hỏi của tôi một cách rõ ràng hơn.

Một số thông tin khác về những gì chương trình bạn đang viết sẽ làm và ngôn ngữ bạn viết nó sẽ giúp bạn dễ dàng hơn.

Để biết thêm thông tin giới thiệu, hãy thử cả hai:


caelyx, tôi đã thêm thông tin theo yêu cầu của bạn vào cuối câu hỏi ban đầu của tôi.
La Mã

caelyx, bạn đã viết rằng Bonjour không gán địa chỉ IP: "DHCP (thường) được sử dụng để phân bổ địa chỉ IP". Nhưng Bonjour thực hiện giao thức ZeroConf và một trong những công nghệ cốt lõi của giao thức ZeroConf (theo wikipedia) là "Gán địa chỉ mạng số cho các thiết bị được nối mạng (tự động cấu hình địa chỉ liên kết cục bộ)".
La Mã

Trên các mạng IPv4 không có máy chủ DHCP / BootP, các máy chủ sẽ tự gán cho mình một địa chỉ 168. *. Bonjour hoạt động chính xác với những địa chỉ đó. Đó là hoặc nó đề cập đến địa chỉ IPv6-Địa chỉ liên kết.
jdizzle

3

Bonjour không gán địa chỉ IP - đó là giao thức khám phá - bạn vẫn cần địa chỉ IP DHCP / Tĩnh / Liên kết cục bộ (APIPA) để nó hoạt động.

Nó sử dụng DNS đa hướng (mDNS) để khám phá những máy chủ nào trên cùng một miền quảng bá như chính nó và về cơ bản nó trở thành máy chủ DNS của chính nó.

Xem Bonjour & Zeroconf cho sự hạ thấp.

Trừ khi ứng dụng của bạn dành cho mạng gia đình / không được quản lý, nghĩa là, thiếu máy chủ DNS cục bộ, bạn không cần nó.


ZeroConf không gán địa chỉ IP?
Yêu tinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.