操作系统
一、操作系统
1.他是一个软件,是操作系统连接硬件与软件的纽带
现存的操作系统:windows,linux,macOS
2.C/S B/S
C:client客户端 B:browser浏览器 S:server服务器
C/S架构: 基于客户端与服务端的架构
B/S 架构:特殊的C/S架构
3.什么是网络通信
从一台计算机的一个软件将一个数据(文件,音频等)发送到另一台计算机的那个软件上 (软件与软件之间的通信)
计算机 + 操作系统 + 软件
二、网络通信
1.原理:
1)一系列的物理连接介质 2) 地址确定对方的软件的位置 3) 一系列的互联网协议
Osi七层模型
五层协议:
物理层: 物理连接介质 光纤,双绞线等等 (以电信号的方式)
物理层发送的数据:高低电平 01010001111...
数据链路层(二层): 主要是对数据进行分组 封包:源地址,目标地址
开始不统一,后来统一标准:
数据分两部分:
数据头 :固定18个字节 , 源地址6个字节, 目标地址 6个字节,数据类型 6个 字节
数据
数据分为组的形式:一组电信号叫数据报 ,也叫帧
head长度+ data 长度 =最短67字节,最长1518字节,超过最大限制就分片发送
网卡: mac地址 就是计算机的唯一标识,计算机出厂就会有网卡,网卡就会有一个mac地址
12位 16进制 前6位:厂商编号 后6位:流水线号
通信方式:广播 mac+广播形式只在局域网中实行
Arp协议:地址解析协议 通过ip地址获取mac地址(广播 单播)
二层交换机(局域网内部的通信) : 单播 广播 组播、 网卡
网络层(第三层协议):确定局域网的位置
ip协议:寻找对方局域网的位置
ip+mac +广播的形式就能确定世界上任何一个计算机的位置
Ipv4 iipv6
路由器(局域网之间通信) | 三层交换机(带有路由功能的交换机)
传输层(第四层): (tcp和udp协议) 每个软件都有一个固定的端口
0~65535 1~1024 系统占用 自己用在8000以后
端口: 确定软件的位置
端口 + ip + mac + 广播 就能确定世界上任何一个计算机软件的位置
四层交换机 四层路由器
应用层 : 每个软件对于数据都有不同的自定义协议 (FTP,www等)
表示层 **
会话层**
2.细节补充
数据链路层:
- 原则上:同一个局域网就是通过 源mac地址 + 目标mac地址 + 数据 + 广播 可以将数据传输.
- 这里 有一个交换机mac地址自主学习功能.
交换机有一个mac 与 网口的对照表.
1 40-8D-5C-93-F1-DE
2 40-8D-5C-93-F2-DE
3 41-8D-5C-93-F1-DE
.....
24 40-8D-5F-93-F1-DE - 同一个局域网之内发送一个数据:
源mac地址: 40-8D-5C-93-F1-DE 目标mac地址 40-8D-5F-93-F1-DE 数据 - 如果交换机第一次连接这些电脑:第一次 我的网口1连接的计算机发送一个数据,发送给目标mac,第一次的时候是不知道目标mac地址是多少的.
IP地址 + ARP协议 计算出对方的mac地址. - 同一个局域网之内:
第一次发送数据 需要广播的形式,获取对方的mac地址,将mac地址与网口写入交换机的对照表.
第二次发送数据(计算机与网口没更换):不用广播,而是直接从mac对照表寻找对方的地址.
网络层:
-
细节补充:怎么通过ip寻找对方的局域网的位置?
-
ipv4:
四点分十进制:
0255.0255.0255.0255
同一个局域网内所有计算机的IP地址绝对不同.
172.16.10.1
子网掩码(C类): 255.255.255.0 -
IP + 子网掩码才能确定是否在同一个网段,同一个子网,同一个局域网
-
如果子网掩码都是C类:255.255.255.0,那么 一个局域网可以分配多少个ip?
前提是C类子网掩码:一个网段:最多能有256个IP: 0 不能用, 255 不能用,254,: 253个IP/.
判断是不是同一个网段
- 端口 + IP + 子网掩码 + mac + 广播的形式就可以确定世界上任何一个计算机软件的位置.
精简: ip协议和ARP 协议可以获取我的mac地址,
端口和ip地址 就可以确定世界上任何一个计算机软件的位置.
总结:
通过计算机发送数据,我要先获取对方的ip和子网掩码:
去判断是不是同一个局域网
如果是同一个局域网: 通过IP ARP协议 获取mac 发送数据.
如果不是同一个局域网:网关(路由协议)一层一层的发送.
-
路由器:内网:DHCP协议:自动分配IP地址,子网掩码,网关IP地址
同一局域网内的所有计算机的IP一定不同,不同局域内
的计算机的IP可以相同
内网计算机的ip都是路由器虚拟出来的
外网: 连接外网,收发数据等 -
DNS服务器: 转化域名,IP地址 有一个字典
域名解析到ip的一个过程,{‘www.taobao.com’:192.145.12.1}
NAT技术:ip置换,将你的源ip置换成路由的ip
静态路由:将数据从路由A 传入路由D
路由协议:利用算法计算你达到目标路由的最短距离,数据由路由A发送到路由D,再通过端口映射技术发送到
京东服务器对应软件的端口
tcp和udp
1.tcp和http区别:
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
http和 https 区别
http是超文本传输协议,信息是铭文传输,链接很简单,是无状态的,端口是80
https协议需要到ca申请证书,具有安全的SSH+HTTP加密传输协议,端口是443,比http协议安全
soket和http区别
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议,端口】。
Http协议即超文本传输协议,是Web联网的基础,也是手机联网常用的协议之一,http协议是建立在TCP协议之上的一种应用。
socket连接:socket连接即是所谓的长连接,理论上客户端和服务端一旦建立连接,则不会主动断掉;
Http连接:http连接就是所谓的短连接,及客户端向服务器发送一次请求,服务器端相应后连接即会断掉。
** websocket 和 http 区别**
socket 不是协议 是在传输层与应用层的通信的抽象层,是接口,,提供一套调用TCP/IP协议的API。
WebSocket是应用层协议。
相同点:
都是一样基于TCP的,都是可靠性传输协议。
都是应用层协议。
区别:
WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。
WebSocket是需要浏览器和服务器握手进行建立连接的。而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接
WebSocket连接的过程是:
首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
2.tcp协议和udp协议
1)tcp: 可靠的,面向连接的协议,全双工的,流式传输,传输速度慢(银行)
场景:# http pop3 ftp协议
Udp: 不可靠(股票),面向报文的,无连接的,一对多,多对多,一对一的通信的,传输速度快
场景:即时通讯类软件(QQ,微信) 在线观看视频
为什么tcp比udp更可靠?
因为在传输数据时内部有回执策略,判断我发出去的 消息对方有没有收到,没有我就重发,通过这种方式让通信更可靠
CSRF
CSRF主流防御方式是在后端生产表单的时候生成一串随机tocken,内置到表单里成为一个字段,同时,将此串tocken置入session中。每次表单提交到后端时都会检查这两个值是否一致,以此来判断此次表单提交是否可信,提交过一次之后,如果这个页面没有生成CSRF tocken,那么tocken将会被清空。如果有新的需求,那么tocken会被更新。攻击者可以伪造POST表单提交,但是他没有后端生成的内置于表单的tocken,session中没有tocken都无济于事。
**3.简述三次握手,四次挥手 **
法一:
三次握手:
客户端向服务端发起一个syn请求
服务端回复ack,同时服务端发送syn请求
客户端再回复ack
connect --> accept
四次挥手:
客户端向服务端发起一个fin请求
服务端回复ack
服务端发送fin请求
客户端回复ack
close <--> close
法二:
三次握手:(1)客户端发送一个带syn=1 seq=x标志的TCP报文到服务器(2)服务器回应客户端,同时带ack=1+x和syn=1 seq=y标志(3)客户端必须再次回应服务端一个ack=1+y报文
四次挥手:(1)客户端发送一个fin=1 seq=x用来关闭客户到服务端的数据传送,(2)服务器收到fin=1 seq=x,给客户端发回ack=1+x (3)服务器关闭客户端连接,发送一个fin=1,seq=y,(4)客户端发回ack=1+y
或者面试的时候画出如下这个图也行
三次握手
四次挥手
4.为什么是三次握手?而非两次
1) Syn起同步的作用,假设不采用三次握手,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求server端会一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用三次握手的办法可以防止上述现象发生
2) 而三次握手是一种能应对网络不稳定情况的最简方案,对应到TCP的三次握手,其实就是为了应对已经失效的连接请求报文突然又传到服务端而产生的错误场景
5.Syn洪水攻击
Tcp协议称好人协议
一个服务器接受客户端的请求非常多,有黑客会制造很多大量的假ip,发送请求,真ip进不去,然后去处理大量的假ip , 服务端会定时发送请求,与假ip建立链接,服务端容易崩.
<a name='1'style='color:black'>三、套接字socket
- python中socket是一个模块,与网络通信相关的模块
socket是在应用层与传输层中间的抽象层,帮助你去拼接报文或是协议,把你要发送的信息拼接好,发送给对方。基于文件和网络的通信
2. socket简单流程
创建socket对象,绑定ip和端口,开始监听,等待客户端链接,建立链接后,收发消息,关闭连接,关闭socket对象
**3.写一个简单通信 **
1)一个客户端,一个网络端,让其实现数据传输 (先运行服务器端,在运行客户端)
2)多个客户端同时连接
服务端
客户端
3)远程操控subprocess
shell: 命令解释器,相当于调用cmd 执行指定的命令。
stdout:正确结果丢到管道中。
stderr:错了丢到另一个管道中。
windows操作系统的默认编码是gbk编码
import subprocess
obj=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
aa=obj.stdout.read().decode('gbk') 默认是gbk的字节
print(aa)
bb=obj.stderr.read().decode('gbk')
print(bb)
服务端
客户端
<a name='2'style='color:black'>四、粘包
只存在于基于tcp协议的socket
造成粘包的现象
两个数据小 时间间隔短 就会在发送端粘包
数据传输到目的地之后,没有被及时接收,或者没有接收完,在接收端发生粘包
解决办法 : 自定义协议 添加报头
这是数据接收的流程:如下图
简述一下这张图:
第一种客户端输入命令,就会放到输出缓冲区,然后通过网络传给服务端的缓冲区,服务端接收1254,然后再通过网络send出去到了客户端的recv缓冲区(1254个字节), 但revc只接受1024个字节,所以客户端只接受了1024个,recv缓冲区还剩230个字节,只要客户端再send命令,此时send立马变成recv状态就会去接收上次剩下的230字节(解释不太清楚)
细节:,(只要客户端将数据send出去,就会立刻进入recv状态)
查看缓冲区大小
low版解决粘包问题 struct
import struct
# 将一个数字转化成等长度的bytes类型。
ret = struct.pack('i', 183456)
print(ret, type(ret), len(ret))
# 通过unpack反解回来
ret1 = struct.unpack('i',ret)[0]
print(ret1, type(ret1))
服务端
客户端
高大尚版解决粘包问题(上传下载)
服务端
客户端
<a name='3'style='color:black'>五、udp通信
服务端
客户端
1.socketserver实现并发 同时接受多个客户
服务端
客户端
IO多路复用机制
在网络交互的使用
作用:是操作系统提供的,能够同时监听多个网络通信对象的机制
1.操作系统提供的
2.IO : 网络上的发送 接收数据
多路io: 多个客户端同时发送或者接受请求
复用 : 重复 复合,多个客户端同时使用一个通道进行发送,接收数据
在单线程中,如果需要接收多个请求,就是用io多路复用代理
windows操作系统有 :select机制
linux操作系统中 : select机制 poll epoll机制
select机制 :采用轮询的方式检测某个对象是否有数据来,
所以要监听的数据越多,效率越差
由于底层数据结构的问题,能够监听的对象个数有限的
poll机制 : 采用轮询的方式检测某个对象是否有数据来,
修改了select底层的数据结构,使得能够监听更多的对象
所以要监听的数据越多,效率越差
epoll机制 : 采用回调函数的机制
效率比之前的都好
selector模块 : 会帮助你选择当前操作系统中效率最高的io多路复用机制
内存管理机制
python的内存管理机制就是引用计数器机制和垃圾回收机制的混合机制。
一个内部跟踪变量,称为引用计数器。每个对象各有多少个引用,简称引用计数。当对象被创建时,就创建了一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。(并不是100%这样)
查看引用对象个数的方法:导入sys模块,使用模块中的getrefcount(对象)方法,由于这里也是一个引用,故输出的结果多1