廣播是怎樣傳送的?路由器及主機又如何處理廣播?很遺憾,這是難以回答的問題,因為它依賴于廣播的類型、應用的類型、TCP/IP實現方法以及有關路由器的配置。
首先,應用程序必須支持廣播。如果執行
sun%ping255.255.255.255
/usr/etc/ping:unknownhost255.255.255.255打算在本地電纜上進行廣播。但它無法進行,原因在于該應用程序(ping)中存在一個程序設計上的問題。大多數應用程序收到點分十進制的IP地址或主機名后,會調用函數inet_addr(3)來把它們轉化為32bit的二進制IP地址。假定要轉化的是一個主機名,如果轉化失敗,該庫函數將返回-1來表明存在某種差錯(例如是字符而不是數字或串中有小數點)。但本網廣播地址(255.255.255.255)也被當作存在差錯而返回-1。大多數程序均假定接收到的字符串是主機名,然后查找DNS(第14章),失敗后輸出差錯信息如“未知主機”。
如果我們修復ping程序中這個欠缺,結果也并不總是令人滿意的。在6個不同系統的測試中,僅有一個像預期的那樣產生了一個本網廣播數據報。大多數則在路由表中查找IP地址255.255.255.255,而該地址被用作默認路由器地址,因此向默認路由器單播一個數據報。最終該數據報被丟棄。
指向子網的廣播是我們應該使用的。我們向測試網絡中IP地址為140.252.13.63的以太網發送數據報,并接收以太網中所有主機的應答。與子網廣播地址關聯的每個接口是用于命令ifconfig的值。如果我們ping那個地址,預期的結果是:
IP通過目的地址(140.252.13.63)來確定,這是指向子網的廣播地址,然后向鏈路層的廣播地址發送該數據報。在6.3節提到的這種廣播類型的接收對象為局域網中包括發送主機在內的所有主機,因此可以看到除了收到網內其他主機的答復外,還收到來自發送主機(sun)的答復。
在這個例子中,我們也顯示了執行ping廣播地址前后ARP緩存的內容。這可以顯示廣播與ARP之間的相互作用。執行ping命令前ARP緩存是空的,而執行后是滿的(也就是說,對網內其他每個響應回顯請求的主機在ARP緩存中均有一個條目)。我們提到的該以太網數據幀被傳送到鏈路層的廣播地址(0xffffffff)是如何發生的呢?由sun主機發送的數據幀不需要ARP。
如果使用tcpdump來觀察ping的執行過程,可以看到廣播數據幀的接收者在發送它的響應之前,首先產生一個對sun主機的ARP請求,因為它的應答是單播的。在4.5節我們介紹了一個ARP請求的接收者(該例中是sun)通常在發送ARP應答外,還將請求主機的IP地址和物理地址加入到ARP緩存中去。這基于這樣一個假定:如果請求者向我們發送一個數據報,我們也很可能想向它發回什么。
我們使用的ping程序有些特殊,原因在于它使用的編程接口(在大多數Unix實現中是低級插口(rawsocket))通常允許向一個廣播地址發送數據報。如果使用不支持廣播的應用如TFTP,情況又如何呢?(TFTP將在第15章詳細介紹。)
bsdi%tftp啟動客戶程序
tftp>connect140.252.13.63說明服務器的IP地址
tftp>gettemp.foo試圖從服務器或獲取一個文件
tftp:sendto:Permissiondenied
tftp>quit終止客戶程序
在這個例子中,程序立即產生了一個差錯,但不向網絡發送任何信息。產生這一切的原因在于,插口提供的應用程序接口API只有在進程明確打算進行廣播時才允許它向廣播地址發送UDP數據報。這主要是為了防止用戶錯誤地采用了廣播地址(正如此例)而應用程序卻不打算廣播。
在廣播UDP數據報之前,使用插口中API的應用程序必須設置SO_BROADCAST插口選項。并非所有系統均強制使用這個限制。某些系統中無需進程進行這個說明就能廣播UDP數據報。而某些系統則有更多的限制,需要有超級用戶權限的進程才能廣播。
下一個問題是是否轉發廣播數據。有些系統內核和路由器有一選項來控制允許或禁止這一特性
如果讓路由器bsdi能夠轉發廣播數據,然后在主機slip上運行ping程序,就能夠觀察到由路由器bsdi轉發的子網廣播數據報。轉發廣播數據報意味著路由器接收廣播數據,確定該目的地址是對哪個接口的廣播,然后用鏈路層廣播向對應的網絡轉發數據報。
我們觀察到它的確正常工作了,同時也看到BSD系統中的ping程序檢查重復的數據報序列號。如果出現重復序列號的數據報就顯示DUP!,這意味著一個數據報已經在某處重復了,然而它正是我們所期望看到的,因為我們正向一個廣播地址發送數據。
我們還可以從遠離廣播所指向的網絡上的主機上來進行這個試驗。在主機angogh.cx.berkeley.edu(和我們的網絡距離14跳)上運行ping程序,如果路由器sun被設置為能夠轉發所指向的廣播,它還能正常工作。在這種情況下,這個IP數據報(傳送ICMP回顯請求)被路徑上的每個路由器像正常的數據報一樣轉發,它們均不知道傳送的實際上是廣播數據。接著最后一個路由器netb看到主機號為63,就將其轉發給路由器sun。路由器sun覺察到該目的IP地址事實上是一個相連子網接口上的廣播地址,就將該數據報以鏈路層廣播傳往相應網絡。