【網(wǎng)絡(luò)是怎樣連接的】第6章 - 請求到達(dá)web服務(wù)器,響應(yīng)返回瀏覽器(3)

6.3 Web服務(wù)器程序解釋請求消息并作出響應(yīng)

將請求的URI轉(zhuǎn)換為實際的文件名

圖6.8 Web 的基本工作方式.png
圖6.9 客戶端看到的目錄結(jié)構(gòu)和實際目錄結(jié)構(gòu)是不同的.png

Web服務(wù)器中,圖6.7的read獲取的數(shù)據(jù)內(nèi)容就是HTTP請求消息。服務(wù)器程序會根據(jù)收到的請求消息中的內(nèi)容進(jìn)行相應(yīng)的處理,并生成響應(yīng)消息,再通過write返回給客戶端。請求消息包括一個稱為“方法”的命令,以及表示數(shù)據(jù)源的URI(文件路徑名),服務(wù)器程序會根據(jù)這些內(nèi)容向客戶端返回數(shù)據(jù),但對于不同的方法和URI,服務(wù)器內(nèi)部的工作過程會有所不同。下面我們從簡單的開始依次進(jìn)行介紹。

最簡單的一種情況如圖6.8中的例子所示,請求方法為GET, URI為一個HTML文件名。這種情況只要從文件中讀出HTML文檔,然后將其作為響應(yīng)消息返回就可以了。不過,按照URI從磁盤上讀取文件并沒有這么簡單。如果完全按照URI中的路徑和文件名讀取,那就意味著磁盤上所有的文件都可以訪問,Web服務(wù)器的磁盤內(nèi)容就全部暴露了,這很危險。因此,這里需要一些特殊的機(jī)制。

Web服務(wù)器公開的目錄其實并不是磁盤上的實際目錄,而是如圖6.9這樣的虛擬目錄,而URI中寫的就是在這個虛擬目錄結(jié)構(gòu)下的路徑名。因此,當(dāng)讀取文件時,需要先查詢虛擬目錄與實際目錄的對應(yīng)關(guān)系,并將URI轉(zhuǎn)換成實際的文件名后,才能讀取文件并返回數(shù)據(jù)。

運(yùn)行CGI程序

圖6.11 數(shù)據(jù)如何傳遞給 Web 服務(wù)器上運(yùn)行的程序.png

Web服務(wù)器會檢查URI指定的文件名,看一看這個文件是不是一個程序。這里的判斷方法是在Web服務(wù)器中事先設(shè)置好的,一般是通過文件的擴(kuò)展名來進(jìn)行判斷,例如將.cgi、.php等擴(kuò)展名的文件設(shè)置為程序,當(dāng)遇到這些文件時,Web服務(wù)器就會將它們作為程序來對待。也可以設(shè)置一個存放程序的目錄,將這個目錄下的所有文件都作為程序來對待。此外,還可以根據(jù)文件的屬性來進(jìn)行判斷。

如果判斷要訪問的文件為程序文件,Web服務(wù)器會委托操作系統(tǒng)運(yùn)行這個程序,然后從請求消息中取出數(shù)據(jù)并交給運(yùn)行的程序。如果方法為GET,則將URI后面的參數(shù)傳遞給程序;如果方法為POST,則將消息體中的數(shù)據(jù)傳遞給程序(圖6.11)。

Web服務(wù)器程序在組裝網(wǎng)絡(luò)包、還原數(shù)據(jù)之后,會運(yùn)行其中指定的程序(實際是委托操作系統(tǒng)來運(yùn)行),然后將數(shù)據(jù)傳遞給已運(yùn)行的程序。

運(yùn)行的程序收到數(shù)據(jù)后會進(jìn)行一系列處理,并將輸出的數(shù)據(jù)返回給Web服務(wù)器。

Web 服務(wù)器得訪問控制

Web服務(wù)器的訪問控制規(guī)則主要有以下3種。
(1)客戶端IP地址
(2)客戶端域名
(3)用戶名和密碼

圖6.12 根據(jù)域名進(jìn)行訪問控制.png

當(dāng)根據(jù)客戶端域名設(shè)置規(guī)則時,需要先根據(jù)客戶端IP地址查詢客戶端域名,這需要使用DNS服務(wù)器。一般我們使用DNS服務(wù)器都是根據(jù)域名查詢IP地址,其實根據(jù)IP地址反查域名也可以使用DNS服務(wù)器。具體來說,這個過程是這樣的。

  • 收到客戶端的請求消息后,Web服務(wù)器(圖6.12①)會委托協(xié)議棧告知包的發(fā)送方IP地址,然后用這個IP地址生成查詢消息并發(fā)送給最近的DNS服務(wù)器(圖6.12②)。

  • 接下來,DNS服務(wù)器找出負(fù)責(zé)管轄該IP地址的DNS服務(wù)器,并將查詢轉(zhuǎn)發(fā)給它(圖6.12③),查詢到相應(yīng)的域名之后返回結(jié)果(圖6.12④),然后Web服務(wù)器端的DNS服務(wù)器再將結(jié)果轉(zhuǎn)發(fā)給Web服務(wù)器(圖6.12⑤)。這樣一來,我們就可以根據(jù)發(fā)送方IP地址查詢到域名。

  • 接下來,為了保險起見,還需要用這個域名查詢一下IP地址,看看結(jié)果與發(fā)送方IP地址是否一致(圖6.12⑥)。這是因為有一種在DNS服務(wù)器上注冊假域名的攻擊方式,因此我們需要進(jìn)行雙重檢查,如果兩者一致則檢查相應(yīng)的訪問控制規(guī)則,判斷是否允許訪問。從圖6.12中可以看出,這種方式需要和DNS服務(wù)器進(jìn)行多次查詢,整個過程比較耗時,因此Web服務(wù)器的響應(yīng)速度也會變慢。

圖6.13 利用 HTTP 驗證用戶名和密碼.png

如果用戶名和密碼已設(shè)置好,那么情況如圖6.13。通常的請求消息中不包含用戶名和密碼,因此無法驗證用戶名和密碼(圖6.13①)。

  • 因此,Web服務(wù)器會向用戶發(fā)送一條響應(yīng)消息,告訴用戶需要在請求消息中放入用戶名和密碼(圖6.13②)。

  • 瀏覽器收到這條響應(yīng)消息后,會彈出一個輸入用戶名和密碼的窗口,用戶輸入用戶名和密碼后(圖6.13③),瀏覽器將這些信息放入請求消息中重新發(fā)送給服務(wù)器(圖6.13④)。

  • 然后,Web服務(wù)器查看接收到的用戶名和密碼與事先設(shè)置好的用戶名和密碼是否一致,以此判斷是否允許訪問,如果允許訪問,則返回數(shù)據(jù)(圖6.13⑤)。

返回響應(yīng)消息

首先,Web服務(wù)器調(diào)用Socket庫的write,將響應(yīng)消息交給協(xié)議棧。這時,需要告訴協(xié)議棧這個響應(yīng)消息應(yīng)該發(fā)給誰,但我們并不需要直接告知客戶端的IP地址等信息,而是只需要給出表示通信使用的套接字的描述符就可以了。套接字中保存了所有的通信狀態(tài),其中也包括通信對象的信息,因此只要有描述符就萬事大吉了。

接下來,協(xié)議棧會將數(shù)據(jù)拆分成多個網(wǎng)絡(luò)包,然后加上頭部發(fā)送出去。這些包中包含接收方客戶端的地址,它們將經(jīng)過交換機(jī)和路由器的轉(zhuǎn)發(fā),通過互聯(lián)網(wǎng)最終到達(dá)客戶端。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容