天天看點

tcp粘包及如何解決

1. 什麼是粘包

  • 流式套接字

    首先說說TCP為什麼叫流式套接字,顧名思義,是指TCP的資料傳輸跟流動的水一樣,大家可以想象一下,水是連成一片的,它是沒有分界線的,而TCP資料傳輸也是一樣的,是沒有界限的;

  • 緩存機制

    熟悉TCP協定的人都應該知道,TCP發送資料,并不是應用程式send以後就發出去了,它是先存儲在發送緩沖區的,為了性能考慮,可能會等到多個資料包彙總到一起後,作業系統底層再把緩沖區整體發送出去,接收資料也是一樣。

  • 最大傳輸單元

    在網絡傳輸中,有個MTU-最大傳輸單元,是1500個位元組,就是說每一次發送最多隻能發送1500個位元組,如果要發送超過這個長度的資料包,就需要分包發送。

當出現以上三點的情況時,接收端接收到的資料和發送的資料包大小、次數可能都不一緻,我們沒辦法确定發送端發送過來的一個完整包是怎樣的,就沒辦法正确獲得我們需要的資料, 這就是粘包現象。

其實就是說,應用程序并不知道一個完整的資料包到底是多大,沒法進行解析,用戶端和服務端需要有一個約定的規則,來確定不出現粘包。

2. 怎麼解決粘包

有以下三種情況可以解決粘包現象:

  • 一是約定資料包長度,即發送端和接收端約定一樣的發送和接收的資料包長度,這樣可以清晰的擷取到我們需要的資料;
  • 二是使用分隔符,比如smtp協定就是在發送時,使用\r\n為分隔符,但如果我們要發送的資料中也有\r\n呢,就容易搞混淆,是以不是特别推薦;
  • 三是在每個資料包的開頭利用2個或者4個位元組填充整個資料包的長度,這樣接收端可以先接收2個或者4個位元組,就可以準确的知道真正的資料包是多長,進而正确擷取需要的資料;

繼續閱讀