网络编程-黏包现象

一.什么是黏包:

      同时执行多条命令之后,得到的结果很可能只是一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种现象就是黏包.

注意:只有tcp有黏包现象,udp永远不会黏包

二.基于tcp制作一个远程执行命令的程序 (subprocess模块)

import subprocess
res = subprocess.Popen(cmd.decode(gbk),shell= True,stdout = subprocess.PIPE,stderr = subprocess.PIPE)
stdout = res.stdout.read()
stderr = res.stderr.read()print(stdout)
print(stderr)


说明:
cmd:代表系统命令
shell:True 代表这条命令是系统命令,告诉操作系统,将cmd当成系统命令执行
stdout:是执行完系统命令之后,用于保存结果的一个管道
stderr:是执行完系统命令之后,用于保存错误结果的一个管道

结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码,在接收端需要用GBK编码

三.黏包成因:

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

  1.合包机制(nagle算法):将多次连续发送且间隔较小的数据,进行打包成数据传送

  2.拆包机制:在发送端,因为受到网卡MTU限制,会将大的超过限制的数据,进行拆分,拆分成多个小的数据,进行传输,当传输到目标主机的操作系统会重新将多个小的数据合并成原来的数据.