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