網絡基礎 — TCP粘包淺析
粘包問題其實呢還是很容易理解的,從緩衝區來看,後一包的數據的頭部緊接着前一包數據的尾部,使得接收方不能準確的讀取一包數
據,也就是接收方多讀或少讀一包數據所造成的現象就是粘包現象. 粘包問題只會在TCP的長連接時纔可能發送,因爲TCP是面向字節流
的,以流的方式處理數據,當長連接時纔可能有多個數據報粘在一起的情況. UDP是面向數據包的,有固定的消息邊界.
粘包既可能是發送方需要等待緩衝區滿了之後才發送數據造成的,也有可能是接收方來不及接受緩衝區的包,造成多個包一起接受的現象.
發送方造成的粘包: 粘包是由TCP協議本身造成的,TCP協議爲了提高傳輸效率,發送方往往要收集足夠多的數據後才發送出去,若是連
續幾次發送的數據都很少,通常TCP會根據算法把這些數據合成一個包然後發送出去,這樣接收方就會出現粘包.
接收方造成的粘包:接受方會把發送方的數據先放到緩衝區當中,應用程序再從緩衝區中取數據,若是下一包數據到達時前一包數據沒
有被應用取走,則下一包數據就黏在前一包的尾部. 應用程序根據預先設定的緩衝區的大小從系統接收緩衝區當中取數據,這樣就一
次提取了多個數據包.
HTTP的避免粘包的三種方式:
1.使用回車換行符作爲分隔,也就是以空行作爲消息報頭的結束
2. 以固定的方式讀取消息報頭,http消息報頭中每一行都是一個完整內容
3..給出數據報的大小,按照大小讀取. http的消息報頭中有一個Content_Length字段標記消息正文的大小.
所以根據http協議,我們至少有三種方式來避免粘包:
1.添加分隔符,來標識每一包數據的起始和結束
2.發送方將數據結構化,接收方按照結構讀取
3.發送方在發送的時候,在首部加上數據報的大小,接收方在接受的時候先解析出大小,再按照大小讀取數據.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.