帶你瞭解TCP/IP協議族

一.TCP/IP協議族的四層模型

應用層(HTTP FTP),傳輸層(TCP UDP),網絡層(IP),鏈路層。

二.爲何要分層?

由於網絡傳輸的過程當中網絡是不穩定的。

如圖

clipboard.png
其實在咱們的網絡傳輸過程當中從客戶端發送消息的服務端的過程當中網絡並非只沿着一條直線能夠直接順利傳達到的,它再傳輸的過程當中會通過不少的中間節點,但每個節點都是有多是會忽然出問題的。如圖所示:舉一個極端的例子我在傳數據的過程當中忽然停電了或者某一個節點的路由壞了,這時咱們的數據就至關於傳輸失敗了,那麼這時候咱們就須要從新傳輸數據。可是若是傳輸的是一個很是大的數據呢?那麼咱們每次從新傳輸這個數據的時候必然會形成流量的浪費和速率的下降。
如圖:每次傳輸失敗我都須要將數據 ABCDEFGH 重新發送,效率很低!!!
這也就是爲何須要傳輸層的緣由。緩存

clipboard.png

三.傳輸層:TCP協議, UDP協議

傳輸層主要作的是將你應用層的數據分塊編號傳輸,同時還要確認你的數據到達,若是某一塊的數據沒有到達那麼我只須要再次傳輸傳輸失敗的內容便可。這樣就保證了我只須要傳輸失敗的部分而不是每次都總體從新傳輸。

如圖:咱們將原數據拆分爲四組數據
當咱們傳輸數據的過程當中每次將數據傳到服務端的TCP層時,它都會確認並通知客戶端對應的編號數據已到達。這時好比3號的傳輸過程當中傳輸失敗了那麼客戶端是遲遲不能收到服務端迴應的,對此咱們要作的只是再從新傳輸失敗的3號便可而不是像以前同樣總體從新傳輸。服務器

1.TCP協議

所作的事情:保證可靠性和拆塊數據

  1. 客戶端TCP層將HTTP層數據拆塊。
  2. 傳輸數據完成後服務端須要向客戶端發送收到信息,若是在規定時間內客戶端沒有收到服務端發送的迴應(ACK)則客戶端將從新發送沒有收到的數據。(超時重傳,保證可靠性)。
  3. 全部數據傳輸完成後服務端TCP層將拆塊的數據組合成原有數據交給HTTP層處理。

2.TCP UDP的區別

什麼叫作鏈接?

通訊雙方創建確認「能夠通訊」,不會將對方的消息丟棄,即爲「創建鏈接」
UDP是面向無鏈接的、不可靠的數據報服務、有序;
只需找到目標端口號就能夠直接開始發送數據,即發送數據以前不須要創建鏈接而TCP要通過3次握手建立鏈接。UDP不須要確認數據是否丟失是否到達,只管傳就能夠。網絡

使用場景: 遊戲、視頻會議等不須要確認數據有效性且須要快速傳輸的場景。好比遊戲吃雞,我卡頓兩秒後恢復了,我不須要知道這卡頓的兩秒發生了什麼不須要知道它的數據是什麼,我只關心2秒後恢復網絡的這最新一幀的畫面是什麼。

TCP是面向鏈接的、可靠、有序的字節流服務。併發

3.TCP 協議被認爲是穩定的協議

TCP 協議被認爲是穩定的協議,由於它有如下特色:(都是爲了確保數據不丟失,全部數據都傳輸成功)

  • 面向鏈接,「三次握手」
  • 雙向通訊( 客戶端發送,服務端接收同時告知客戶端接收完成)
  • 保證數據按序發送,按序到達
  • 超時重傳

4.滑動窗口協議

