略解TCP亂序和丟包


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

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

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

    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種標示:

      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狀態,完成三次握手。完成三次握手,客戶端與服務器開始傳送數據.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM