TCP以及TCP中的粘包與分包
1.TCP
tcp:確認,重傳機制,按序到達
擁塞控制:防止過多的資料注入到網路中
流量控制:流量控制所要做的就是抑制傳送端傳送資料的速率,以便使接收端來得及接收
不同的協議層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網路層叫做資料報(datagram),在鏈路層叫做幀(frame)
採用TCP協議進行資料傳輸是不會造成IP分片的。一旦TCP資料過大,則在傳輸層會對TCP包進行分段
UDP不能像TCP一樣自己進行分段,因此會在IP層分片
IP分片由網路層完成,也在網路層進行重組;TCP分段是在傳輸層完成,並在傳輸層進行重組.
2.Socket傳送與接收緩衝區
傳送緩衝區:系統不斷從傳送Buffer取資料傳送到接收端,應用不斷往傳送Buffer寫資料
接收緩衝區:系統把接收到的資料送入接收Buffer中,應用不斷從接收Buffer取資料
TCP保證接收到資料的順序是傳送的順序,按序到達
一次send可能會有多次recv,多次send也可能對應一次recv
3.TCP中的分包與粘包
粘包&分包產生原因:1.應用資料大小大於傳送Buffer,要分多次發。 2.TCP分段
解決資料分包和粘包的基本策略如下
1.訊息定長,比如定一個100,那麼讀取端每次讀取資料就擷取100個長度的資料,然後交給業務成去做解析
2.在訊息的尾部加一些特殊字元,那麼在讀取資料的時候,只要讀到這個特殊字元,就認為已經可以擷取一個完整的資料包了,這種情況在一定的業務情況下實用。
3.讀取快取的資料是不定長的,所以我們把讀取到的資料新增到我們自己的一個byte[]陣列中,然後根據我們的業務邏輯來找到指定的特殊協議頭部,協議長度,協議尾部,然後從我們的byte[]中獲取一個完整的資料包,然後再對資料包進行業務解析就可以得到正確結果。