วิธีใช้ Bonjour


26
  1. ก่อนอื่น Bonjour ทำอะไรกันแน่
    ที่นี่ฉันพบว่า Bonjour เปิดใช้งานการค้นพบอัตโนมัติของคอมพิวเตอร์อุปกรณ์และบริการบนเครือข่าย IP แต่ฉันคิดว่ามันไม่เพียง "ค้นพบอุปกรณ์บนเครือข่าย IP" แต่ยังสร้างเครือข่าย IP ด้วยการกำหนดที่อยู่ IP ให้กับอุปกรณ์ที่ Bonjour ทำงานอยู่ ฉันถูกไหม?

  2. และฉันก็ยังขาดสาระสำคัญ มันทำงานในวิธีต่อไปนี้? ก่อนอื่นฉันเชื่อมต่ออุปกรณ์ (เช่นแล็ปท็อป) ทางกายภาพเพื่อให้พวกเขาสามารถสื่อสารกันได้ จากนั้นสมมติว่าในแล็ปท็อปบางเครื่องที่ฉันใช้ Bonjour และจากนั้นแล็ปท็อปเหล่านี้จะกำหนดที่อยู่ IP ให้กับพวกเขาด้วยวิธีอัตโนมัติ ดังนั้นแล็ปท็อป (ที่ Bonjour กำลังทำงานอยู่) สร้างเครือข่าย IP มันทำงานด้วยวิธีนี้หรือไม่?

  3. หรืออาจเป็นคอมพิวเตอร์ที่ใช้ Bonjour ไม่ถือเป็นการให้บริการและจะไม่ออกอากาศเองเพียงเพราะ Bonjour กำลังทำงานบนคอมพิวเตอร์เครื่องนี้ ฉันหมายความว่าแอปพลิเคชันที่ทำงานบนคอมพิวเตอร์จำเป็นต้องใช้ Bonjour เพื่อออกอากาศด้วยตนเอง ดังนั้นมันเป็นแอพพลิเคชั่นที่ถ่ายทอดตัวเอง (ไม่ใช่คอมพิวเตอร์) และมันไม่ได้ทำโดยอัตโนมัติ (แอพพลิเคชั่นจำเป็นต้องออกอากาศด้วยตนเองอย่างชัดเจน) ถูกต้องหรือไม่

  4. แอปพลิเคชันของฉันสามารถออกอากาศได้อย่างไร ฉันสามารถใช้บรรทัดคำสั่งเพื่อลงทะเบียนบริการ (เพื่อให้แอปพลิเคชันทั้งหมดที่ใช้ Bonjour รู้ว่ามีบริการใหม่ปรากฏขึ้น)

  5. นอกจากนี้ฉันต้องการแอปพลิเคชันที่ใช้เครือข่าย IP ที่สร้างโดย Bonjour แอปพลิเคชันของฉันต้องรู้ว่าอุปกรณ์ / บริการใดบ้างที่มีอยู่ในเครือข่าย ในรายละเอียดเพิ่มเติมแอปพลิเคชันของฉันต้องมีรายการบริการ แต่ละบริการในรายการควรมีชื่อที่อยู่ IP ที่ใช้งานอยู่และพอร์ตที่แอปพลิเคชันใช้ Bonjour ให้ข้อมูลนี้ได้บ้างไหม? หากเป็นเช่นนั้นจะทำงานอย่างไร โปรแกรมของฉันจะรับข้อมูลนี้จาก Bonjour ได้อย่างไร โปรแกรมของฉันสามารถอ่านไฟล์ที่สร้างโดย Bonjour และมีข้อมูลดังกล่าวข้างต้นได้หรือไม่? ฉันสามารถใช้คำสั่งในบรรทัดคำสั่งเพื่อดึงข้อมูลนี้ได้หรือไม่?

  6. ฉันมีความสนใจเป็นพิเศษในการเข้าถึงข้อมูลเกี่ยวกับบริการจากไฟล์ตัวแปรสภาพแวดล้อมหรือคำสั่งในบรรทัดคำสั่ง ตัวเลือกเหล่านี้ดูเหมือนจะง่ายที่สุดสำหรับฉัน! เนื่องจากในกรณีนี้ฉันไม่จำเป็นต้องใช้ไลบรารีเพิ่มเติมเพื่อสื่อสารกับ Bonjour จากภาษาการเขียนโปรแกรมเฉพาะ

