1. 程式人生 > >socket傳輸過程中產生的粘包拆包問題

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

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

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

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

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

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

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