- 分布式系統架構:技術棧詳解與快速進階
- 張程
- 2284字
- 2020-08-13 13:45:33
3.2.2 傳輸過程
互聯網網絡傳輸基于TCP協議傳輸,TCP三次握手過程,如圖3-1所示。

圖3-1 TCP三次握手交互圖
注意,第1次SYN是請求建立連接,并在其序列號的字段進行序列號的初始值設定。建立連接,設置為1。ACK是確認號是否有效,一般置為1。
第一次握手:建立連接時,客戶端發送SYN包(SYN=1)到服務器,并進入SYN_SENT狀態,等待服務器確認。SYN是同步序列編號(Synchronize Sequence Number)。
第二次握手:服務器收到SYN包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(SYN=1),即SYN+ACK包,此時服務器進入SYN_RECV狀態。
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。
網絡傳輸完畢后,客戶端進程發出連接釋放報文,并且停止發送數據。此時會經過TCP四次揮手,其過程如圖3-2所示。

圖3-2 TCP四次揮手交互圖
注意,第1次FIN是希望斷開連接,一般置FIN為1。揮手處理過程如下。
1)客戶端進程發出連接釋放報文,并且停止發送數據,釋放數據報文首部,FIN=1,序列號為seq=u,TCP規定FIN報文段不攜帶數據也要消耗一個序號。
2)服務器接收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自身序列號seq=v,服務端進入CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端沒有數據要發送,但是服務器若發送數據,客戶端依然要接收。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。
3)收到服務器的確認請求后,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接收服務器發送的最后的數據)。
4)服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于處于半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,那么服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。
5)客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。
6)服務器只要收到了客戶端發出的確認信息,就會立即進入CLOSED狀態,同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。
互聯網中Web請求過程如圖3-3所示。

圖3-3 Web請求過程圖
注意,輸入URL地址或點擊URL鏈接后,瀏覽器打開呈現的請求過程具體分為以下步驟。
1)查找DNS,解析出與URL對應的IP地址(公網IP)。
2)初始化網絡連接(包括TCP三次握手)。
3)發送HTTP請求。
4)通過網絡傳輸請求到服務器。
5)Web服務器接收請求,經過處理轉發到Web應用。
6)Web應用處理請求,如MVC框架,返回內容。
7)通過網絡傳輸應答內容到前端瀏覽器。
8)瀏覽器解析從服務器返回的應答內容,并開始渲染和繪制。
9)根據HTML內容來構建DOM(文檔對象模型)。
10)加載和解析樣式,構建CSSOM(CSS對象模型)。
11)根據DOM和CSSOM來構建渲染樹,按照文檔順序從上到下依次進行。
12)根據渲染樹的過程,適當把已經構建好的部分繪制到界面上,中間會伴隨著重繪和回流,循環操作,直到渲染繪制完成。
13)整個頁面加載完成,觸發OnLoad事件。
詳細流程分析如下。
1)要通過URL將請求發送到服務器,瀏覽器就要知道這個URL對應的IP是什么,只有知道了IP地址,瀏覽器才能將請求發送到指定服務器的具體IP和端口。瀏覽器的DNS解析器負責把URL解析為正確的IP地址,這個解析很花時間,而且在解析過程中,瀏覽器不能從服務器那里下載任何東西。瀏覽器和操作系統提供了DNS解析緩存支持。
2)獲取IP之后,瀏覽器會請求與服務器建立連接,TCP經過3次握手后建立連接通道。
3)瀏覽器真實發送HTTP請求,發送請求報文,包含請求行(包含請求方法、URI、HTTP版本信息;請求首部字段)、請求內容實體、空行。
- 通用首部字段(請求報文與響應報文都會使用的首部字段)如下。
-
- Date:創建報文時間。
- Connection:連接的管理。
- Cache-Control:緩存的控制。
- Transfer-Encoding:報文主體的傳輸編碼方式。
- 請求首部字段(請求報文會使用的首部字段)如下。
-
- Host:請求資源所在服務器。
- Accept:可處理的媒體類型。
- Accept-Charset:可接收的字符集。
- Accept-Encoding:可接受的內容編碼。
- Accept-Language:可接受的自然語言。
4)網絡開始傳輸請求到服務器,這個會包含很多時間,如網絡阻塞時間、網絡延遲時間、真正傳輸內容時間等。
5)Web服務器收到請求,會根據URL上下文轉交給相應Web應用進行處理。
6)Web應用會進行很多處理,如filter、aop前置處理、IOC處理、創建對象,處理后會生成Response對象。熟悉Spring的讀者對此過程會更清晰。
7)返回HTTP響應報文,包含狀態行(包含HTTP版本、狀態碼、狀態碼的原因短語)、響應首部字段、響應內容實體、空行。
- 響應首部字段(響應報文會使用的首部字段):
-
- Accept-Ranges:可接收的字節范圍。
- Location:令客戶端重新定向到的URI。
- Server:HTTP服務器的安裝信息。
- 實體首部字段(請求報文與響應報文的實體部分使用的首部字段):
-
- Allow:資源可支持的HTTP方法。
- Content-Type:實體主類的類型。
- Content-Encoding:實體主體適用的編碼方式。
- Content-Language:實體主體的自然語言。
- Content-Length:實體主體的的字節數。
- Content-Range:實體主體的位置范圍,一般在發出部分請求時使用。
8)通過網絡將應答內容傳送回前端瀏覽器,先返回HTML代碼,不包含圖片、外部腳本、CSS等。
9)在瀏覽器解析頁面進行渲染和繪制,具體過程如下:
a)裝載和解析HTML文檔,構建DOM,如果在解析過程中發現需要其他資源,如圖片,瀏覽器會發出獲取資源的請求;
b)裝載和解析CSS,構建cssom;
c)根據DOM和cssom構建渲染樹;
d)對渲染樹節點進行布局處理,確認其屏幕位置;
e)將渲染好的節點繪制到界面上,渲染引擎不會等到所有HTML都解析完后才創建布局渲染樹,而是在處理解析渲染樹的同時向后端請求資源。