爲了避免浪費網絡資源高效的發送數據,保證可靠性和有序性

  • 滑動窗口協議,是TCP使用的一種流量控制方法。該協議容許發送方在中止並等待確認前能夠連續發送多個分組。因爲發送方沒必要每發一個分組就停下來等待確認,所以該協議能夠加速數據的傳輸。 
  • 只有在接收窗口向前滑動時(與此同時也發送了確認),發送窗口才有可能向前滑動。    
  • 收發兩端的窗口按照以上規律不斷地向前滑動,所以這種協議又稱爲滑動窗口協議。    
  • 當發送窗口和接收窗口的大小都等於1時,就是中止等待協議。

clipboard.png
上圖中分紅了四個部分,分別是:(其中那個黑模型就是滑動窗口)已收到ack確認的數據。性能

  1. 已收到ack確認的數據。
  2. 發還沒收到ack的。
  3. 在窗口中尚未發出的(接收方還有空間)。
  4. 窗口之外的數據(接收方沒空間)

clipboard.png
下面是個滑動後的示意圖(收到36的ack,併發出了46-51的字節):
要注意的是TCP並非每個報文段都會回覆ACK的,可能會對兩個報文段發送一個ACK,也可能會對多個報文段發送1個ACK【累計ACK】,好比說發送方有1/2/3 3個報文段,先發送了2,3 兩個報文段,可是接收方指望收到1報文段,這個時候2,3報文段就只能放在緩存中等待報文1的空洞被填上,若是報文1,一直不來,報文2/3也將被丟棄,若是報文1來了,那麼會發送一個ACK對這3個報文進行一次確認。spa

4.1 擁塞機制

對發送端窗口的發送數據量作控制,能夠認爲是對發送窗口的大小不斷地調整防止流量的浪費。(如當前網絡狀況很差,服務端只能處理50個數據但客戶端傳了100個數據,這時剩下的50個數據至關於沒有處理,那麼客戶端會觸發超時重傳機制從新傳輸這50個數據,這樣的話就形成了一個資源的浪費狀況的發生,由於這50個資源是徹底沒有必要去傳輸的)。
慢啓動,擁塞控制 快重傳,快恢復 code

clipboard.png

5.TCP的三次握手、四次揮手過程 (鏈接、斷開)

clipboard.png
clipboard.png

這裏咱們要先認識幾個標誌位

ACK:收到。  
SYN:發起一個鏈接。  
FIN:釋放一個鏈接。  

5.1 三次握手

clipboard.png
簡化三步握手的流程就是視頻

  1. C發給S我要跟你通訊。
  2. S告訴C你能夠跟我通訊同時我也要跟你通訊。
  3. C告訴S你能夠跟我通訊,我們能夠開始通訊了。
`須要三次握手的緣由在於S端在第二次握手(發出消息)後並不知道C端是否能接收它發送的消息,若是發送的SYN對方沒有收到而直接通訊的話會形成只能C到S單方通訊(C會收不到S發送的確認消息收到的信息),而TCP鏈接是須要雙端均可以通訊的。`

5.2 四次揮手

  1. 第一次揮手:客戶端發送一個FIN=1,用來關閉客戶端到服務器端的數據傳送,客戶端進入FIN_WAIT_1狀態。意思是說」我客戶端沒有數據要發給你了」,可是若是你服務器端還有數據沒有發送完成,則沒必要急着關閉鏈接,能夠繼續發送數據。
  2. 第二次揮手:服務器端收到FIN後,先發送ack=u+1,告訴客戶端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息(服務端會等待沒有發送的數據發送完畢)。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文。
  3. 第三次揮手:當服務器端肯定數據已發送完成,則向客戶端發送FIN=1報文,告訴客戶端,好了,我這邊數據發完了,準備好關閉鏈接了。服務器端進入LAST_ACK狀態。
  4. 第四次揮手:客戶端收到FIN=1報文後,就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕服務器端不知道要關閉,因此發送ack=w+1後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。服務器端收到ACK後,就知道能夠斷開鏈接了。客戶端等待了2MSL(2倍最大報文存活時間)後依然沒有收到回覆,則證實服務器端已正常關閉,那好,我客戶端也能夠關閉鏈接了。最終完成了四次握手。

