linux網絡編程系列(七)--tcp粘包及如何解決

1. 什麼是粘包

  • 流式套接字 首先說說TCP爲何叫流式套接字,顧名思義,是指TCP的數據傳輸跟流動的水同樣,你們能夠想象一下,水是連成一片的,它是沒有分界線的,而TCP數據傳輸也是同樣的,是沒有界限的;緩存

  • 緩存機制 熟悉TCP協議的人都應該知道,TCP發送數據,並非應用程序send之後就發出去了,它是先存儲在發送緩衝區的,爲了性能考慮,可能會等到多個數據包彙總到一塊兒後,操做系統底層再把緩衝區總體發送出去,接收數據也是同樣。網絡

  • 最大傳輸單元 在網絡傳輸中,有個MTU-最大傳輸單元,是1500個字節,就是說每一次發送最多隻能發送1500個字節,若是要發送超過這個長度的數據包,就須要分包發送。性能

當出現以上三點的狀況時,接收端接收到的數據和發送的數據包大小、次數可能都不一致,咱們沒辦法肯定發送端發送過來的一個完整包是怎樣的,就沒辦法正確得到咱們須要的數據, 這就是粘包現象。 其實就是說,應用進程並不知道一個完整的數據包究竟是多大,無法進行解析,客戶端和服務端須要有一個約定的規則,來確保不出現粘包。操作系統

2. 怎麼解決粘包

有如下三種狀況能夠解決粘包現象:進程

  • 一是約定數據包長度,即發送端和接收端約定同樣的發送和接收的數據包長度,這樣能夠清晰的獲取到咱們須要的數據;
  • 二是使用分隔符,好比smtp協議就是在發送時,使用\r\n爲分隔符,但若是咱們要發送的數據中也有\r\n呢,就容易搞混淆,因此不是特別推薦;
  • 三是在每一個數據包的開頭利用2個或者4個字節填充整個數據包的長度,這樣接收端能夠先接收2個或者4個字節,就能夠準確的知道真正的數據包是多長,從而正確獲取須要的數據;
相關文章
相關標籤/搜索