一、?從輸入URL到頁面展示到底發生了什么?
1. 首先瀏覽器會查看電腦本地緩存,如果有直接返回,否則需要進行下一步的網絡請求。
2. 在網絡請求之前,需要先進行DNS解析,來找到請求域名的ip地址。如果是HTTPS請求,則還需要建立TLS連接。
【DNS解析過程:假設你是一個旅行者到一個陌生城市問路,首先你會先問到隨便一個路人(本地瀏覽器緩存),再問到一個本地居民(本地host文件),還是不知道路,此時你可能會看看路標(路由器緩存),最終你還是被自己路癡屬性給震驚了,請了一個導游(DNS服務器),還是不行,最終問了導游基地的人(根DNS服務器),真好奇你去了個啥地方,最終找到了請求域名的ip地址。原來是一家有名的餐館!】
3. 建立通道:瀏覽器與服務器ip地址建立TCP連接。連接建立好之后,瀏覽器把請求頭,請求行等信息,再加上和該域名相關的cookies一起發送給服務器。(配送原材料和訂單信息)
4. 服務器收到請求頭信息,根據請求頭生成響應數據。(根據原材料和訂單信息,制作出一道美味的菜,并且用盒子打包好)
5. 瀏覽器解析響應頭,如果響應頭狀態碼是301,302,會重定向到新地址;如果是字節流類型,會將請求提交給下載管理器;如果是HTML類型,會進行下一步渲染(查看盒子外殼附有的信息)
6. 瀏覽器解析HTML文件,呈現最終渲染界面(品嘗美味佳肴~)
二、三次握手
第一次握手:客戶端向服務器端發送SYN報文,初始化序列號ISN(seq = x),然后客戶端進入SYN_SEND狀態,等待服務器確認。
第二次握手:服務器發送ACK確認客戶端SYN報文(ack = x + 1),然后再發送一個SYN(seq = y),服務器端進入SYN_RECV狀態。
第三次握手:客戶端接收到ACK, SYN報文,ACK確認服務器端(ack = y + 1),然后客戶端和服務器端都進入ESTABLISHED狀態。
就像是在建立一個友誼的過程一樣:
-
打招呼:
想象你和一個新朋友第一次見面。你會向他們打個招呼,說:“嗨,你好!”這就像是客戶端(你)向服務器(新朋友)發送了一個“嗨,你好”的消息,告訴服務器你想和它建立連接。 -
確認招呼:
新朋友收到你的招呼后,會回復:“嗨,你好!”。這時,你知道對方愿意和你成為朋友。這就像是服務器回復一個“嗨,你好”的消息,并表示愿意和你建立連接。這時,雙方都知道對方想要建立連接。 -
最后確認:
你想確認一下朋友確實愿意和你一起玩,于是你說:“好的,我們一起玩吧!”這就像是客戶端發送最后一條消息,表示確認建立連接。而服務器也確認了,于是雙方都知道可以開始愉快地交流了。
解釋一下SYN
SYN是TCP(傳輸控制協議)中的一個標志位,代表同步(Synchronize)。在TCP的三次握手過程中,SYN用于建立連接的初始階段。
具體來說,在三次握手中的第一步,客戶端發送一個帶有SYN標志的TCP報文給服務器。這個報文告訴服務器客戶端想要建立連接,并且包含了一些初始化的序列號。這個序列號用于標識數據流的起始點。
服務器在收到帶有SYN標志的TCP報文后,會回復一個帶有SYN和ACK(確認)標志的報文。這個報文表明服務器同意建立連接,并且服務器也選擇了自己的初始化序列號。
SYN標志的使用是為了在建立連接時進行同步,確保客戶端和服務器在傳輸數據之前都了解對方的狀態,并且序列號的初始化是同步的。這有助于防止混淆和確保可靠的數據傳輸。
3. 四次揮手
-
告別請求:
想象你和朋友在一起愉快玩耍,但是你覺得差不多該回家了。于是,你告訴朋友:“我要回家了,再見!”這就像是客戶端發送一個FIN報文給服務器,表示希望斷開連接,并且報文中有一個序列號seq=x。 -
確認告別:
你的朋友接收到你的告別后,會回應:“好的,再見!”這就像是服務器回復一個ACK報文給客戶端,同時把你的序列號值+1,作為ACK報文的序列號seq=x+1。這時,服務器進入CLOSE-WAIT狀態,而客戶端進入FIN-WAIT-2狀態。 -
朋友也要告別:
現在輪到你的朋友想回家了,他也告訴你:“我也要回家了,再見!”這就像是服務器發送一個FIN報文給客戶端,報文中有一個序列號seq=y+1,然后服務器進入LAST-ACK狀態。 -
最后確認告別:
你收到朋友的告別后,回應:“好的,再見!”這就像是客戶端發送一個ACK報文給服務器,同時把朋友的序列號值+1作為ACK報文的序列號seq=y+2。此時客戶端進入TIME-WAIT狀態,而服務器在收到你的ACK報文后進入CLOSE狀態。如果客戶端等待2MSL(Maximum Segment Lifetime)沒有收到回復,才最終關閉連接。
為什么會有四次揮手,因為TCP是全雙工通信,可以雙向傳輸數據。任何一方都可以在數據傳送結束后發出連續釋放的通知。
4. TCP與UDP
TCP(傳輸控制協議 Transmission Control Protocol):面向連接,可靠,基于字節流的傳輸層通信協議。
UDP(用戶數據報協議User Datagram Protocol):為應用程序提供了一種無需建立連接就可以發送封裝的IP數據包的方法。
類比一下:
TCP,可靠快遞服務:
- 概念: TCP就像一種可靠的快遞服務,是一種有序、向連接的服務,確保數據按照順序安全地傳送。
- 特點: 它就像你寄出的包裹,有詳細記錄、需要簽收、傳輸慢但可靠,占用的資源較多。
UDP,快速直達服務:
- 概念: UDP則是一種快速直達的服務,不需事先建立連接,直接發送數據,速度快但不保證可靠性。
- 特點: 這就像你隨手扔出的明信片,速度快,但可能有些信件丟失,資源消耗較少。
區別:
- 連接性: TCP像是有追蹤號的包裹,而UDP則是不需要追蹤號的明信片。
- 可靠性: TCP提供有序、可靠的服務,就像精細的快遞服務,而UDP則不做保證,數據傳遞不需要給出任何確認,且不保證數據不丟失以及到達順序,就像簡單的明信片。
- 狀態: TCP保留發送和接收的狀態,而UDP則是無狀態的,不保留記錄。
- 傳輸形式: TCP面向字節流的,像是整體傳輸的包裹,而UDP面向報文的,則是一張張獨立的明信片。
- 效率: TCP由于追蹤號等機制,效率較低,而UDP由于簡單,傳輸較快。
使用場景:
- TCP: 適用于對數據可靠性要求高的場景,如網頁瀏覽、文件傳輸、郵件傳輸等,就像你寄重要文件的包裹。
- UDP: 適用于對速度要求高,能容忍少量數據丟失的場景,如視頻直播、實時游戲,就像你發送一些小禮物的明信片。