PS อ้อนวอนถามคำถามหากคำถามของฉันไม่ชัดเจน ฉันจะพยายามกำหนดคำถามของฉันอย่างชัดเจนยิ่งขึ้น

PPS ผมใช้ Windows 7

เพิ่ม: ฉันวางแผนที่จะเขียนแอปพลิเคชันของฉันใน PHP คอมพิวเตอร์ทุกเครื่องควรเรียกใช้เว็บเซิร์ฟเวอร์ Apache และฉันต้องการใช้ Bonjour เพื่อช่วยให้คอมพิวเตอร์ค้นพบซึ่งกันและกัน (คอมพิวเตอร์ทำงานในเครือข่ายท้องถิ่น)

คำตอบ:


54
  1. ใช่. Stuart Cheshire ผู้เป็นผู้สร้างและเป็นผู้ดูแลหลักของ Rendezvous / Bonjour ที่ Apple ผู้ร่วมเป็นประธานคณะทำงาน IETF ZeroConf และเป็นผู้เขียนหนังสือ O'Reilly บน Zero Configuration Networking ได้อธิบายว่า Bonjour เป็น“ สาม - อุจจาระแบบมีขา” ซึ่งขา:

    1. IPv4 (และ IPv6) การระบุที่อยู่ภายในเครื่อง
    2. การแก้ปัญหาชื่อหลายผู้รับ (mDNS)
    3. การค้นหาบริการ DNS (DNS-SD)

    คณะทำงาน IETF ZeroConf และ Apple ทั้งคู่พิจารณาที่อยู่ link-local โดยเฉพาะ IPv4 link-local address ( 169.254.0.0/16ที่อยู่) เพื่อเป็นส่วนหนึ่งของ ZeroConf / Bonjour แม้ว่าการเชื่อมโยงที่อยู่ในท้องถิ่นส่งปีก่อน "ขาอุจจาระ" อีกสองคน

    โปรดทราบว่าเนื่องจาก Windows รองรับการระบุที่อยู่ในการเชื่อมโยงอัตโนมัติโดยอัตโนมัติแม้ว่าจะไม่ได้ติดตั้งซอฟต์แวร์ Bonjour สำหรับ Apple ของ Windows ผู้ใช้ Windows หลายคนไม่คิดว่าการกำหนดที่อยู่ในการเชื่อมโยงภายใน IPv4 ให้เป็นส่วนหนึ่งของ Bonjour / ZeroConf

  2. ใช่. ตามค่าเริ่มต้นแล้วเครื่อง Mac และ Windows จะทำการกำหนดแอดเดรส IPv4 link-local หากมีการกำหนดค่าสำหรับ DHCP แต่ไม่มีเซิร์ฟเวอร์ DHCP เครื่อง Linux และ BSD ที่ติดตั้ง Avahi (หรืออาจติดตั้งใช้งาน ZeroConf อื่น ๆ ) ก็จะทำเช่นนี้

  3. หากคอมพิวเตอร์ใช้ Bonjour ชื่อโฮสต์จะถูกเผยแพร่บน LAN ผ่าน mDNS หากชื่อเครื่องของคุณคือ“ อลิซ” มันจะAlice.localผ่าน mDNS จากคอมพิวเตอร์เครื่องอื่น (เรียกว่า "บ็อบ") บน LAN เดียวกัน (โดยเฉพาะบนโดเมนมัลติคาสต์ลิงค์ท้องถิ่น) คุณควรจะสามารถพิมพ์ได้อย่างง่ายดายping Alice.localและบ๊อบควรค้นหา mDNS Alice.localเพื่อค้นหาที่อยู่ IP ของอลิซ ( es) และ ping (หนึ่ง) ที่อยู่ที่ได้รับกลับมา

    อย่างไรก็ตามโปรดทราบว่า Bonjour แยกความแตกต่างระหว่างชื่อโฮสต์และชื่อบริการ ตัวอย่างเช่นหากคุณมีเครื่องพิมพ์ USB สองเครื่องแยกกันสมมติว่า“ HP” และ“ Canon” เชื่อมต่อกับอลิซและอลิซแสดงเป็นlprเซิร์ฟเวอร์เครื่องพิมพ์สำหรับทั้งคู่พวกเขาแต่ละคนสามารถแสดงตนเป็นบริการของตัวเอง ซึ่งแม็พกลับไปAlice.localเป็นโฮสต์

    ชื่อบริการของพวกเขาจะปรากฏต่อผู้ใช้ในชื่อ“ HP” และ“ Canon” โดยไม่กล่าวถึงอลิซ เบื้องหลังพวกเขาจะรู้จักHP._printer._tcp.localและCanon._printer._tcp.localและการค้นหา DNS-SD ในชื่อบริการเหล่านั้นจะแสดงว่าบริการเหล่านั้นมีอยู่ในAlice.localพอร์ต TCP สองพอร์ตที่ต่างกัน

    ใช่แอปพลิเคชันจะต้องแจ้ง Bonjour daemon (เรียกว่าmDNSResponderในการนำไปใช้ของ Apple) ว่าพวกเขามีบริการที่พวกเขาต้องการโฆษณา macOS มีกลไกในการจัดการบริการโฆษณาโดยอัตโนมัติสำหรับบริการแบบดั้งเดิมที่ไม่ได้รับการยอมรับโดย Bonjour ตัวอย่างเช่น macOS sshdคือ 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
    

    ฉันจะไม่แปลกใจถ้ามันรวมอยู่ใน Bonjour สำหรับ Windows หรือ Bonjour SDK สำหรับ Windows หรือถ้าคุณสามารถคอมไพล์มันสำหรับ Windows จากmDNSRSR Responderของโครงการโอเพนซอร์สของ Apple Googling สำหรับdns-sd.exeฉันเห็นสิ่งนี้อยู่ ฉันไม่แน่ใจว่าฉันเพิ่งจะดาวน์โหลดไบนารีสำหรับมัน แต่ฉันจะพยายามดึงมันจากหนึ่งในแพ็คเกจที่กล่าวถึงข้างต้นหรือรวบรวมตัวเองจากแหล่งที่มาของโครงการ mDNSR ตอบกลับ

  5. คุณยังสามารถใช้dns-sdเครื่องมือบรรทัดคำสั่งเพื่อค้นหาบริการและค้นหาได้ นี่คือตัวอย่างของการค้นหาบริการเว็บในพื้นที่:

    เรียกดูบริการเว็บในพื้นที่ด้วย-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  
    

    ค้นหาที่อยู่ IP สำหรับ MyWebServer.local ด้วย-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 ทำได้โดยการเรียก APIs โดยตรง (แอพ C / C ++ / Obj-C / Swift) หรือผ่านห้องสมุดเฉพาะภาษา (แปล / ภาษาสคริปต์)


