socket傳輸過程中產生的粘包拆包問題

我們在之前一篇博客  https://blog.csdn.net/Jbinbin/article/details/82142878  說的是socket套接字底層數據傳輸。

這篇博客中就出現了socket傳輸過程中的粘包拆包問題。就是因爲socket發送的是無界線的數據流。所以當多個包的大小不一,並且發送出去的時候,緩衝區的大小不一樣,會導致包與包之間和合並和包的拆分問題。

對於上圖粘包、拆包問題的場景:

  1. 客戶端和服務器建立一個連接,客戶端發送一條消息,客戶端關閉與服務端的連接。客戶端與服務端的連接建立成功之後,服務端不斷讀取客戶端發送過來的數據,當客戶端與服務端連接斷開之後,服務端知道已經讀完了一條消息,然後進行解碼和後續處理

  2. 客戶端和服務器簡歷一個連接,客戶端連續發送兩條消息,客戶端關閉與服務端的連接。對於第二種情況,如果按照上面相同的處理邏輯來處理,那麼服務端在解析這個數據包的時候就肯定要按照組包時候的規則去解析包,不然肯定會出現解析數據不正確問題。

https://my.oschina.net/bieber/blog/487087  這篇博客解釋了dubbo對粘包拆包問題的解釋及解決方案,其實這方面也確實體現了協議的重要性,如HTTP協議,我們發送一個或者多個http協議,雖然發生了粘包和拆包問題,其實我們解析的時候直接按照協議的組包過程反向解析就好了。dubbo的話是按照dubbo棧,作爲一個包去解決拆包粘包問題,dubbo棧滿了就是一個協議包。這樣把無界限的數據流解析出來一個個的協議包。然後給服務器去處理。

這裏也是Tomcat和netty的不同之處,Tomcat只支持http協議,而netty支持各種協議。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章