其實在咱們的網絡傳輸過程當中從客戶端發送消息的服務端的過程當中網絡並非只沿着一條直線能夠直接順利傳達到的,它再傳輸的過程當中會通過不少的中間節點,但每個節點都是有多是會忽然出問題的。如圖所示:舉一個極端的例子我在傳數據的過程當中忽然停電了或者某一個節點的路由壞了,這時咱們的數據就至關於傳輸失敗了,那麼這時候咱們就須要從新傳輸數據。可是若是傳輸的是一個很是大的數據呢?那麼咱們每次從新傳輸這個數據的時候必然會形成流量的浪費和速率的下降。如圖:每次傳輸失敗我都須要將數據 ABCDEFGH 重新發送,效率很低!!!
這也就是爲何須要傳輸層的緣由。
緩存
如圖:咱們將原數據拆分爲四組數據
當咱們傳輸數據的過程當中每次將數據傳到服務端的TCP層時,它都會確認並通知客戶端對應的編號數據已到達。這時好比3號的傳輸過程當中傳輸失敗了那麼客戶端是遲遲不能收到服務端迴應的,對此咱們要作的只是再從新傳輸失敗的3號便可而不是像以前同樣總體從新傳輸。服務器
通訊雙方創建確認「能夠通訊」,不會將對方的消息丟棄,即爲「創建鏈接」
UDP是面向無鏈接的、不可靠的數據報服務、有序;
只需找到目標端口號就能夠直接開始發送數據,即發送數據以前不須要創建鏈接而TCP要通過3次握手建立鏈接。UDP不須要確認數據是否丟失是否到達,只管傳就能夠。網絡
使用場景: 遊戲、視頻會議等不須要確認數據有效性且須要快速傳輸的場景。好比遊戲吃雞,我卡頓兩秒後恢復了,我不須要知道這卡頓的兩秒發生了什麼不須要知道它的數據是什麼,我只關心2秒後恢復網絡的這最新一幀的畫面是什麼。
TCP是面向鏈接的、可靠、有序的字節流服務。
併發
上圖中分紅了四個部分,分別是:(其中那個黑模型就是滑動窗口)已收到ack確認的數據。性能
下面是個滑動後的示意圖(收到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
對發送端窗口的發送數據量作控制,能夠認爲是對發送窗口的大小不斷地調整防止流量的浪費。(如當前網絡狀況很差,服務端只能處理50個數據但客戶端傳了100個數據,這時剩下的50個數據至關於沒有處理,那麼客戶端會觸發超時重傳機制從新傳輸這50個數據,這樣的話就形成了一個資源的浪費狀況的發生,由於這50個資源是徹底沒有必要去傳輸的)。慢啓動,擁塞控制 快重傳,快恢復
code
這裏咱們要先認識幾個標誌位
ACK:收到。 SYN:發起一個鏈接。 FIN:釋放一個鏈接。
簡化三步握手的流程就是視頻
`須要三次握手的緣由在於S端在第二次握手(發出消息)後並不知道C端是否能接收它發送的消息,若是發送的SYN對方沒有收到而直接通訊的話會形成只能C到S單方通訊(C會收不到S發送的確認消息收到的信息),而TCP鏈接是須要雙端均可以通訊的。`
告訴客戶端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息(服務端會等待沒有發送的數據發送完畢)
。這個時候客戶端就進入FIN_WAIT_2 狀態,繼續等待服務器端的FIN報文。注意:是第四次握手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端沒法關閉的狀況發生。(一切都是爲了保證四次揮手更加可靠)。
由於移動網絡並不在 Internet 中,而是在運營商的內網,並不具備真正的公網 IP,所以當某個 TCP 鏈接在一段時間不通訊以後,網關會出於網絡性能考慮而關閉這條 TCP 鏈接和公網的鏈接通道,致使這個TCP端再也不能收到外部通訊消息,即 TCP 鏈接被動關閉(好比推送接收不到了,聊天場景中的S端給C端發信息因爲鏈接關閉致使的C端接收不到了)。
心跳。即在必定間隔時間內,使用 TCP 鏈接發送超短無心義消息來讓網關不能將本身定義爲「空閒鏈接」,從而防止網關將本身的鏈接關閉(防止TCP鏈接通道被被動的關閉)。
TCP的keep alive是檢查當前TCP鏈接是否活着;HTTP的Keep-alive是要讓一個TCP鏈接活久點。它們是不一樣層次的概念。
網絡層的做用是在複雜的網絡環境中爲要發送的數據報找到一個合適的路徑進行傳輸。(也就是從衆多的路由節點中選出一條效率最高的路徑去傳輸)
網絡層不能保證數據報的可靠性傳輸,可靠性是由網絡主機中的傳輸層(TCP)來進行保證的。也就是說網絡層無論傳的數據是什麼,也無論你傳沒傳送到達,只管一味的傳輸。(悶頭楞傳~)
如圖:遊戲
網絡層傳輸數據須要創建在物理設備的基礎上, 鏈路層就是咱們平時接觸的網卡和網卡的驅動程序(以太網,WIFI)
。
上層(好比網絡層,傳輸層等等)不知道也不須要知道數據在物理上是如何傳輸的。好比數據到底是用雙絞線傳輸的仍是用同軸電纜,究竟是有線的網絡接口仍是無線的網絡接口傳輸,這些細節通通不須要鏈路層的上層去操心,這樣的好處就是好比一會使用有線,一會使用無線,這對於處於網絡層的IP實現,或者是傳輸層的TCP實現來說,是不須要有任何變化的。