從輸入域名到網頁打開的簡單過程如下,還附加我自己的理解:
1.DNS域名解析
客戶端輸入域名后,由DNS服務器來將域名解析成對應服務器的IP地址
2.建立TCP連接;
獲得服務器IP之后,就需要三次握手的協議才能建立連接
1)客戶端發送SYN包請求,等待服務器確認
2)服務器確認收到SYN包請求后,同時自己也返回一個包給客戶端,即返回SYN+ACK
3)客戶端收到SYN+ACK包之后,返回給服務器一個確認包ACK包表示收到,然后雙方達成協議,建立連接
3.發送HTTP請求;
與服務器建立連接之后,就可以向服務器發送請求了,請求需要遵循http協議
4.服務器處理請求;
被請求的服務器解析用戶請求的有哪些資源,通過服務器返回數據給客戶端
5.返回響應結果;
給客戶端返回請求的狀態碼,通過狀態碼可以知道服務器端的處理是否正常
常見狀態碼:狀態碼
100 Continue 繼續,客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕
200 OK 請求成功,表示正常狀態
301 Moved Permanently 請求的網頁已永久移動到新位置。
400 Bad Request 語義有誤,當前請求無法被服務器理解。或者是請求參數有錯誤
404 Not Found 請求失敗,請求所希望得到的資源未被在服務器上發現。多數情況是找不到輸入域名對應的網頁。
500 Internal Server Error 一般來說,這個問題都會在服務器端的源代碼出現錯誤時出現。。
6.瀏覽器渲染:
返回成功之后,瀏覽器拿到請求頁面的代碼,將其解析渲染出來。解析和渲染的過程主要由瀏覽器的渲染引擎實現
7. 斷開連接:
數據傳輸完畢,需要斷開tcp連接,此時tcp發起4次揮手
1)客戶端發送給服務器,告訴服務器需要關閉tcp了
2)服務器發送給客戶端,告訴客戶端我准備一下就關閉
3)服務器發送給客戶端,告訴客戶端我已經准備好關閉了
4)客戶端發送給服務器,告訴服務器我也准備好關閉了。
我自己是用 "到外面吃飯" 這種方式來理解的:
1. 比如我要到某某餐館吃飯,我先在地圖上搜 餐館在哪里,然后通過導航 找到該餐館(域名解析)
2. 到達餐館過后,我想我到底要吃什么:(建立連接)
1) 摸了摸口袋里的錢,發現只有兩塊錢,然后詢問老板有沒有兩元的東西。(客戶端發送包,等待服務器確認)
2) 老板一看我的樣子,就知道是個窮逼(服務器收到包),然后說只有饅頭價格兩元一個!(再返回一個包)
3) 我欣喜若狂,掏出我壓箱底的兩元錢,告訴老板我要了(客戶端返回一個包),老板表示蚊子再小也是肉,就接受了這個訂單。我們快樂地達成了協議(達成協議)
3. 老板給后廚說准備一個饅頭(發送http請求)。
4. 后廚收到請求之后,開始准備饅頭的材料(處理請求)。
5. 沒過多久,我就拿到了熱騰騰的饅頭(返回響應結果)。
6. 拿到饅頭之后我就開始了愉快的進食過程。(渲染)
7. 吃飽之后就離開餐館:(斷開連接)
1)我對老板說:老板,結賬,我准備走了
2)老板對我說:稍等一下,馬上就來
3)老板又對我說:一共兩元。
4)我付了賬,對老板說:這饅頭真好吃,我下次再來。
雖然上面的過程和真實的響應過程對應起來比較牽強,但是這能夠幫助我理解什么時候是做什么事情,並不像原來一樣全靠記憶。