网络的目的是什么?
用于信息传输、接受 能把各个点、面、体的信息链接到一起 实现资源的共享
OSI模型:
应用层:提供程序服务
表示层:数据加密、优化、压缩
会话层:建立链接、传输服务
传输层:提供数据传输服务
网络层:路由选择 网路互联
连表层:链接交换
物理层:硬件、接口、网卡规定等
特点:
将功能分开来达到高内聚低耦合
让开发更为清晰
什么是网络协议?
是为了完成计算机网络通讯而制定的规则、约定、标准
各模型使用的协议:
应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输)
传输层:TCP(面向有链接的可靠的传输服务)、UDP(面向无连接的不可的传输靠服务)
网络层:IP(IP地址)常用IPV4:点分十进制 取值0~256之间(32位) IPV6::128位
物理层:IEEE
特殊IP:
127.0.0.1 本机IP
0.0.0.0 自动使用本地可用网卡IP
192.168.1.0 代表网段
192.168.1.1 通常为网关地址
192.198.1.255 广播地址
端口:
取值范围1~65535之间
1~255 一些通用端口
256~1023 系统端口
1024~65535 自用端口
Linux命令:
ifconfig 查看本机IP
ping IP 查看延迟
ps -aux 查看系统进程信息
chmod 设置文件权限
nice -9 ./hello.py 以9的优先级运行
pstree 查看进程树
ps -ajx 查看父子进程ID
Linux下文件类型:
bcd -lsp
b(快 设备文件)
c(字符设备文件)
d(目录)
-(普通文件)
l(链接文件)
s(套接字文件)
p(管道文件)
ps -aux 查询结果的 STAT表示进程状态:
D 等待态 阻塞 不可中断等待态
S 等待态 睡眠 可中断等待态
T 等待态 暂停 暂停执行
R 运行态(就绪态)
Z 僵尸
+ 前台进程(在终端运行)
< 有较高优先级的进程
N 较低优先级的进程
s 回话组
l 有子进程链接
进程优先级:
取值范围:-20~19 -20最高
Python socket模块
socket.gethostname() 获取本机名
socket.gethostbyname("主机名") 利用主机名获取IP
soccket.gethostbtname(“IP”) 获取本地IP
IP的十六进制转换:
socket.inet_aton(IP) 十进制转十六进制
socket.inet_atoa(十六进制) 十六进制转十进制
socket.gethostbyaddr('127.0.0.1')
返回值:元组(主机, 别名,ip地址)
socket.getservbyname("程序名") 获取程序端口
套接字:是通过编程语言提供的套接字编程借口
传输层服务:
tcp:(SOCK_STREAM)
面向有链接的可靠的传输服务 流式套接字
1.创建套接字:
socket = socket.socket()
2.绑定地址:
socket.bind
3.设置监听:
socket.listen()
4.等待客户端链接:
socket.accept()
5.消息收发:
socket.recv(4096)
socket.send(“”)
6.关闭套接字:
socket.close()
客户端:
1.创建套接字
socket.socket.socket()
2.发起链接
socket.connect(地址)
3.消息收发
socket.recv(1024) 收消息
socket.send("") 发消息
socket.sendall():
事物发消息 成功返回None 失败异常
4.关闭套接字
socket.close()
recv特性:
建立链接的另一端被断开,会返回一个空字符串 从缓冲区取内容
send特性:
另一端不纯在产生一个pipe Broken 异常 向缓冲区写内容
缓冲区:
减少和和磁盘交互协调数据收发 提高效率
粘包:
由于tcp是数据流套接字的原因每次发送的数据间
没有边界一次取不完下次取数据时会形成粘包
udp:(SOCK_DGRAM)
面向无连接的不可靠的传输服务 数据报套接字
1.创建套接字:
socket = socket.socket(AF_INET,SOCK_DGRAM)
2.绑定地址:
socket.bind()
3.收发消息:
socket.recvfrom()
socket.sento()
4.关闭套接字:
socket.close()
客户端:
1.创建套接字:
socket = socket.socket()
2.收发消息;
socket.recvform()
socket.sendto(“”, 地址)
3.关闭套接字:
socket.close()
sys.argv() 命令行获取参数
返回值:
元组:sys.argv[0] 开始 空格隔开 引号隔开
套接字属性方法:
套接字的属性:
socket.type
地址类型:
socket.family
套接字IO描述符:
socket.fileno()
系统IO描述符:
sys.stdin = 0
sys.stdout = 1
sys.stderr = 2
获取套接字地址:
socket.getsockname()
获取套接字客户端地址:
socket.getpeername()
设置端口重用:
socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
获取套接字选项值:
socket.getsockopt()
设置为非阻塞状态:
socket.setblocking(False)
超时检测:
socket.settimeout(sec)
HTTP协议(超文本传输协议):
网站浏览器获取网页的一种协议
并且所有的www.文件都必须遵守这个标准
HTTP请求:
1.请求行:
说明具体的请求类别和内容
GET /index.html /HTTP/1.1
请求类别 请求内容 协议版本
请求类别:
GET: 获取网络资源
POST: 提交一定的附加数据
HEAD: 获取响应头
PUT: 更新服务器资源
DELETE: 删除服务器资源
CONNECT: 未使用
TRACE: 用于测试
OPTIONS: 获取服务器性能信息
2.请求头:
对请求的具体描述
3.空行
4.请求体:
具体的参数或提交的内容
HTTP响应:
1.响应行:反馈具体的响应情况
HTTP/1.1 20 OK
版本协议 响应码 附加信息
响应吗:
1xx:提示信息,表示请求已经接收
2xx:响应成功
3xx:响应需要定向(重新记载链接第三方链接)
4xx:客户端错误
5xx:服务器端错误
2.响应头:
对响应内容的具体描述
3.空行
4.响应体:
将客户端请求内容进行返回
IO:
在内存中存在数据交换的操作可以认为是IO操作(输入输出)
IO密集程序:
大量的IO操作,消耗CPU较少
CPU密集程序:
大量的内存CPU运算,IO相对较少
IO分类:
阻塞IO:
因为某些条件没有达成 导致程序堵塞 如:input函数
非阻塞IO:
改变阻塞函数的状态不让其阻塞
IO多路复用:
通过一个监测
监控多个IO事件的行为,
哪个IO事件准备就绪就执行哪个IO事件
IO准备就绪:
IO事件即将发生时的临界状态
select模块
监控IO事件
rs, ws, xs = select(rlist, wlist, xlist[, timeout])
rlist: 等待处理的IO
wlist: 主动处理的IO
xlist: 出错希望去处理的IO
位运算:
按照二进制位进行位运算操作
& 按为与 | 按位或 ^ 按位异或 << 左异 >>右移
poll方法实现IO多路复用:
1.创建poll对象:
p = select.poll
2.注册关注的IO:
p.register(s, POLLIN | PLLERR)
不关注:
p.unregister(s)
事件类别:
POLLIN POLLOUT POLLERR POLLHUP POLLPRI
rlist wlist xlist 断开 紧急处理
3.监控IO:
events = p.poll()
功能:监控关注的IO事件
返回值:
返回发生IO事件
events是一个列表[(fileno, evnet), (), ()....]
每个就绪IO对应一个元组(描述符,就绪事件)
IO地图:{s.fileno():s}
4.处理IO事件
本地套接字:
作用:
用于本地文件不同程序间进行数据传输
本地套接字传输流程:
1.创建本地套接字对象
sockfd = socket(AF_UNIX, SOCK_STREAM)
2.绑定套接字文件,如果文件不存在则自动创建 存在则报错
sockfd.bind(file)
3.监听
listen
4.消息收发
recv send
多任务编程:
通过程序利用计算机的多个核心达到同时执行多个任务的目的
因此达到提升程序运行效率的目的
并行:
多个计算机核心在同时处理多个任务,
这时多个任务之间是并行关系
并发:
同时运行多个任务,内核在多个任务之间的不断切换,
达到多个任务都会执行的处理效果
此时多个任务之间是并发关系
程序:
可执行文件,是静态的,只占有磁盘
进程:
是一个动态过程 程序的运行过程
CPU时间片:
如果有个进程占有CPU此时我们称为该进程占有CPU的时间片
多个进程任务或轮流占有CPU时间片并形成并发效果
进程特征:
进程是操作系统分配资源的最小单元
每个进程拥有自己独立的运行空间(4个G的虚拟内存空间)
进程之间相互独立各不影响
进程的状态:
三态:
就绪状态:
进程具备执行条件,等待系统分配处理器资源进入运行态
运行态:
进程占有CPU处于运行状态
等待态:
进程暂时不具备运行条件,需要阻塞等待
五态:
在三态的基础上增加新建和终止态
新建:
创建一个新的程序,获取系统资源的过程
终止:
进程执行结束,释放资源的过程
OS模块:
判断一个文件是否存在:
os.path.exists(file)
删除文件:
os.remove(file)
os.unlink(file)
创建进程:
os.fork()
获取进程id:
os.getpid()
获取父进程id:
os.getppid()
退出一个进程:
os.exit()
sys.exit(退出提示)
sys.exit() 可以通过捕获 SystemExit异常退出
孤儿进程:
当父进程优先于子进程退出,此时子进程就会成为孤儿进程
孤儿进程会被系统指定进程收养 退出后会自动处理
僵尸进程:
当子进程优先于父进程退出,父进程没有处理子进程的退出状态
就会变成僵尸进程 僵尸进程会滞留PCB 消耗内存资源
如何避免僵尸进程的产生:
1.父进程先退出
2.父进程处理子进程状态
处理僵尸进程:
PID,status = os.wait():
wait 在父进程中阻塞等待处理子进程的退出
返回退的子进程的怕pid和退出状态
pid,status = os.waitpid(pid,option):
waitpid 在父进程阻塞等待处理子进程的退出
参数 :
pid -1 表示等待任意子进程退出
>0 表示等待对应PID号的子进程退出 option
0 表示阻塞等待 WNOHANG 表示非阻塞
返回退的子进程的怕pid和退出状态
利用二级子进程:
父进程创建子进程等待进程退出
子进程创建下一个进程,然后立即退出
二级子进程成为孤儿进程 处理具体工作
multiprocessing模块
process()
功能:
创建进程对象
参数:
target:函数对象
name 给进程新名称()
args:元组 用来给target函数位置传参
kwargs:字典 用来给target函数键值传参
启动进程:
p.start()
调用绑定函数有子进程运行
等待子进程退出:
p.join([超时检测])
不使用join回收可能后产生僵尸进程
使用multiprocessing创建进程子进程同样复制父进程的全部内存空间
之后有自己的独立空间 执行上互不干扰 子进程也有自己的PID特有资源等
使用multiprocessing创建子进程,一般父进程功能就是只用来创建子进程
回收子进程,返回事件交给子进程完成