#前言:從瀏覽器輸入網址到回車看到頁面的過程,面試逃不掉的一個問題,我們知道從瀏覽器輸入網址到看到頁面主要是涉及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