注意:是第四次握手2端才分別關閉的!而不是第三次! S端收到ACK後會關閉鏈接,同時C端發送ACK後在等待2MSL(2倍最大報文存活時間)後C端鏈接也會關閉。若是第三次揮手S端直接關閉的話那麼若是C端由於網絡因素沒有收到FIN的話那麼C端會一直等待FIN,這時S端已經關閉了將致使C端沒法關閉的狀況發生。接口

等待2MSL的緣由是S端可能不會收到C端的ACK標誌位,那麼S端會超時重傳從新發送FIN給C端,若是C端不等待2MSL而直接關閉的話會形成C端收不到FIN而S端一直重傳FIN致使S端沒法關閉的狀況發生。(一切都是爲了保證四次揮手更加可靠)。

5.3 長鏈接

clipboard.png

  • 爲何要長鏈接?
由於移動網絡並不在 Internet 中,而是在運營商的內網,並不具備真正的公網 IP,所以當某個 TCP 鏈接在一段時間不通訊以後,網關會出於網絡性能考慮而關閉這條 TCP 鏈接和公網的鏈接通道,致使這個TCP端再也不能收到外部通訊消息,即 TCP 鏈接被動關閉(好比推送接收不到了,聊天場景中的S端給C端發信息因爲鏈接關閉致使的C端接收不到了)。
  • 長鏈接的實現方式
心跳。即在必定間隔時間內,使用 TCP 鏈接發送超短無心義消息來讓網關不能將本身定義爲「空閒鏈接」,從而防止網關將本身的鏈接關閉(防止TCP鏈接通道被被動的關閉)。

TCP的keep alive是檢查當前TCP鏈接是否活着;HTTP的Keep-alive是要讓一個TCP鏈接活久點。它們是不一樣層次的概念。

四.網絡層 IP

clipboard.png

網絡層的做用是在複雜的網絡環境中爲要發送的數據報找到一個合適的路徑進行傳輸。(也就是從衆多的路由節點中選出一條效率最高的路徑去傳輸)
網絡層不能保證數據報的可靠性傳輸,可靠性是由網絡主機中的傳輸層(TCP)來進行保證的。也就是說網絡層無論傳的數據是什麼,也無論你傳沒傳送到達,只管一味的傳輸。(悶頭楞傳~)
如圖:遊戲

clipboard.png

  • 圖a就是有鏈接(TCP,有序)的傳輸:由主機A向主機B傳輸數據時,提早創建一條鏈接:主機A->節點1->節點3->主機B。則在由A向B傳輸多個數據報時,均只能使用這條路線進行傳輸。
  • 圖b是無鏈接(UDP,無序)的傳輸:當由A向B發送數據報1時,從主機A開始發現由A到節點1的網絡比較空閒,就使用這條路徑發送,到達節點1時,發現可使用節點1到節點3的路徑,因而就走這條路徑,同理再走到主機B;當發送數據報2時,此時發現由A到節點2的網絡比較空閒,就使用這條路線發送,以後同理。

五.鏈路層

網絡層傳輸數據須要創建在物理設備的基礎上, 鏈路層就是咱們平時接觸的網卡和網卡的驅動程序(以太網,WIFI)
上層(好比網絡層,傳輸層等等)不知道也不須要知道數據在物理上是如何傳輸的。好比數據到底是用雙絞線傳輸的仍是用同軸電纜,究竟是有線的網絡接口仍是無線的網絡接口傳輸,這些細節通通不須要鏈路層的上層去操心,這樣的好處就是好比一會使用有線,一會使用無線,這對於處於網絡層的IP實現,或者是傳輸層的TCP實現來說,是不須要有任何變化的。

相關文章
相關標籤/搜索