略解TCP亂序和丟包

在使用基於TCP實現的各類組件的時候,咱們常常會處理數據包。這數據包說來奇怪,歷來不會丟失,也不會亂序,只會產生粘包。底層的機制是如何實現的呢?進來咱們就來用簡潔易懂的文字描述清楚。服務器

在TCP數據包設計思想中,有兩個比較重要的概念:網絡

    Sequence Number: 順序號,意即數據包的序號,主要用來解決數據包亂序問題。tcp

    Acknowledgement Number:確認號,意即數據包用來進行雙端消息確認的號碼,主要用來解決網絡傳輸過程當中,數據丟包的問題。設計

Sequence Number的工做原理以下:原理

TCP傳輸數據時,A主機第一次傳輸1440個字節,seq=1,那麼第二次時seq = 1441,B拼接數據就是根據seq進行拼接的,seq數字不斷累加避免了亂序.B主機收到第一次數據包之後會返回ack = 1441. A主機收到B的ack = 1441時,就知道第一個數據包B已收到. 若是B沒有收到第一次的數據包,那麼B再收到A的數據包時,他就會發ack = 1回去,A收到B的回覆,發現B沒有收到第一次數據包,就會重發第一次數據包,這樣就能夠防止丟包.數據

利用這兩個號,就很好的保證了消息的順序性,同時數據呈送給用戶的時候,也不會出現部分遺失的狀況。客戶端

再來用簡略的語言描述一下TCP鏈接創建的過程:語言

如下爲tcp標誌位,有6種標示: sync

      SYN(synchronous創建聯機)  工作

      ACK(acknowledgement 確認) 

      PSH(push傳送) 

      FIN(finish結束) 

      RST(reset重置) 

      URG(urgent緊急)

第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;     

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;   

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據.

相關文章
相關標籤/搜索