用于支持WWW瀏覽的網(wǎng)絡(luò)協(xié)議為HTTP,這是一種最基本的客戶機(jī)/服務(wù)器的訪問協(xié)議。瀏覽器向服務(wù)器發(fā)送請(qǐng)求,而服務(wù)器回應(yīng)相應(yīng)的網(wǎng)頁。HTTP協(xié)議從1990年開始出現(xiàn),發(fā)展到當(dāng)前的HTTP1.1標(biāo)準(zhǔn),已經(jīng)有了相當(dāng)多的擴(kuò)展,然而其最基本的實(shí)現(xiàn)是非常簡(jiǎn)單的,服務(wù)器需要進(jìn)行的額外處理相當(dāng)少,這也是為什么Web服務(wù)器軟件如此眾多的原因之一。
請(qǐng)求方法
通常,HTTP協(xié)議使用端口80來提供客戶訪問,因此也可以使用其他的網(wǎng)絡(luò)軟件,如telnet,模擬客戶向服務(wù)器發(fā)送請(qǐng)求,來查看HTTP的傳輸方式。
$telnetwebserver80
Trying192.168.0.1...
Connectedtowebserver.
Escapecharacteris'^]'.
GET/index.Html
當(dāng)telnet顯示了Connect等信息建立了連接之后,服務(wù)器就等待使用者輸入請(qǐng)求,而不進(jìn)行任何提示。上例中,使用者輸入GET/index.html指令,則服務(wù)器立即將相應(yīng)的網(wǎng)頁返回,然后關(guān)閉連接。
客戶程序向服務(wù)器發(fā)送的請(qǐng)求可以有不同的類型,這樣服務(wù)器可以根據(jù)不同的請(qǐng)求類型進(jìn)行不同的處理。在HTTP1.0中,定義了三種最基本的請(qǐng)求類型,GET、POST和HEAD,這些請(qǐng)求方法的實(shí)現(xiàn)方式均與上例相同,客戶程序用大寫指令將請(qǐng)求發(fā)送給服務(wù)器,后面跟隨具體的數(shù)據(jù)。
GET請(qǐng)求最為常見,它后面跟隨一個(gè)網(wǎng)頁的位置,服務(wù)器接受請(qǐng)求并返回其請(qǐng)求的頁面。除了頁面位置作參數(shù)之外,請(qǐng)求還可以跟隨協(xié)議的版本如HTTP/1.0等作為參數(shù),以發(fā)送給服務(wù)器更多的信息。
POST請(qǐng)求要求服務(wù)器接收大量的信息,除了POST后面跟隨的參數(shù)之外,瀏覽器還會(huì)在后面持續(xù)發(fā)送數(shù)據(jù),讓服務(wù)器進(jìn)行處理。通常,POST方法是和CGI程序分不開的,服務(wù)器應(yīng)該啟動(dòng)一個(gè)CGI程序來處理POST發(fā)送來的數(shù)據(jù)。
HEAD請(qǐng)求在客戶程序和服務(wù)器之間進(jìn)行交流,而不會(huì)返回具體的文檔。當(dāng)使用GET和POST方法時(shí),服務(wù)器最后都將結(jié)果文檔返回給客戶程序,瀏覽器將刷新顯示。而HEAD請(qǐng)求則不同,它僅僅交流一些內(nèi)部數(shù)據(jù),這些數(shù)據(jù)不會(huì)影響瀏覽的過程。因此HEAD方法通常不單獨(dú)使用,而是和其他的請(qǐng)求方法一起起到輔助作用。一些搜尋引擎使用的自動(dòng)搜索機(jī)器人使用這個(gè)方法來獲得網(wǎng)頁的標(biāo)志信息,或者進(jìn)行安全認(rèn)證時(shí),使用這個(gè)方法來傳遞認(rèn)證信息。
除了這三種最常見的訪問方法之外,在HTTP1.1中還定義了更多的訪問方法類型,如PUT,用于將網(wǎng)頁放置到正確位置,DELETE用于刪除相關(guān)文檔等。這些方法并不常用,因而大部分Web服務(wù)器軟件并沒有實(shí)現(xiàn)他們。然而對(duì)于特定場(chǎng)合他們還是非常有用的,例如使用軟件編輯網(wǎng)頁時(shí),網(wǎng)頁編輯器可以使用這些方法,治理不同的網(wǎng)頁。
假如服務(wù)器不支持客戶發(fā)送的請(qǐng)求方法,服務(wù)器將返回錯(cuò)誤并立即關(guān)閉連接。
服務(wù)器對(duì)HTTP的處理方式
HTTP協(xié)議的這種請(qǐng)求/回應(yīng)的模式,使得服務(wù)器只能根據(jù)客戶程序的請(qǐng)求發(fā)送回信息,這樣的好處是客戶具備很大的自由度,可以任意訪問服務(wù)器上的信息。因此就存在多個(gè)客戶同時(shí)訪問一個(gè)服務(wù)器的問題。
在Unix下,由一個(gè)守護(hù)進(jìn)程來監(jiān)視來自客戶程序的請(qǐng)求,當(dāng)守護(hù)進(jìn)程接受到一個(gè)請(qǐng)求時(shí),就建立一個(gè)新的進(jìn)程對(duì)請(qǐng)求進(jìn)行處理。通常服務(wù)器能創(chuàng)建足夠多的新進(jìn)程往返應(yīng)客戶的請(qǐng)求,然而假如同時(shí)發(fā)送請(qǐng)求的客戶太多,那么服務(wù)器就有可能出現(xiàn)超載的情況,創(chuàng)建進(jìn)程的速度跟不上眾多客戶發(fā)送請(qǐng)求的速度,這樣就造成了服務(wù)器對(duì)外表現(xiàn)反應(yīng)遲緩。此外,為了提高用戶使用瀏覽器時(shí)的性能,現(xiàn)代瀏覽器還支持并發(fā)的訪問方式,瀏覽一個(gè)網(wǎng)頁時(shí)同時(shí)建立多個(gè)連接,以迅速獲得一個(gè)網(wǎng)頁上的多個(gè)圖標(biāo),這樣能更快速完成整個(gè)網(wǎng)頁的傳輸。但是對(duì)服務(wù)器來講,更增加了瞬間負(fù)載。
顯然,造成這個(gè)問題的要害是服務(wù)器對(duì)HTTP協(xié)議的處理方式,一次請(qǐng)求就要建立一個(gè)連接,在網(wǎng)頁上布滿了多個(gè)較小的圖象文件的時(shí)候,那么服務(wù)器和客戶程序之間的大部分工作是用于建立連接,而真正用于傳遞數(shù)據(jù)的工作卻很輕松。因此,更好的利用現(xiàn)有連接,減少建立連接的消耗,就需要能在一次連接中回應(yīng)多個(gè)請(qǐng)求。在HTTP1.1中提供了這種持續(xù)連接的方式,而下一代HTTP協(xié)議:HTTP-NG更增加了有關(guān)會(huì)話控制、豐富的內(nèi)容協(xié)商等方式的支持,來提供更高效率的連接。
除了針對(duì)每次請(qǐng)求都建立一個(gè)新進(jìn)程的處理方式之外,HTTP守護(hù)進(jìn)程也能使用其他的方式處理多個(gè)請(qǐng)求,例如使用多線程,或者使用異步方式在不同請(qǐng)求之間進(jìn)行切換,就能在一個(gè)進(jìn)程內(nèi)處理多個(gè)請(qǐng)求。雖然比起建立新進(jìn)程來講,這樣消耗的處理器資源略微減少,但是并不能從根本上消除并發(fā)訪問帶來的處理器資源不足的問題。一般使用線程和異步方式的程序較為復(fù)雜,不能很輕易擴(kuò)充對(duì)新特性的支持,并有可能因?yàn)槌绦騼?nèi)部要自己進(jìn)行同步等原因也會(huì)造成資源消耗。使用這些方式,雖然對(duì)處理靜態(tài)的網(wǎng)頁有好處,但對(duì)于執(zhí)行CGI程序,仍然要?jiǎng)?chuàng)建子進(jìn)程進(jìn)行處理。因此,大部分運(yùn)行在Unix上的守護(hù)程序仍然使用多進(jìn)程的方式,這種方式簡(jiǎn)單卻有效。
即使對(duì)于使用多進(jìn)程方式進(jìn)行處理的Web服務(wù)器,也有不同的處理方式。Unix系統(tǒng)中提供了超級(jí)服務(wù)器進(jìn)程inetd,因此簡(jiǎn)單的Web服務(wù)器可以使用inetd來啟動(dòng)真正的Web服務(wù)器。然而,inetd效率不高,使用inetd的服務(wù)器不能用作高負(fù)載的服務(wù)器系統(tǒng),因此高負(fù)載的Web服務(wù)器,本身來監(jiān)聽客戶連接請(qǐng)求,并負(fù)責(zé)啟動(dòng)子進(jìn)程真正處理客戶的請(qǐng)求。
假如選擇的服務(wù)器程序的確需要使用inetd來啟動(dòng),可以選擇與inetd功能相同,但效率更高的超級(jí)服務(wù)器進(jìn)程tcpserver,它可以比inetd更高效的啟動(dòng)服務(wù)進(jìn)程。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注