คำอธิบายที่ดีที่สุดของ Bonjour / Zeroconf ฉันเคยเห็น คุณควรช่วยบทความ wikipedia :)
Kamil Kisiel

ค่อนข้างสมบูรณ์เช่นนี้ แต่ถ้าคุณต้องการขยายวิธีการใช้ระเบียน DNS โปรดขโมยจากserverfault.com/questions/18565/…
andrewtj

4

ก่อนอื่น Bonjour ทำอะไรกันแน่ ที่นี่ฉันพบว่า Bonjour เปิดใช้งานการค้นพบอัตโนมัติของคอมพิวเตอร์อุปกรณ์และบริการบนเครือข่าย IP แต่ฉันคิดว่ามันไม่เพียง "ค้นพบอุปกรณ์ในเครือข่าย IP" แต่ยังสร้างเครือข่าย IP ด้วยการกำหนดที่อยู่ IP ให้กับอุปกรณ์ที่ Bonjour ทำงานอยู่ ฉันถูกไหม?

ไม่มาก จอนชี้ให้เห็นว่า DHCP (ปกติ) จะใช้ในการจัดสรรที่อยู่ IP ในทำนองเดียวกันกับที่ DNS ทั่วไปแปลชื่อโดเมนเป็นที่อยู่ IP Bonjour จะใช้ในการแปลชื่อโดเมนชั่วคราว (ภายในเครือข่ายท้องถิ่น) ไปยังที่อยู่ IP ที่ให้บริการ

