Tcp程式設計常見問題及解決方法總結(粘包,拆包)

2021-08-01 16:42:13 字數 1493 閱讀 3937

問題1、粘包問題

解決方法一:tcp提供了強制資料立即傳送的操作指令push,tcp軟體收到該操作指令後,就立即將本段資料傳送出去,而不必等待傳送緩衝區滿;

解決方法二:傳送固定長度的訊息

解決方法三:把訊息的尺寸與訊息一塊傳送

解決方法四:雙方約定每次傳送的大小

解決方法五:雙方約定使用特殊標記來區分訊息間隔

解決方法六:標準協議按協議規則處理,如sip協議

tcp粘包和拆包問題

(經典)tcp粘包分析

socket/tcp粘包、多包和少包, 斷包

netty精粹之tcp粘包拆包問題

問題2、字串編碼問題

將中文字串用utf8編碼格式轉換為位元組陣列傳送時,乙個中文字元可能會占用2~4個位元組(假設為3個位元組),這3個位元組可能分3次接收,接收端每次接收完後用utf8編碼格式轉換為字串,就會出現亂碼,並導致接收長度計算錯誤的情況。

解決方法一:以位元組數做為訊息長度的計算單位,而不是字元個數。

解決方法二:傳送方和接收方都採用unicode編碼格式。

問題3、長連線的保活問題

標準tcp層協議裡把對方超時設為2小時,若伺服器端超過了2小時還沒收到客戶的資訊,它就傳送探測報文段,若傳送了10個探測報文段(每乙個相隔75s)還沒有收到響應,就假定客戶出了故障,並終止這個連線。因此應對tcp長連線進行保活。

以下是非同步通訊時會遇到的問題:

問題4、緩衝區髒資料問題

同步傳送的拷貝,是直接拷貝資料到基礎系統緩衝區,拷貝完成後返回;

非同步傳送訊息的拷貝,是將socket自帶的buffer空間內的所有資料,拷貝到基礎系統傳送緩衝區,並立即返回;

因此非同步傳送時緩衝區設定不好會導致接收到髒資料的問題,如下所示:

第一次傳送資料:1234567890

第一次接受資料:1234567890

第二次傳送資料:abc

第二次接受資料:abc4567890

請參考:

解決方法一:將緩衝區的大小設定為實際傳送資料的大小。

問題5、記憶體碎片問題

頻繁的申請緩衝區會導致記憶體碎片的問題。

解決方法一:使用物件池和記憶體池。

請參考msdn:

問題6、亂序問題

多個執行緒使用非同步通訊方式向同乙個接收端(socket)同時傳送資料,會導致接收端接收的資料混亂。如下所示:

執行緒1第一次傳送:123456789,假設未傳送完,只傳送了123

執行緒2第一次傳送:abcdefgh,假設未傳送完,只傳送了abc

執行緒1第二次傳送:456789,傳送完成

執行緒2第二次傳送:defgh,傳送完成

接收端最終接收的資料為:123abc456789defgh。

解決方法一:乙個連線的傳送端線程排隊傳送資料。

SAP常見問題及解決方法

tp check all pf tp clearold all pf 45.saprouter相關 niping s server端 niping c h target host client端 saprouter r start saprouter 直接輸入niping and saprouter...

Ubuntu常見問題及解決方法

解決方法 不錯的方案 在使用者目錄下新建.vimrc,儲存即可生效。若想對所有使用者生效,可直接修改 etc vimrc.set nocompatible 關閉 vi 相容模式 syntax on 自動語法高亮 colorscheme molokai 設定配色方案 set number 顯示行號 s...

jmeter 常見問題 及解決方法

jmeter常見問題 一 結束時間的排程程式執行緒組是在過去,修復的結束時間欄位的值。解決方法 二 檢視結果樹中,響應資料為亂碼 問題分析 當響應資料或響應頁面沒有設定編碼時,jmeter會按照jmeter.properties檔案中,sampleresult.default.encoding設定的...