開始:從輸入 URL 到頁面展示中間發生了什麼?
- 咱們能夠把大體過程分爲:域名解析 ->TCP(3次握手)->創建鏈接 ->HTTP請求 ->後臺處理請求 ->HTTP響應 ->關閉鏈接 (4次揮手)->解析HTML ->渲染
一、域名解析
IP地址
- 互聯網上分佈着數以億計的主機,可是他們是經過什麼方式去準確的創建通訊?答案是IP。每一臺主機都有一個對應的IP地址,經過訪問IP地址就能夠準確的和另外一臺主機創建通訊了。
域名解析系統
- 主機之間的通訊創建是經過訪問IP實現的,可是IP的形式相似於(203.208.60.97)。這種數字串不便於咱們的記憶。因此,咱們經過域名解析系統,自動將相似與(www.baidu.com)的網址解析成對應的IP地址。
域名解析過程
- 當咱們輸入(ww.baidu.com)時,系統首先會在本地瀏覽器查看對應緩存,從緩存中查找,若是沒有搜索到,會進入
- 本地緩存,也就是咱們的host文件夾,若是尚未查找到,會進入
- 本地服務器,好比你是學校的網絡,通常就在學校。若是還沒找到,
- 首先本地服務器會向Root Server發送請求信息,而後Root Server 會返回一個gTLD(通用頂級域),接下來本地服務器會訪問gTLD。gTLD會返回Name Server服務器地址,也就是你註冊網絡的服務器提供商的地址。最後NAME Server會把指定域名的ip發送給客戶端
- 這樣域名解析就完成了。
二、TCP三次握手
下面是一張TCP三次握手的過程圖 html
接下來是TCP報文
解釋一下TCP報文中,紅色部分對應(seq)。藍色部分對應(ack)。首先我來解釋一下這張報文,seq是序號字段、ack是確認號(seq+1),ACK是確認序號有效標識。SYN是同步序號標識,用來發起一個鏈接。其餘的自行百度。
- seq 序號字段,每一次傳輸的數據流都有一個序號。當數據到達目的地後,接收端會按照這個序列號把數據從新排列,保證數據的正確性。
- ack 確認號,它是用來分辨是哪一次傳輸的數據流。由於咱們傳輸的數據不只僅是一次,爲了避免打亂順序,咱們會經過(ack=seq+1)來匹配對應的傳輸數據流。若是一個數據段一直沒有被確認,它將會被要求重發。這樣數據的完整性就獲得了保證。
- ACK 確認序號有效標識。只有當ACK=1時確認號字段纔有效。當ACK=0時,確認號無效。在上圖中其實第一次傳輸時應該加上 ACK=0。
- SYN 同步序號標誌,用來發起一個鏈接。SYN=1表示這是一個鏈接請求或鏈接接受請求。因此第三次沒有帶上SYN。由於,不須要在鏈接了。
因此TCP三次鏈接的過程能夠解釋爲:瀏覽器
- 第一次:SYN=1 (請求鏈接), seq=x(傳輸數據流序號),ACK=0(上圖沒有,應該加上)。由於不須要確認數據流因此沒* 有(ack)
- 第二次:SYN=1(接受鏈接) ,ack=x+1(ack=seq+1)確認接受數據流,ACK=1(確認序號),seq=y(傳輸響應數據序號)。
- 第三次:ack=y+1,ACK=1(確認序號),seq=x+1(由於第一次是x)。沒有SYN,由於SYN這個標誌位只有TCP創建鏈接時才被置爲1。
三、HTTP請求
TCP三次握手至關於建立了一個數據流通道,HTTP請求經過這條數據通道進行傳輸。 緩存
HTTP數據流經過程大體能夠經過TCP/IP4層模型來講明:
應用層
應用層直接和應用程序接口(好比,qq,百度),而且提供相應的網絡服務,其中就包括了HTTP協議和DNS協議。DNS協議上文已經解釋了,其實DNS域名解析就是存在於這一層。接下來我要說的就是HTTP協議,它是超文本傳輸協議,它定義了數據傳輸的最終形態。如下是一個簡單的請求報文格式:bash
POST /index.html HTTP/1.1
Connection:keeep-alive
User-Agent: Mozilla/5.0(Windows NT 6.1;rv:15.0) Firefox/15.0
Username=admin&password=admin
複製代碼
HTTP請求頭部信息能夠分爲4部分:服務器
- 請求行,具體內容包括:動詞 路徑 協議/版本 如上圖中的(GET /psot....)。
- 請求頭部,具體形式爲:Key: value ,如上圖中(Connection:keeep-alive)
- 空格()
- 請求數據(Username=admin&password=admin)
下面是一個簡單的響應報文:網絡
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<p>this is http response</p>
</body>
</html>
複製代碼
HTTP響應頭部信息能夠分爲4部分:this
- 響應行,具體內容包括:協議/版本號 狀態碼 狀態解釋 如上圖中的(HTTP/1.1 200 OK.)。
- 響應體,具體形式爲:Key: value ,如上圖中(Content-Encoding: gzip) 空格()
- 響應數據(HTML代碼)
傳輸層
網絡層經過(ip協議)保證了點到點,即主機到主機之間的通訊。而傳輸層,保證了端到端之間的通訊,也就是應用進程之間的通訊。(進程是程序的一次執行。好比每一個IE瀏覽器的窗口都是一個進程實例,它們都是IE瀏覽器程序的一次執行。)傳輸層的協議主要有兩種TCP/UDPspa
- TCP即傳輸控制協議,是一個可靠的、面向鏈接的協議。它容許網絡間兩臺主機之間無差錯的信息傳輸。TCP協議還進行流量控制,以免發送過快而發生擁塞。
- UDP即用戶數據報協議,它採用無鏈接的方式傳送數據,也就是說發送端不關心發送的數據是否到達目標主機,數據是否出錯等。收到數據的主機也不會告訴發送方是否收到了數據,它的可靠性由上層協議來保障。
因此數據流通到傳輸層,會將從應用層獲得的數據進行分割成多個小數據包(TCP報文)。同時,標記上序號和端口號。3d
網絡層
數據通過網絡層,數據會加上IP地址,這樣數據就可以實現主機與主機之間的通訊。網絡層的做用主要是:code
- 路由的選擇,也就是傳輸路線的選擇,存儲轉發,當客戶端傳輸的數據大於轉發給服務器數據的時候,能夠將數據置於本身的緩存中
- 擁塞控制,當預約的傳輸線路,有故障的時候,能夠選擇性的更換傳輸路線。
鏈路層
數據鏈路層在物理提供的服務的基礎上向網絡層提供服務,其最基本的服務是將源自網絡層來的數據可靠地傳輸到相鄰節點的目標機網絡層。(來自百度百科)
4.關閉鏈接(4次揮手)
TCP的4次揮手參考TCP報文來理解就是:
- 第一次,客戶端發送FIN=1即表示斷開鏈接請求
- 第二次,服務器接收到信息後發送ACK=1表示確認收到信息,同時可能存在服務器沒有將數據所有傳輸完成因此
- 第三次,等服務器將數據傳輸完成後,發送FIN=1表示能夠關閉鏈接
- 第四次,客戶端發送ACK=1表示確認收到信息,斷開鏈接。
關於TCP鏈接爲何是3次,斷開須要四次
由於在斷開的時候,服務器須要保證本身的數據傳輸完成,因此,先發送確認信號(ACK=1),等到數據傳輸完成才發送斷開信號(FIN=1)
參考資源: