subprocess 粘包问题

1、执行命令:

  在py代码中去如何调用操作系统的命令

  新模块: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     是执行完系统命令之后,用于保存错误结果的一个管道

  print(r.stdout.read().decode('gbk'))

  print(r.stderr.read().decode('gbk'))

  

  

2、粘包问题  :只有tcp协议才有可能发生粘包,udp不会发生

  ex:发送端发送数据,接收端不知道如何去接收造成的一种数据混乱的现象。

  在tcp协议中,

    有一个合包机制(Nagle算法),将多次连续发送且间隔较小的数据,进行打包成一块数据发送。

    还有一个拆包机制,在发送端,因为受到网卡的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/wjs521/p/9475268.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值