• 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 是比较理想的状态

      

  • 相关阅读:
    CSS实现DIV水平自适应居中
    jQuery实现鼠标拖动改变Div高度
    Word2013创建目录
    raw,cow,qcow,qcow2镜像的比较
    Chrome浏览器官方下载地址
    OLE/COM 对象查看器 & OLE常用术语
    VmWare为Fedora虚拟机扩展磁盘
    Linux常用命令
    项目经理与客户沟通的宜与忌
    转 FileStream Read File
  • 原文地址:https://www.cnblogs.com/wjs521/p/9475268.html
Copyright © 2020-2023  润新知