BOOTP客戶通常固化在無盤系統(tǒng)只讀存儲器中,因此了解BOOTP服務(wù)器的實(shí)現(xiàn)將更有意義。
首先,BOOTP服務(wù)器將從它的熟知端口(67)讀取UDP數(shù)據(jù)報(bào)。這沒有特別的地方。它不同于RARP服務(wù)器,它必須讀取類型字段為“RARP請求”的以太網(wǎng)幀。BOOTP協(xié)議通過將客戶的硬件地址放入BOOTP分組中,使得服務(wù)器很容易獲取客戶的硬件地址。
這里出現(xiàn)了一個(gè)有趣的問題:TFTP服務(wù)器如何能將一個(gè)響應(yīng)直接送回BOOTP客戶?這個(gè)響應(yīng)是一個(gè)UDP數(shù)據(jù)報(bào),而服務(wù)器知道該客戶的IP地址(可能通過讀取服務(wù)器上的配置文件)。但如果這個(gè)客戶向那個(gè)IP地址發(fā)送一個(gè)UDP數(shù)據(jù)報(bào)(正常情況下會處理UDP的輸出),BOOTP服務(wù)器的主機(jī)就可能向那個(gè)IP地址發(fā)送一個(gè)ARP請求。但這個(gè)客戶不能響應(yīng)這個(gè)ARP請求,因?yàn)樗€不知道它自己的IP地址?。ㄟ@就是在RFC951中被稱作“雞和蛋”的問題。)
有兩種解決辦法:第一種,通常被Unix服務(wù)器采用,是服務(wù)器發(fā)一個(gè)ioctl(2)請求給內(nèi)核,為該客戶在ARP高速緩存中設(shè)置一個(gè)條目(這就是命令arp-s所做的工作,見4.8節(jié))。服務(wù)器能一直這么做直到它知道客戶的硬件地址和IP地址。這意味著當(dāng)服務(wù)器發(fā)送UDP數(shù)據(jù)報(bào)(即BOOTP應(yīng)答)時(shí),服務(wù)器的ARP將在ARP高速緩存中找到該客戶的IP地址。
另一種可選的解決辦法是服務(wù)器廣播這個(gè)BOOTP應(yīng)答而不直接將應(yīng)答發(fā)回該客戶。既然通常期望網(wǎng)絡(luò)廣播越少越好,因此這種解決方案應(yīng)該只在服務(wù)器無法在它的ARP高速緩存設(shè)置一個(gè)條目的情況下使用。通常只有擁有超級用戶權(quán)限才能在ARP高速緩存設(shè)置一個(gè)條目,如果沒有這種權(quán)限就只能廣播BOOTP應(yīng)答。
眾信咨詢:互聯(lián)網(wǎng)資質(zhì)代理誠信品牌