您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關linux網絡編程中tcp粘包及如何解決,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
流式套接字 首先說說TCP為什么叫流式套接字,顧名思義,是指TCP的數據傳輸跟流動的水一樣,大家可以想象一下,水是連成一片的,它是沒有分界線的,而TCP數據傳輸也是一樣的,是沒有界限的;
緩存機制 熟悉TCP協議的人都應該知道,TCP發送數據,并不是應用程序send以后就發出去了,它是先存儲在發送緩沖區的,為了性能考慮,可能會等到多個數據包匯總到一起后,操作系統底層再把緩沖區整體發送出去,接收數據也是一樣。
最大傳輸單元 在網絡傳輸中,有個MTU-最大傳輸單元,是1500個字節,就是說每一次發送最多只能發送1500個字節,如果要發送超過這個長度的數據包,就需要分包發送。
當出現以上三點的情況時,接收端接收到的數據和發送的數據包大小、次數可能都不一致,我們沒辦法確定發送端發送過來的一個完整包是怎樣的,就沒辦法正確獲得我們需要的數據, 這就是粘包現象。 其實就是說,應用進程并不知道一個完整的數據包到底是多大,沒法進行解析,客戶端和服務端需要有一個約定的規則,來確保不出現粘包。
有以下三種情況可以解決粘包現象:
一是約定數據包長度,即發送端和接收端約定一樣的發送和接收的數據包長度,這樣可以清晰的獲取到我們需要的數據;
二是使用分隔符,比如smtp協議就是在發送時,使用\r\n為分隔符,但如果我們要發送的數據中也有\r\n呢,就容易搞混淆,所以不是特別推薦;
三是在每個數據包的開頭利用2個或者4個字節填充整個數據包的長度,這樣接收端可以先接收2個或者4個字節,就可以準確的知道真正的數據包是多長,從而正確獲取需要的數據;
以上就是linux網絡編程中tcp粘包及如何解決,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。