TCP/IP網路模型
在某某大廠面試中,面試官問: 『例如一個a.js載入了4秒鐘,如何看時間都花到哪些地方去了?如何去優化?』。當時想到得首先是chorme的調試工具可以查看某個http請求花了多少時間,後面面試官引導是想問tcp/ip,但由於對於tcp/ip了解不多,只回答了比較片面的,對於網路傳輸,作為程序員來講還是非常重要的,所以後面回來惡補資料。
1. 什麼是OSI七層模型?
不管我們打開QQ聊天,還是打開網頁瀏覽信息,都會有傳輸信息的過程,如何讓雙方都能理解,解析數據,這就形成了OSI協議。OSI分工協作,完成複雜的傳輸過程,就像流水線工廠裡面,打孔,包裝,列印生成日期,每層只做自己關心的事情,對於其他的不關心。
- 應用層(Application) 提供網路與用戶應用軟體之間的介面服務
- 表示層(Presentation) 提供格式化的表示和轉換數據服務,如加密和壓縮
- 會話層(Session) 提供包括訪問驗證和會話管理在內的建立和維護應用之間通信的機制
- 傳輸層(Transimission) 提供建立、維護和取消傳輸連接功能,負責可靠地傳輸數據(PC)
- 網路層(Network) 處理網路間路由,確保數據及時傳送(路由器)
- 數據鏈路層(DataLink) 負責無錯傳輸數據,確認幀、發錯重傳等(交換機)
- 物理層(Physics) 提供機械、電氣、功能和過程特性(網卡、網線、雙絞線、同軸電纜、中繼器)
就像郵寄快遞一層一層包裝進去,複製運送快遞的師傅,不關心你到底傳的是什麼數據。
2. TCP/IP
tcp/ip主要分為5層,借鑒於OSI,把會話層,表示層,應用合併為應用層。每一層有每一層的協議,根據協議去封包,解包。我們前端常用的http就是在應用層協議。
3. 網路層 IP
ARP
網路通信,靠的網卡的mac地址,而ARP就是通過IP地址獲取mac地址,ARP是IP->mac地址的隱射表。首先通過ip去尋找計算機的具體位置,就像郵寄快遞,例如,四川省成都市武侯區XX路XX號X層X房間號,這樣確定了具體地址,但是在該房間裡面,存在多個人,要確定郵寄給誰,具體的某個人,需要些上人的名字,而人的名字在網路中可以理解為mac地址。
IP
IP協議負責把數據傳輸到對應的計算機上。- 版本
- 首部長部
- 優先順序與服務類型
- 總長度 該欄位用以指示整個IP數據包的長度,最長為65535位元組,包括頭和數據
- 標識符 唯一標識主機發送的每一份數據報
- 標誌 分為3個欄位,依次為保留位、不分片位和更多片位
- 保留位:一般被置為0
- 不分片位:表示該數據報是否被分片,如果被置為1,則不能對數據報進行分片,如果要對其進行分片處理,就應將其置為0
- 更多片位:除了最後一個分片,其他每個組成數據報的片都要將該位置設置為1.
- 段偏移量 該分片相對於原始數據報開始處位置的偏移量
- TTL(Time to Live生存時間) 該欄位用於表示IP數據包的生命周期,可以防止一個數據包在網路中無限循環地發下去。TTL的意思是一個數據包在被丟棄之前在網路中的最大周轉時間。該數據包經過的每一個路由器都會檢查該欄位中的值,當TTL的值為0時此數據包會被丟棄。TTL對應於一個數據包通過路由器的數目,一個數據包每經過一個路由器,TTL將減去1。
- 協議號 用以指示IP數據包中封裝的是哪個協議
- 首部校驗和 檢驗和是16位的錯誤檢測欄位。目的主機和網路中的每個網關都要重新計算報頭的校驗和,一樣表示沒有改動過.
- 源IP地址 該欄位用於表示數據包的源地址,指的是發送該數據包的設備的網路地址
- 目標IP地址 該欄位用於表示數據包的目標的地址,指的是接收節點的網路地址
4. 傳輸層 tcp
- 源埠號和目標埠號,計算機通過埠號識別訪問哪個服務,比如http服務或ftp服務,發送方埠號是進行隨機埠,目標埠號決定了接收方哪個程序來接收
- 32位序列號 TCP用序列號對數據包進行標記,以便在到達目的地後重新重裝,假設當前的序列號為 s,發送數據長度為 l,則下次發送數據時的序列號為 s + l。在建立連接時通常由計算機生成一個隨機數作為序列號的初始值
- 確認應答號 它等於下一次應該接收到的數據的序列號。假設發送端的序列號為 s,發送數據的長度為 l,那麼接收端返回的確認應答號也是 s + l。發送端接收到這個確認應答後,可以認為這個位置以前所有的數據都已被正常接收。
- 首部長度:TCP 首部的長度,單位為 4 位元組。如果沒有可選欄位,那麼這裡的值就是 5。表示 TCP 首部的長度為 20 位元組。
- 控制位 TCP的連接、傳輸和斷開都受這六個控制位的指揮
- PSH(push急迫位) 緩存區將滿,立刻傳輸速度
- RST(reset重置位) 連接斷了重新連接
- URG(urgent緊急位) 緊急信號
- 緊急指針:盡在 URG(urgent緊急) 控制位為 1 時有效。表示緊急數據的末尾在 TCP 數據部分中的位置。通常在暫時中斷通信時使用(比如輸入 Ctrl + C)。
- ACK(acknowledgement 確認)為1表示確認號
- SYN(synchronous建立聯機) 同步序號位 TCP建立連接時要將這個值設為1
- FIN發送端完成位,提出斷開連接的一方把FIN置為1表示要斷開連接
- 窗口值 說明本地可接收數據段的數目,這個值的大小是可變的。當網路通暢時將這個窗口值變大加快傳輸速度,當網路不穩定時減少這個值可以保證網路數據的可靠傳輸。它是來在TCP傳輸中進行流量控制的
- 窗口大小:用於表示從應答號開始能夠接受多少個 8 位位元組。如果窗口大小為 0,可以發送窗口探測。
- 效驗和: 用來做差錯控制,TCP校驗和的計算包括TCP首部、數據和其它填充位元組。在發送TCP數據段時,由發送端計算校驗和,當到達目的地時又進行一次檢驗和計算。如果兩次校驗 和一致說明數據是正確的,否則 將認為數據被破壞,接收端將丟棄該數據
5. 三次握手/四次揮手
- 為什麼要三次握手?
「已失效的連接請求報文段」的產生在這樣一種情況下:client發出的第一個連接請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連接釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連接請求報文段後,就誤認為是client再次發出的一個新的連接請求。於是就向client發出確認報文段,同意建立連接。假設不採用「三次握手」,那麼只要server發出確認,新的連接就建立了。由於現在client並沒有發出建立連接的請求,因此不會理睬server的確認,也不會向server發送數據。但server卻以為新的運輸連接已經建立,並一直等待client發來數據。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連接。」
確認雙方收發正常,防止了伺服器端的一直等待而浪費資源。
- 為什麼要四次揮手?
當客戶端發送請求斷開連接,這時可以確定客戶端沒有數據發給服務端了,但是服務端可能會有數據還沒發送,首先服務端會發送剩餘數據給客戶端,然後再發送斷開連接的請求,最後客戶端收到斷開請求,發送確認斷開的請求,最後斷開。
推薦閱讀:
※《Oli-Zhao的前端一萬小時》之:離不開的Git和GitHub(1)——版本控制、Git、GitHub初認識
※大齡電力汪前端學習路(頁面渲染篇)
※技術分享——ES2017繼發與並發!
※愛搞事情的webpack
※ajax請求相關
TAG:前端入門 |