TCP/IP簡記

做爲一個非科班的前端er,計算機網絡基礎和原理方面一直都是本身比較薄弱的環節,最近學習了一些相關的知識便記錄一下。前端

簡介

tcp/ip:咱們一般所說的tcp/ip協議,指的是以TCP(傳輸控制協議)和IP(網際協議)爲核心的TCP/IP協議族。TCP/IP也稱互聯網協議,是一個網絡通訊模型,以及一整個網絡傳輸協議家族,爲互聯網的基礎通訊架構。編程

計算機網絡體系結構的分層

根據不一樣的模型,咱們將計算機網絡中的協議分爲不一樣的層級。最多見的有OSI七層參考模型和TCP/IP四層模型。服務器

數據的傳輸

互聯網協議規定了數據(包)的發送從上層到下層,每一個分層中,都會對所發送的數據附加一個首部,在這個首部中包含了該層必要的信息,明確標明瞭協議應該如何讀取數據。網絡

數據的接收則從下層到上層,每一個分層中,都會對接收的數據進行處理,根據包首部,瞭解該協議的必要信息以及要處理的數據。架構

下圖以用戶a向用戶b發送郵件爲例子:socket

TCP鏈接中的三次握手與四次揮手

TCP提供面向有鏈接的通訊傳輸。面向有鏈接是指在數據通訊開始以前先作好兩端間的準備工做。tcp

三次握手

所謂三次握手是指創建一個TCP鏈接時須要客戶端和服務器端總共發送三個包以確認鏈接的創建。在socket編程中,這一過程由客戶端執行connect來觸發。學習

  • 第一次握手:客戶端將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給服務器端,客戶端進入SYN_SENT狀態,等待服務器端確認。網絡傳輸協議

  • 第二次握手:服務器端接收到數據包後由標誌位SYN=1知道客戶端請求創建鏈接,服務端將標誌位SYN和ACK都設置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給客戶端以確認鏈接請求,服務器端進入SYN_RCVD狀態。計算機網絡

  • 第三次握手:客戶端接收到確認後,檢查ack是否爲J+1,ACK是否爲1,若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給服務器端,服務器端檢查ack是否爲K+1,
    ACK是否爲1,若是正確則鏈接創建成功,客戶端和服務器進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器之間能夠開始傳輸數據了。

四次揮手

四次揮手即終止TCP鏈接,就是指斷開一個TCP鏈接時,須要客戶端和服務器端總共發送四個數據包以確認鏈接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發。

因爲TCP鏈接是雙工的,所以,每一個方向都必需要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這以方向的鏈接,收到一個FIN知識意味着這一方向上沒有數據流動了,即不會再收到數據了,可是在這個TCP鏈接上仍然可以發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另外一方則執行被動關閉。

  • 中斷鏈接能夠是客戶端,也能夠是服務端

  • 第一次揮手:客戶端發送一個FIN=M,用來關閉客戶端到服務端的數據傳送,客戶端進入FIN_WAIT_1狀態。意思是我(客戶端)沒有數據要發給你了,但若是你服務端還有數據沒有發送完成,則沒必要急着關閉鏈接,能夠繼續發送數據。

  • 第二次揮手:服務端接收到FIN後,先發送ack=M+1,告訴客戶端,你的請求我收到了,但我還沒準備好,請你繼續等待個人消息。這個時候客戶端就進入FIN_WAIT_2狀態,繼續等待服務器端的FIN報文。

  • 第三次揮手:當服務端肯定數據已發送完成,則向客戶端發送FIN=N報文,告訴客戶端我這邊的數據已經發完了,準備好關閉鏈接了。服務端進入LAST_ACK狀態。

  • 第四次揮手:客戶端收到FIN=N報文後,就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕服務端不知道要關閉,因此發送ack=N+1進入TIME_WAIT狀態,若是server端沒有收到ACK則能夠重傳。服務端接收到ACK後,就知道能夠斷開鏈接了。客戶端等待了2MSL後依然沒有獲得回覆,則證實服務端已正常關閉,那好,我客戶端也能夠關閉鏈接了。最終完成了四次握手。

實際上還可能會出現同時發起關閉的狀況:

經過序列號與確認應答提升可靠性

  • 在 TCP 中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知。這個消息叫作確認應答(ACK)。當發送端將數據發出以後會等待對端的確認應答。若是有確認應答,說明數據已經成功到達對端。反之,則數據丟失的可能性很大。

  • 在必定時間內沒有等待到確認應答,發送端就能夠認爲數據已經丟失,並進行重發。由此,即便產生了丟包,仍然可以保證數據可以到達對端,實現可靠傳輸。

  • 未收到確認應答並不意味着數據必定丟失。也有多是數據對方已經收到,只是返回的確認應答在途中丟失。這種狀況也會致使發送端誤覺得數據沒有到達目的地而重發數據。

  • 此外,也有可能由於一些其餘緣由致使確認應答延遲到達,在源主機重發數據之後纔到達的狀況也家常便飯。此時,源主機只要按照機制重發數據便可。

  • 對於目標主機來講,反覆收到相同的數據是不可取的。爲了對上層應用提供可靠的傳輸,目標主機必須放棄重複的數據包。爲此咱們引入了序列號。

  • 序列號是按照順序給發送數據的每個字節(8位字節)都標上號碼的編號。接收端查詢接收數據 TCP 首部中的序列號和數據的長度,將本身下一步應該接收的序列號做爲確認應答返送回去。經過序列號和確認應答號,TCP 可以識別是否已經接收數據,又可以判斷是否須要接收,從而實現可靠傳輸。

重發超時的肯定

  • 每次發包以前都會計算往返時間,以此肯定超時間隔

  • 重發以後可能再次重發,超時間隔以指數形式增長 2 - 4 - 8

  • 重發屢次以後將強制斷開鏈接,不會無限重發

參考


歡迎到前端學習打卡羣一塊兒學習~516913974

相關文章
相關標籤/搜索