1、瀏覽器和服務器的交互原理css
(一)、瀏覽器和服務器交互的簡單描述:html
1.通俗描述:咱們平時經過瀏覽器來訪問網站,其實就至關於你經過瀏覽器去訪問一臺電腦上訪問文件同樣,只不過瀏覽器的訪問請求是由被訪問的電腦上的一個 WEB服務器軟件來接收處理,它會分析接收到的請求信息,從而按照請求信息來找到服務器電腦上的文件,通過處理,最終將生成的內容發回到瀏覽器。java
簡單的說就是:由瀏覽器生成一條「命令」,經過互聯網發給另外一臺電腦的某個軟件(服務器軟件);服務器軟件接收到「命令」,就分析理解這個「命令」,而後按照「命令」找到服務器電腦上的文件,將文件內容發送回瀏覽器。web
2.經過上圖,咱們看到了瀏覽器和服務器交互的簡單過程。如今,咱們要想一想,瀏覽器和服務器軟件究竟是神馬東東,他們之間又是如何交互信息的呢?數據庫
其實,瀏覽器和服務器軟件,就是兩個獨立的應用程序(就如qq、office、畫圖工具同樣)。那麼兩個應用程序之間要交互信息,就牽扯到了應用程序通訊的問題。那他倆是使用神馬方式通訊的呢?api
答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟件-沒有控件的ASP.NET》。瀏覽器
瀏覽器和服務器軟件經過套接字來發送和接收對方的信息,但如今的關鍵問題是,他們發送和接收的究竟是什麼?--- 基於Http協議的報文數據(詳見《Http協議介紹---沒有控件的ASP.NET》)。緩存
也就是說:瀏覽器和服務器軟件其實就是兩個使用Socket進行通訊的的兩個應用程序:雙方都發送按照 Http協議語法規範組織的數據,接收到數據後都按照 Http協議語法規範來解釋。服務器
(二)、瀏覽器和IIS(or other webserver)交互機制多線程
上圖就是IIS (服務器軟件)
1.瀏覽器和IIS交互過程:
咱們都知道,在互聯網上肯定一臺電腦的位置是使用IP尋址,但爲何當咱們平時訪問網站時直接輸入一個域名也可以訪問到某個服務器電腦進而由對方的服務器軟件發送響應頁面數據給我呢?下面我把簡單步驟列出:
(1)在瀏覽器輸入網址:www.oumind.com/index.html,瀏覽器按照Http協議語法 生成請求報文數據。
(2).瀏覽器檢查本機是否保存了www.oumind.com/index.html. 域名對應的服務器IP地址。若是沒有,則發送請求到所在城市網中最近的DNS服務器(域名解析服務器),它會根據咱們發送來的域名查詢到該域名對應的服務器IP地址,併發送回瀏覽器。
(3)瀏覽器從DNS服務器得到了 www.oumind.com/index.html域名對應的服務器電腦IP,則將 請求報文 經過Socket發送到服務器電腦。(注意:Http協議 規定服務器軟件使用的默認端口是80,通俗的說,就是若是瀏覽器訪問一個網站頁面,瀏覽器默認就是將 請求報文 發送到服務器80端口,而服務器負責監聽這個端口的軟件通常就是服務器軟件—好比asp.net用的IIS,java用的Tomcat。)
(4)IIS接收到 請求報文,分析請求報文,從中獲取請求的頁面路徑 /index.html。判斷頁面的後綴名,若是是靜態頁面(.html/.jpg/.css/.js等),則直接由IIS軟件的組件讀取該文件內容,並將內容經過Socket發送回瀏覽器。
(5)但若是此時請求的是一個動態頁面(.aspx/.ashx),IIS本身就處理不了 (由於IIS軟件開發出來的時候,ASP.NET程序還不存在呢) 。因此,IIS就去它的 擴展程序映射表 中根據被請求文件後綴名 查看是否有可以處理這種文件的擴展程序。
而咱們ASPNET中經常使用的文件.aspx/.ashx等 對應的處理程序是aspnet_isapi.dll。以下圖:
(6)若是IIS根據後綴名找到對應的處理程序,則經過調用此程序來處理瀏覽器發送來的請求報文。
至於,以後又進行了什麼操做,請繼續關注:
《ASP.NET運行機制原理02_ASP.NET總體運行機制01從瀏覽器到HttpApplication ---沒有控件的ASP.NET》
轉載請註明出處:ASP.NET運行機制原理01---瀏覽器與IIS的交互過程 開智網 http://www.oumind.com
IIS自身是不能處理像ASPX擴 展名這樣的頁面,只能直接請求像HTML這樣的靜態文件,之因此能處理ASPX這樣擴展名的頁面,是由於IIS有一個ISAPI過濾器,它是一個COM組 件。ASP.NET服務在註冊到IIS的時候,就會添加一個Win32的擴展動態庫aspnet_isapi.dll。並將擴展能夠處理的頁面擴展名(如 ASPX)註冊到IIS裏面。擴展啓動後,就根據定義好的方式來處理IIS所不能處理的頁面。
當客戶端請求一個服務器資源時,這個 HTTP請求會被inetinfo.exe進程截獲(www服務),而後Check請求資源的類型,並依據資源映射信息(存儲在IIS元庫中,一種IIS 專用的配置數據庫)將請求的資源分配給特定的處理程序模塊。若請求的是靜態資源(img,text,html等)則由IIS處理(IIS在本地Web Server上訪問請求的文件),將內容輸出到控制檯,發出請求的瀏覽器就能接收到它了。若須要在服務器端處理的請求,則會被傳到已註冊的擴展模塊 中,aspx請求會被分配給aspnet_isapi.dll,讓這個程序開始處理代碼,生成標準的HTML代碼,而後將這些HTML加入到原有的 HTML中,最後把完整的HTML返回給IIS,IIS再把內容發送到客戶瀏覽器。
ASP.NET FrameWork對請求的處理:
上面說到IIS將像ASPX這樣的頁面分配給aspnet_isapi.dll,接着處理以下:
一、aspnet_isapi.dll則會 經過一個Http PipeLine的管道將這個Http請求發給w3wp.exe(iis 工做者進程,IIS6.0中叫作 w3wq.exe,IIS5.0中叫作 aspnet_wp.exe),以後asp.net framework就會經過HttpRuntime來處理這個Http請求。
二、HttpRuntime首先會肯定處理該請求的類名,HttpRuntime經過公共接口IHttpHandler來調用該類獲取被請求資源的類的實例。
三、調用HttpRuntime.ProcessRequest開始處理要發送到瀏覽器的頁面,具體說就是建立一個HttpContext實例,它封裝了全部與請求有關的http特有的信息,並初始化一個Write對象用於緩存標記代碼。
四、HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程序的對象。由HttpApplication Factory負責返回HttpApplication實例。
五、HttpApplication實例會讀取web.config中全部HttpModule的配置。
五、HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程序)給HttpRuntime對象。一個頁面只是個http處理程序對象。
六、最後由HttpRuntime對象調用IHttpHandler的頁面對象的ProcessRequest方法。