และฉันก็ยังขาดสาระสำคัญ มันทำงานในวิธีต่อไปนี้? ก่อนอื่นฉันเชื่อมต่ออุปกรณ์ (เช่นแล็ปท็อป) ทางกายภาพเพื่อให้พวกเขาสามารถสื่อสารกันได้ จากนั้นสมมติว่าในแล็ปท็อปบางเครื่องที่ฉันใช้ Bonjour และจากนั้นแล็ปท็อปเหล่านี้จะกำหนดที่อยู่ IP ให้กับพวกเขาด้วยวิธีอัตโนมัติ ดังนั้นแล็ปท็อป (ที่ Bonjour กำลังทำงานอยู่) สร้างเครือข่าย IP มันทำงานด้วยวิธีนี้หรือไม่?

Nope; แล็ปท็อปส่วนใหญ่มีแนวโน้มที่จะได้รับที่อยู่ IP ของพวกเขาจากเซิร์ฟเวอร์ DHCP ท้องถิ่น Bonjour ช่วยให้พวกเขาคิดออกว่าบริการใดบ้างที่แต่ละคนสามารถมอบให้กับผู้อื่นได้

หรืออาจเป็นคอมพิวเตอร์ที่ใช้ Bonjour ไม่ถือเป็นการให้บริการและไม่ได้ออกอากาศเองเพียงเพราะ Bonjour ทำงานบนคอมพิวเตอร์เครื่องนี้ ฉันหมายความว่าแอปพลิเคชันที่ทำงานบนคอมพิวเตอร์จำเป็นต้องใช้ Bonjour เพื่อออกอากาศด้วยตนเอง ดังนั้นมันเป็นแอพพลิเคชั่นที่ถ่ายทอดตัวเอง (ไม่ใช่คอมพิวเตอร์) และมันไม่ได้ทำโดยอัตโนมัติ (แอพพลิเคชั่นต้องออกอากาศด้วยตัวเองอย่างชัดเจน) ถูกต้องหรือไม่

ใช่ - โดยทั่วไปใบสมัครของคุณจะต้องโฆษณาการมีอยู่ของมันอย่างชัดเจน สิ่งนี้สามารถทำได้โดยใช้ไลบรารีที่ระบบจัดให้ (ทั่วไปใน OS X) หรือไลบรารีที่กำหนดเอง (เช่น Net :: Bonjour ของ perl)

แอปพลิเคชันของฉันสามารถออกอากาศได้อย่างไร ฉันสามารถใช้บรรทัดคำสั่งเพื่อลงทะเบียนบริการ (เพื่อให้แอปพลิเคชันทั้งหมดที่ใช้ Bonjour รู้ว่ามีบริการใหม่ปรากฏขึ้น)

ฉันไม่ได้ตระหนักถึงเครื่องมือบรรทัดคำสั่งที่ทำสิ่งนี้ แต่ภาษาการเขียนโปรแกรมที่สำคัญหลายแห่งมีห้องสมุดให้ทำเช่นนี้

นอกจากนี้ฉันต้องการแอปพลิเคชันที่ใช้เครือข่าย IP ที่สร้างโดย Bonjour เพื่อให้แอปพลิเคชันของฉันต้องรู้ว่ามีอุปกรณ์ / บริการใดบ้างที่อยู่ในเครือข่าย ในรายละเอียดเพิ่มเติมแอปพลิเคชันของฉันต้องมีรายการบริการ แต่ละบริการในรายการควรมีชื่อที่อยู่ IP ที่ใช้งานอยู่และพอร์ตที่แอปพลิเคชันใช้ Bonjour ให้ข้อมูลนี้ได้บ้างไหม?

ห้องสมุด Bonjour ส่วนใหญ่น่าจะสามารถทำสิ่งนี้ให้คุณได้ ดูตัวอย่างแรกได้ที่http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

