1. Web服務器的工作原理
我們平時瀏覽網頁的時候,會打開瀏覽器,輸入網址後按下回車鍵,然後就會顯示出你想要瀏覽的內容。在這個看似簡單的用戶行爲背後,到底隱藏了些什麼?
對於普通的上網過程,系統其實是這樣做的:瀏覽器本身是一個客戶端,當你輸入URL
的時候,瀏覽器首先會去請求DNS
服務器,通過DNS
獲取相應域名對應的IP
,然後通過IP
地址找到IP
對應的服務器後,要求建立TCP
連接,等瀏覽器發送完HTTP Request
(請求)包後,服務器接收到請求包之後開始處理請求包,服務器調用自身服務,返回HTTP Response
(響應)包;客戶端收到來自服務器的響應後開始渲染這個Response
包裏的主體(body
),等收到全部的內容,隨後斷開與該服務器之間的TCP
連接。
一個Web
服務器也被稱爲HTTP
服務器,它通過HTTP
協議與客戶端通信。這個客戶端通常指的是Web
瀏覽器(其實手機客戶端內部也是瀏覽器實現的)。
Web
服務器的工作原理可以簡單地歸納如下:
- 客戶端通過
TCP/IP
協議建立到服務器的TCP
連接; - 客戶端向服務器發生
HTTP
協議請求包,請求服務器裏的資源文檔; - 服務器向客戶機發送
HTTP
協議應答包,如果請求的資源包含有動態語言的內容,那麼服務器會調用動態語言的解釋引擎負責處理“動態內容”,並將處理得到的數據返回給客戶端; - 客戶端與服務器斷開。由客戶端解釋
HTML
文檔,在客戶端屏幕上渲染圖形結果。
一個簡單的HTTP
事務就是這樣實現的,看起來複雜,原理其實是挺簡單的。需要注意的是客戶端與服務器之間的通信是非持久連接的,當服務器發送了應答後就與客戶端斷開連接,等待下一次請求。
2. URL和DNS解析
我們瀏覽網頁都是通過URL
實現的,那麼URL
到底是怎麼樣的?
URL(Uniform Resource Locator)
是統一資源定位符的英文縮寫,用於描述一個網絡上的資源,基本格式如下:
scheme://host[:port#]/path/.../[?query-string][#anchor]
scheme 指定底層使用的協議(例如HTTP, HTTPS, FTP)
host HTTP服務器的IP地址或者域名
port# HTTP服務器的默認端口是80,這種情況下端口號可以省略,如果使用了別的端口,必須指明
path 訪問資源的路徑
query-string 發送給HTTP服務器的數據
anchor 錨
DNS(Domain Name System)
是域名系統的英文縮寫,是一種組織成域層次結構的計算機和網絡服務命名系統,它用於TCP/IP
網絡,它從事將主機名或域名轉換爲實際IP
地址的工作。
詳細DNS解析過程如下:
- 在瀏覽器中輸入www.qq.com域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關係,如果有,就先調用這個IP地址映射,完成域名解析;
- 如果hosts裏沒有這個域名映射,則查找本地DNS解析器緩存,是否有這個網址映射關係,如果有,直接返回,完成域名解析;
- 如果hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/IP參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果查詢的域名包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性;
- 如果要查詢的域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,完成域名解析,此解析不具有權威性;
- 如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至“根DNS服務器”,“根DNS服務器”收到請求後會判斷這個域名(.com)是誰來授權管理的,並會返回一個負責該頂級域名解析器的一個IP.本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(qq.com)給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找qq.com域服務器,重複上面的動作,進行查詢,直到找到www.qq.com主機;
- 如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,找根DNS或把請求轉至上一級,以此循環。不管是本地DNS服務器是否使用轉發,還是根提示,最後都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。
所謂“遞歸查詢過程”就是“查詢的遞交者”更替,而“迭代查詢過程”則是“查詢的遞交者”不變。