粘包问题,以及在python中如何调用操作系统命令
生活随笔
收集整理的這篇文章主要介紹了
粘包问题,以及在python中如何调用操作系统命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.新模塊'subprocess'
復習: 在os模塊中調用系統命令 import os f = os.popen('dir') print(f.read())上面的結果和下面的寫法是一樣的 import subprocess r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)# subprocess.Popen(cmd,shell=True,subprocess.stdout,subprocess.stderr) # cmd : 代表系統命令 # shell = True 代表這條命令是 系統命令,告訴操作系統,將cmd當成系統命令去執行 # stdout 是執行完系統命令之后,用于保存結果的一個管道 # stderr 是執行完系統命令之后,用于保存錯誤結果的一個管道 stdout = r.stdout.read().decode('gbk') stderr = r.stderr.read().decode('gbk') print('正確的返回結果:',stdout) print('錯誤的返回結果:',stderr) print('錯誤的返回結果:',stderr)?
二.粘包問題? (只有tcp協議才會發送粘包,udp不會發生)
?
EX:?發送端發送數據,接收端不知道應該如何去接收,造成的一種數據混亂的現象
1.合包機制(nagle算法):?將多次連續發送且間隔較小的數據,進行打包成一塊數據傳送.?
?
?
?
2.拆包機制:?還有一個機制是拆包機制,在發送端,因為受到網卡的MTU限制,會將大的超過MTU限制的數據,進行拆分,拆分成多個小的數據,進行傳輸. ?當傳輸到目標主機的操作系統層時,會重新將多個小的數據合并成原本的數據
針對 使用udp協議發送數據,一次收發大小究竟多少合適?udp不會發生粘包,udp協議本層對一次收發數據大小的限制是:65535 - ip包頭(20) - udp包頭(8) = 65507站在數據鏈路層,因為網卡的MTU一般被限制在了1500,所以對于數據鏈路層來說,
一次收發數據的大小被限制在 1500 - ip包頭(20) - udp包頭(8) = 1472得到結論:如果sendto(num)num > 65507 報錯1472 < num < 65507 會在數據鏈路層拆包,而udp本身就是不可靠協議,所以一旦拆包之后,造成的多個小數據包在網絡傳輸中,如果丟任何一個,那么此次數據傳輸失敗num < 1472 是比較理想的狀態
?
轉載于:https://www.cnblogs.com/shuai1993/p/9477472.html
總結
以上是生活随笔為你收集整理的粘包问题,以及在python中如何调用操作系统命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [USACO2009 OPEN] 滑雪课
- 下一篇: websocket python爬虫_p