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

      

  • 相关阅读:
    VS 2010 Addin 开发 1
    事件冒泡和默认事件
    闭包试验
    查询字符串中出现频率最高的几种方法
    JS函数中的参数
    a 项目已更新,b 项目可以基于这个项目处理
    windows 生成ssh 公钥 命令
    git fetch upstream 报错 XXX Permission denied (publickey). fatal: Could not read from remote repository
    考试的那点事儿
    MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
  • 原文地址:https://www.cnblogs.com/wjs521/p/9475268.html
Copyright © 2020-2023  润新知