思考:什麼是粘包?
同時執行多條命令之後,得到的結果很可能只有一部分,在執行其他命令的時候又接收到之前執行的另外一部分結果,這種顯現就是粘包。例如:
send(b'123')
send(b'abc')
recv(4) --> 1234 #應該接收123
recv(4) --> bc #應該接收abc
或者傳送的資料量大,一次沒有接收完,等下一次接收又收到了之前未收到的資訊,也會產生粘包現象。
傳送端傳送的資料,接收端不知道如何去接收,造成的資料混亂現象就叫做"粘包"。
udp不會有粘包現象,tcp才有。拆包機制:在tcp協議中,在傳送端因為受到網絡卡mtu限制,會將超過mtu限制大小的資料進行拆分傳送。到傳輸到目標主機的作業系統層時會將多個小包合併成原本的資料。
合包機制:在tcp協議中,將多次連續傳送且間隔較小的資料進行打包一次傳送。
65535 - ip包頭(20) - udp包頭(8) = 655071500 - ip包頭(20) - udp包頭(8) = 1472
如果sendto(num)
num > 65507 報錯
1472 < num < 65507 會在資料鏈路層拆包,udp協議本身是不可靠協議,所以一旦拆包之後造成的多個小資料報在網路傳輸中如果丟失任何乙個,那麼此次資料傳輸失敗。
num < 1472 是比較理想的狀態
python網路程式設計之粘包
一 什麼是粘包 須知 只有tcp有粘包現象,udp永遠不會粘包 粘包不一定會發生 如果發生了 1.可能是在客戶端已經粘了 2.客戶端沒有粘,可能是在服務端粘了 首先需要掌握乙個socket收發訊息的原理 應用程式所看到的資料是乙個整體,或說是乙個流 stream 一條訊息有多少位元組對應用程式是不可...
網路程式設計 粘包
粘包問題的產生 tcp流式協議 基於資料流的協議 接收方產生粘包問題 1.接收方不清楚資料有多長只接收了資料的一部分 2.接收方多讀取了資料 傳送方產生的粘包問題 作業系統沒有及時傳送前一次的資料,導致兩次資料粘在一起 粘包問題的根本原因是接收方不清楚資料的長度 tcp nigle 優化機制 如果多...
網路程式設計的粘包
客戶端粘包 傳送端需要等緩衝區滿才傳送出去,造成粘包 傳送資料時間間隔很短,資料量很小,tcp優化演算法會當做乙個包發出去,產生粘包 服務端粘包 接收方不及時接收緩衝區的包,造成多個包接收 客戶端傳送了一段資料,服務端只收了一小部分,服務端下次再收的時候還是從緩衝區拿上次遺留的資料,產生粘包 所謂粘...