#前言:從瀏覽器輸入網址到回車看到頁面的過程,面試逃不掉的一個問題,我們知道從瀏覽器輸入網址到看到頁面主要是涉及DNS解析,TCP三次握手,請求報文,響應報文,TCP4次揮手。
#首先我們先來看一下總體的訪問過程
#總體的訪問過程:首先會進行DNS解析,然後解析得到地址之後客戶端和web伺服器會建立一條TCP連線,其中有一個TCP三次握手過程,當完成握手之後客戶端就會向瀏覽器傳送一條請求報文,伺服器然後進行響應,接著當資料傳輸完之後,伺服器和客戶端有一個TCP四次揮手過程,來結束連線。
#然後我們來將過程分解一下
#dns解析流程
在瀏覽器中輸入網址回車後,首先系統會去找這個域名對應的ip,然後再根據這個ip地址查詢web伺服器, 這裡面有個DNS解析流程 1、系統首先查詢本地的DNS快取和hosts檔案資訊,確認是否有www.baidu.com對應的ip地址,如果有就直接訪問 這個ip地址對應的www.baidu.com web伺服器 2、如果沒有,那麼系統會將解析請求傳送給本機網路卡指定的DNS伺服器,稱為LDNS(本地dns),如果本地DNS伺服器 中有域名www.baidu.com所對應的的ip地址,就會去訪問這個IP對應的web伺服器,如果沒有就去請求其他DNS伺服器 3、LDNS伺服器會從根域名伺服器開始對於域名www.baidu.com的解析,全球有13臺根伺服器,根域名伺服器沒有 www.baidu.com的解析記錄,有.com頂級域的解析記錄,然後把.com所對應的DNS伺服器地址返回給LDNS伺服器 4、LDNS獲取到.com的DNS伺服器地址之後,就去.com伺服器請求www.baidu.com域名的解析,.com裡面也沒有www .baidu.com域名對應的地址,但是有baidu.com域名的解析記錄,然後.com伺服器將baidu.com對應的DNS伺服器地址 返回給LDNS, 5、同理LDNS去找baidu.com的DNS伺服器請求www.baidu.com的域名解析,然後baidu.com域名DNS伺服器將www.baidu.com地址對應的IP解析記錄傳送回給LDNS 6、LDNS把解析出的結果www.baidu.com對應的ip地址傳送給客戶端的瀏覽器,然後也記錄到快取中
#瀏覽器通過解析後得到的ip地址和埠號與web伺服器建立一條TCP連線通道
#tcp3次握手過程
三次握手指一個TCP連線時,需要客戶端和伺服器總共傳送3個包 第一次握手:建立連線時,客戶端A傳送syn包(syn=j)到伺服器B,並進入Syn_send狀態,等待伺服器B確認 第二次握手:伺服器B收到syn包,必須確認客戶A的syn(ACK=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,然後伺服器B進入SYN_RECV狀態 第三次握手:客戶端A收到伺服器B的SYN+ACK包,向伺服器B傳送確認包ACK(ACK=k+1),包傳送完畢,客戶端A和服務端B進入ESTABLISHED狀態,完成三次握手
#建立TCP連線時,瀏覽器向web伺服器傳送一條HTTP請求報文
請求報文包括:請求行,請求頭部,空白行,請求報文主體 請求行: 用來說明客戶端想要做什麼,內容包括方法欄位(請求方法包括:GET:請求指定資源,HEAD,請求響應報文的首部, POST:提交資料到伺服器,PUT:傳送的資料取代指定的文件內容,DELETE:刪除Request-URI所標識的資源,MOVE: 移動)、URL欄位以及HTTP協議版本(最開始的0.9版本,後來又有了1.0,1.1,2.0,其中1.1是主流) 請求頭: 通過客戶端把請求的相關資訊發給伺服器,內容包括媒體型別,語言型別,主機名等資訊 空行: 告訴伺服器空行以下內容不屬於請求頭部資訊 請求報文主體: 用來說明客戶端具體想要做的事情
#有請求報文來請求伺服器,就會有伺服器端去響應,為響應報文
響應報文包括:狀態行,響應頭部,空白行,響應報文主體 狀態行 用來說明伺服器響應客戶端的狀態,包括一些狀態碼資訊:一些比較重要的狀態碼資訊有: 200-ok 訪問成功 301-moved permanently 永久跳轉 403-Forbidden 禁止訪問,服務端設定了相關許可權,客戶端沒有許可權去訪問 404-Not Found 沒有找到訪問的頁面,客戶端請求的頁面不存在 500-Internal servr error 內部伺服器錯誤 502-Bad gateway 壞的閘道器 503-Service Unavailble 服務不可用,服務超載或停機 504-Gateway Timeout 閘道器超時,沒有在特定時間內處理請求 響應頭將伺服器響應的相關資訊發給客戶端 空行: 告訴客戶端空行一下內容不屬於響應頭部資訊 響應報文主體: 將web服務資料資源返回給客戶端 包括靜態網頁資源,動態網頁資源,和偽靜態資源 純html格式的為靜態網頁,服務端寫的什麼就返回什麼給客戶端 常見的靜態網頁字尾有html htm xml 以.php .js .aspx結尾的為動態網頁,以資料庫為基礎,可以實現很多功能 偽靜態網頁是通過一些技術(如rewrite重寫)將動態的URL偽裝成靜態的URL,但實際上還是動態的URL
#當完成資料傳輸之後,就會有一個四次揮手的過程來進行斷開連線
#tcp4次揮手過程
第一次揮手
客戶端A傳送一個FIN,用來關閉客戶端A到伺服器B的資料傳送
第二次揮手
伺服器B收到這個FIN,會回一個ACK,確認序號為收到的序號加1
第三次揮手
伺服器B關閉與客戶端A的連線,傳送一個FIN給客戶端A
第四次揮手
客戶端A發回ACK報文確認,並將確認序號設定為收到序號加1