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