溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux網(wǎng)絡(luò)編程中tcp粘包及如何解決

發(fā)布時間:2021-12-06 10:24:24 來源:億速云 閱讀:114 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)linux網(wǎng)絡(luò)編程中tcp粘包及如何解決,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1. 什么是粘包


  • 流式套接字 首先說說TCP為什么叫流式套接字,顧名思義,是指TCP的數(shù)據(jù)傳輸跟流動的水一樣,大家可以想象一下,水是連成一片的,它是沒有分界線的,而TCP數(shù)據(jù)傳輸也是一樣的,是沒有界限的;



  • 緩存機制 熟悉TCP協(xié)議的人都應(yīng)該知道,TCP發(fā)送數(shù)據(jù),并不是應(yīng)用程序send以后就發(fā)出去了,它是先存儲在發(fā)送緩沖區(qū)的,為了性能考慮,可能會等到多個數(shù)據(jù)包匯總到一起后,操作系統(tǒng)底層再把緩沖區(qū)整體發(fā)送出去,接收數(shù)據(jù)也是一樣。



  • 最大傳輸單元 在網(wǎng)絡(luò)傳輸中,有個MTU-最大傳輸單元,是1500個字節(jié),就是說每一次發(fā)送最多只能發(fā)送1500個字節(jié),如果要發(fā)送超過這個長度的數(shù)據(jù)包,就需要分包發(fā)送。


當出現(xiàn)以上三點的情況時,接收端接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù)包大小、次數(shù)可能都不一致,我們沒辦法確定發(fā)送端發(fā)送過來的一個完整包是怎樣的,就沒辦法正確獲得我們需要的數(shù)據(jù), 這就是粘包現(xiàn)象。 其實就是說,應(yīng)用進程并不知道一個完整的數(shù)據(jù)包到底是多大,沒法進行解析,客戶端和服務(wù)端需要有一個約定的規(guī)則,來確保不出現(xiàn)粘包。

2. 怎么解決粘包

有以下三種情況可以解決粘包現(xiàn)象:

  • 一是約定數(shù)據(jù)包長度,即發(fā)送端和接收端約定一樣的發(fā)送和接收的數(shù)據(jù)包長度,這樣可以清晰的獲取到我們需要的數(shù)據(jù);

  • 二是使用分隔符,比如smtp協(xié)議就是在發(fā)送時,使用\r\n為分隔符,但如果我們要發(fā)送的數(shù)據(jù)中也有\(zhòng)r\n呢,就容易搞混淆,所以不是特別推薦;

  • 三是在每個數(shù)據(jù)包的開頭利用2個或者4個字節(jié)填充整個數(shù)據(jù)包的長度,這樣接收端可以先接收2個或者4個字節(jié),就可以準確的知道真正的數(shù)據(jù)包是多長,從而正確獲取需要的數(shù)據(jù);

以上就是linux網(wǎng)絡(luò)編程中tcp粘包及如何解決,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI