造成黏包的原因,及解決方案

2022-03-13 07:22:29 字數 1040 閱讀 4975

什麼原因導致的黏包?

tcp協議的流失傳輸造成的黏包。

黏包:(自定義協議)先傳送資料長度,再傳送資料。

基於tcp先執行乙個遠端行命令的程式:

subprocess模組:

import

subprocess

res=subprocess.popen("

dir"

, shell=true, # 終端錯誤

stderr=subprocess.pipe, #標準 錯誤

stdout=subprocess.pipe #終端標準輸出

)print(res.stdout.read().decode("

gbk"))

檢視在當前目錄下的所有內容

程式的結果的編碼是以當前所在的系統為準的,windows,res.stdout.read()讀出來的是gbk,在接收端使用gbk解碼,且只能從管道裡讀取一次結果

注意:同時執行多條命令後,得到的結果很可能是一部分;(1024),因為在執行其他命令的時候又接收之前執行的另一部分結果,這種現象就是黏包

tcp 和udp的區別?

tcp:可靠的(保證對方能收到訊息),面向連線的,全雙工的流式傳輸,效率比較低。

udp:不可靠,效率高,是無連線的,基於資料報傳輸而傳輸資料,但是傳輸的資料長度有限制。

注意:只有tcp有黏包現象,udp永遠不會黏包。

黏包的解決方法?

使用struct解決黏包,借助struct模組,長度數字可以被轉換成乙個標準大小的4位元組數字,因此可以利用這個特點來預先傳送資料長度。

傳送時

接收時

先傳送struct轉換好的資料長度4位元組

先接收4個位元組使用struct轉換成數字來獲取要接收的資料長度

再次傳送

再按照長度接收資料

Linux tcp黏包解決方案

tcpip協議使用 流式 套接字 進行資料的傳輸,就是說它保證資料的可達以及資料抵達的順序,但並不保證資料是否在你接收的時候就到達,特別是為了提高效率,充分利用頻寬,底層會使用快取技術,具體的說就是使用nagle演算法將小的資料報放到一起傳送,但是這樣也帶來乙個使用上的問題 黏包,黏包就是說一次將多...

python之黏包和黏包解決方案

黏包現象主要發生在tcp連線,基於tcp的套接字客戶端往服務端上傳檔案,傳送時檔案內容是按照一段一段的位元組流傳送的,在接收方看來,根本不知道該檔案的位元組流從何處開始,在何處結束.兩種黏包現象 1 連續的小包可能會被優化演算法給組合到一起進行傳送 2 第一次如果傳送的資料大小2000b接收端一次性...

造成死鎖的原因和解決方案

計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就...