官术网_书友最值得收藏!

3.2.2 傳輸過程

互聯網網絡傳輸基于TCP協議傳輸,TCP三次握手過程,如圖3-1所示。

058-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所示。

059-1

圖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所示。

060-1

圖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都解析完后才創建布局渲染樹,而是在處理解析渲染樹的同時向后端請求資源。

主站蜘蛛池模板: 邹城市| 宜阳县| 婺源县| 兰坪| 都兰县| 新野县| 鹰潭市| 台安县| 庄浪县| 海宁市| 油尖旺区| 宜君县| 河南省| 额敏县| 溆浦县| 教育| 闽清县| 墨玉县| 集安市| 泌阳县| 滨海县| 兴山县| 秦安县| 晋中市| 泗洪县| 青田县| 威远县| 德令哈市| 阜康市| 康定县| 通许县| 佳木斯市| 南安市| 张家港市| 丰镇市| 成武县| 乌审旗| 鞍山市| 高雄市| 谷城县| 肥乡县|