หากเป็นเช่นนั้นจะทำงานอย่างไร โปรแกรมของฉันจะรับข้อมูลนี้จาก Bonjour ได้อย่างไร โปรแกรมของฉันสามารถอ่านไฟล์ที่สร้างโดย Bonjour และมีข้อมูลดังกล่าวข้างต้นได้หรือไม่? ฉันสามารถใช้คำสั่งในบรรทัดคำสั่งเพื่อดึงข้อมูลนี้ได้หรือไม่?

การใช้ห้องสมุดที่เหมาะสมโปรแกรมใช้โปรโตคอล Bonjour เพื่อขอคอมพิวเตอร์เครื่องอื่น ๆ ทั้งหมดในเครือข่ายท้องถิ่นของคุณเพื่อบอกว่ามีบริการใดบ้าง ห้องสมุดนั้นจะแยกวิเคราะห์คำตอบและนำเสนอให้คุณในรูปแบบที่มีประโยชน์มากขึ้น

ฉันมีความสนใจเป็นพิเศษในการเข้าถึงข้อมูลเกี่ยวกับบริการจากไฟล์ตัวแปรสภาพแวดล้อมหรือคำสั่งในบรรทัดคำสั่ง ตัวเลือกเหล่านี้ดูเหมือนจะง่ายที่สุดสำหรับฉัน! เนื่องจากในกรณีนี้ฉันไม่จำเป็นต้องใช้ไลบรารีเพิ่มเติมเพื่อสื่อสารกับ Bonjour จากภาษาการเขียนโปรแกรมเฉพาะ

ฉันไม่รู้เครื่องมือที่ทำสิ่งนี้ แต่อาจมีอยู่

PS อ้อนวอนถามคำถามหากคำถามของฉันไม่ชัดเจน ฉันจะพยายามกำหนดคำถามของฉันอย่างชัดเจนยิ่งขึ้น

ข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับสิ่งที่โปรแกรมที่คุณเขียนจะทำและภาษาที่คุณใช้เขียนจะช่วยให้ง่ายขึ้น

สำหรับข้อมูลเบื้องต้นเพิ่มเติมให้ลองทั้งสอง:


caelyx ฉันเพิ่มข้อมูลที่คุณต้องการลงในส่วนท้ายของคำถามเดิมของฉัน
โรมัน

โดยทั่วไปคุณเขียนว่า Bonjour ไม่ได้กำหนดที่อยู่ IP: "DHCP (ปกติ) ใช้เพื่อจัดสรรที่อยู่ IP" แต่ Bonjour ใช้โปรโตคอล ZeroConf และหนึ่งในเทคโนโลยีหลักของโปรโตคอล ZeroConf (ตามวิกิพีเดีย) คือ "การกำหนดที่อยู่เครือข่ายตัวเลขสำหรับอุปกรณ์เครือข่าย (การเชื่อมโยงที่อยู่ในท้องถิ่น
โรมัน

สำหรับเครือข่าย IPv4 ที่ไม่มีเซิร์ฟเวอร์ DHCP / BootP โฮสต์จะกำหนดที่อยู่ 168. ตัวเอง Bonjour ทำงานได้อย่างถูกต้องกับที่อยู่เหล่านั้น อาจหมายถึงที่อยู่ IPv6 Link-Local
jdizzle

3

Bonjour ไม่ได้กำหนดที่อยู่ IP - เป็นโปรโตคอลการค้นพบ - คุณยังคงต้องใช้ที่อยู่ IP DHCP / คงที่ / Link-Local (APIPA) เพื่อให้ทำงานได้

มันใช้มัลติคาสต์ DNS (mDNS) เพื่อค้นหาโฮสต์ที่อยู่ในโดเมนออกอากาศเดียวกันกับตัวมันเองและโดยหลักแล้วมันจะกลายเป็นเซิร์ฟเวอร์ DNS ของตัวเอง

ดูBonjour & Zeroconfสำหรับ lowdown

ยกเว้นว่าแอปพลิเคชันของคุณใช้สำหรับเครือข่ายในบ้าน / ที่ไม่มีการจัดการนั่นก็คือการขาดเซิร์ฟเวอร์ DNS ในตัวคุณคุณไม่จำเป็นต้องใช้มัน


ZeroConf ไม่ได้กำหนดที่อยู่ IP?
Gobliins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.