TCP以及TCP中的粘包與分包

2021-08-29 18:23:28 字數 969 閱讀 5297

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中獲取乙個完整的資料報,然後再對資料報進行業務解析就可以得到正確結果。

TCP粘包分包現象

服務端,接收資料,在每次接收到的資料末尾添上乙個 尾 字 客戶端傳送資料,將同樣的資料連續傳送若干次 不是將資料複製若干份一次傳送 using system using system.collections.generic using system.componentmodel using syst...

Qt的TCP粘包分包

粘包只可能出現在流傳輸中,tcp是基於流傳輸的,而udp是不會出現粘包,因為udp是基於報文的,也就是說udp傳送端呼叫幾次write,接收端必須呼叫相同次數的read讀完,每次最多只能讀取乙個報文,報文與報文是不會合併的,如果緩衝區小於報文長度,則多出來的部分會被丟掉。tcp不同了,它會合併訊息,...

TCP原理 粘包分包現象

參考 雲棲社群 就是要你懂 tcp 最經典的tcp效能問題 粘包現象產生的原因 由於tcp協議本身的機制 三次握手 客戶端與伺服器會維持乙個連線 channel 資料在連線不斷開的情況下,可以持續不斷地將多個資料報發往伺服器,但是如果傳送的網路資料報太小,那麼他本身會啟用nagle演算法 可配置是否...