URL
是統一資源定位符(Uniform Resource Locator),是資源標識最多見的形式。URL
描述了一臺特定服務器上某資源的特定位置。它們能夠明確說明如何從一個精確、固定的位置獲取資源。瀏覽器
URL
說明了協議、服務器和本地資源。緩存
而瀏覽器都是基於HTTP
協議,而HTTP
是個應用層的協議。HTTP
無需操心網絡通訊的具體細節都交給了TCP/IP
。
TCP
:性能優化
HTTP協議位於TCP的上層。HTTP使用TCP來傳輸其報文數據。服務器
當用戶輸入一個完整的URL
以後,瀏覽器就開始解析URL
的構成,以便於查找資源地址,大多數URL的語法通用格式以下:網絡
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
複製代碼
基本上沒有哪一個URL
包含了全部這些組件。URL
最重要的3個部分是方案scheme
,主機host
和路徑path
。
若是URL
中不包含port
,瀏覽器會默認使用80
端口進行訪問。post
DNS
( Domain Name System)是「域名系統」的英文縮寫,DNS是應用層協議,事實上他是爲其餘應用層協議工做的,包括不限於HTTP和SMTP以及FTP,用於將用戶提供的主機名解析爲ip地址。性能
DNS 查詢的過程以下圖所示。 優化
在瀏覽器中輸入www.qq.com
域名,操做系統會先檢查本身本地的hosts
文件是否有這個網址映射關係,若是有,就先調用這個IP
地址映射,完成域名解析。spa
若是hosts
裏沒有這個域名的映射,則查找本地DNS
解析器緩存,是否有這個網址映射關係,若是有,直接返回,完成域名解析。操作系統
若是hosts
與本地DNS
解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip
參數中設置的首選DNS
服務器,在此咱們叫它本地DNS
服務器,此服務器收到查詢時,若是要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具備權威性。
若是要查詢的域名,不禁本地DNS
服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP
地址映射,完成域名解析,此解析不具備權威性。
若是本地DNS
服務器本地區域文件與緩存解析都失效,則根據本地DNS
服務器的設置(是否設置轉發器)進行查詢,若是未用轉發模式,本地DNS
就把請求發至13臺根DNS
,根DNS
服務器收到請求後會判斷這個域名(.com
)是誰來受權管理,並會返回一個負責該頂級域名服務器的一個IP
。本地DNS
服務器收到IP
信息後,將會聯繫負責.com
域的這臺服務器。這臺負責.com
域的服務器收到請求後,若是本身沒法解析,它就會找一個管理.com
域的下一級DNS
服務器地址(http://qq.com
)給本地DNS
服務器。當本地DNS
服務器收到這個地址後,就會找http://qq.com
域服務器,重複上面的動做,進行查詢,直至找到www.qq.com
主機。
若是用的是轉發模式,此DNS
服務器就會把請求轉發至上一級DNS
服務器,由上一級服務器進行解析,上一級服務器若是不能解析,或找根DNS
或把轉請求轉至上上級,以此循環。不論是本地DNS
服務器用是是轉發,仍是根提示,最後都是把結果返回給本地DNS
服務器,由此DNS
服務器再返回給客戶機。
從客戶端到本地DNS
服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是迭代查詢。
TCP
根據不一樣的當前狀態(常規或加星)所發送的內容:常規狀態 | 說 明 | 發 送 | 加 星 狀 態 | 發 送 |
---|---|---|---|---|
CLOSED | 關閉 | RST, ACK | ||
LISTEN | 監聽鏈接請求(被動打開) | |||
SYN_SENT | 已發出SYN (主動打開) | SYN | SYN_SENT* | SYN, FIN |
SYN_RCVD | 已經發出和收到SYN;等待ACK | SYN, ACK | SYN_RCVD* | SYN, FIN, ACK |
ESTABLISHED | 鏈接已經創建(數據傳輸) | ACK | ESTABLISHED* | SYN, ACK |
CLOSE_WAIT | 收到FIN,等待應用程序關閉 | ACK | CLOSE_WAIT* | SYN, FIN |
FIN_WAIT_1 | 已經關閉,發出FIN;等待ACK和FIN | FIN, ACK | FIN_WAIT_1 | SYN, FIN, ACK |
CLOSING | 兩端同時關閉;等待ACK | FIN, ACK | CLOSING* | SYN, FIN, ACK |
LAST_ACK | 收到FIN已經關閉;等待ACK | FIN, ACK | LAST_ACK* | SYN, FIN, ACK |
FIN_WAIT_2 | 已經關閉;等待FIN | ACK | ||
TIME_WAIT | 主動關閉後長達2 M S L的等待狀態 | ACK |
TCP
中定義了7個擴展狀態,這些擴展狀態都稱爲加星狀態。它們分別是:SYN_SENT*
、 SYN_RCVD*
、ESTABLISHED *
、CLOSE_WAIT *
、LAST_ACK *
、FIN_WAIT_1 *
和CLOSING *
。
TCP
輸入的處理順序TCP
協議收到報文段時,對其中所攜帶的各類控制信息 ( SYN
、FIN
、ACK
、URG
和RST
標誌,還可能有數據和選項 )的處理順序不是隨意的,也不是各類實現能夠自行決定的。
從 CLOSED
狀態到SYN_SENT
狀態的變遷就標明發送了一個SYN
報文段。在圖中則沒有采用這種標記方法,而是在每一個狀態框中標出處於該狀態時要發送的報文段類型。例如,當處於SYN_RECV
狀態時,要發出一個帶有 SYN
的報文段,其中還包括對所收到SYN
的確認( ACK
)。而當處於CLOSE_WAIT
狀態時,要發出 對所收到FIN
的確認( ACK
)。
咱們之因此要這樣作是由於,在TCP
協議中咱們常常須要處理可能形成屢次狀態變遷的 報文段。因而在處理一個報文段時,重要的是處理完報文段後鏈接所處的最終狀態,由於它決定了應答的內容。而若是不使用TCP
協議,每收到一個報文段一般至多隻引發一次狀態 變遷,只有在收到SYN/ACK
報文段時纔是例外。
客戶端和服務器之間創建鏈接須要通過三次確認的階段,咱們稱之爲TCP
的三次握手。
客戶端發送一個
syn
報文,設置發送序號爲X
,客戶端進入SYN_SENT
狀態,等待服務器迴應。
服務端收到
syn
報文,可是服務端必須肯定客戶端的syn(ack= X + 1)
, 所以服務端也要發送一個syn=Y
給客戶端進行確認,表示服務端已經收到客戶端的請求。
服務端須要發送ack+syn
給客戶端,此時服務器進入SYN_RECV
狀態。
客戶端收到服務器的syn+ack
包,向服務器發送確認包ack(ack=Y+1)
,此包發送完畢,客戶端和服務器進入ESTABLISHED
(TCP
鏈接成功)狀態,完成三次握手。
好比你走在路上,發現前面有你的朋友向你走過來,你向你朋友揮手(第一次握手)。
你朋友看見了你向他打招呼,可是你朋友由於距離你太遠,並不肯定是不是跟他打招呼的,所以,你朋友用手指了下本身,並向你示意(第二次握手)。
你看見了你朋友的表情和動做,你須要給你朋友一個確定,此時,你點頭示意(第三次握手)。
此時你和你朋友互相聊天(TCP已鏈接
)。
因爲TCP
鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。
這原則是當一方完成它的數據發送任務後就能發送一個FIN
來終止這個方向的鏈接。收到一個 FIN
只意味着這一方向上沒有數據流動,一個TCP
鏈接在收到一個FIN
後仍能發送數據。
首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
TCP
客戶端發送一個FIN
,用來關閉客戶到服務器的數據傳送。FIN
,它發回一個ACK
,確認序號爲收到的序號加1。和SYN
同樣,一個FIN
將佔用一個序號。FIN
給客戶端。ACK
報文確認,並將確認序號設置爲收到序號加1。你和你朋友聊天,聊着聊着,忽然想起來女友鑰匙丟了,你是回家開門的,如今耽誤了半小時了,嚇得冷汗都出來了,一想起榴蓮。。。
這個時候,你趕忙跟你朋友說了狀況,你說你立刻得回去了,下次再聊(第一次揮手)。
你朋友聽了,以爲也是得趕忙回去,就跟你說你趕忙回去吧。(第二次揮手)。
而後,你朋友走了,並向你揮手作別(第三次揮手)。
你看見你朋友跟你作別,你一樣也跟你朋友作別(第四次揮手)。
回去以後,你就須要玩玩你的榴蓮了。
查看下篇文章 瀏覽器渲染原理(性能優化之如何減小重排和重繪)
參考文章:
一、HTTP
權威指南。
三、TCP-IP
詳解卷