1.软件开发的架构:
1) C/S 架构:即client 和 server, 客服端与服务器端架构,这种架构是从用户层面来划分的,这里的客户端泛指客户端应用程序exe,程序要先安装,对用户的电脑操作系统环境依赖较大
2)B/S 架构:即browser 和 server, 浏览器端和服务器端架构,
2.IP地址:
ip地址是一个32位二进制数,通常被分割为4个8位二进制数(就是4个字节).ip地址通常用’点分十进制’表示,
如:100.4.5.6, 每一位都是0-255之间的十进制整数. 转为二进制:01100100.00000100.00000101.00000110
mac地址是全球唯一的,网卡内置的地址;
arp协议是通过目标ip地址来获取mac地址的
3.osi七层模型:
七层分法: 物理层-数据链路层-网络层-传输层-会话层-表示层-应用层
五层分法: 物理层(传电信号)-数据链路层(arp协议)-网络层(ip协议)-传输层(TCP/UDP)-应用层(ftp/http/https)
四层分发: 网络接口层-网络层-传输层-应用层
4.socket概念:
1)socket是应用层TCP/IP协议族通信的中间软件抽象层,他是一组接口.设计模式中,socket其实就是一个门面模式,
它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符
合指定的协议.
2)其实站在我们的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连
接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这
台机器上的一个应用程序。所以只要确立了ip和port就能找到一个应用程序,并使用socket模块来与之通信。
3)socket套接字,又称:伯克利套接字或bsd套接字.一开始,套接字被设计用在同一台主机上多个应用程序之间的通
讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的.
文件型套接字(AF_UNIX): unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接
字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信.
网络型套接字(AF_INET): 所有地址家族中,AF_INET是使用最广泛的一个.
5.TCP与UDP:
TCP: 可靠的,面向连接的协议,传输效率低全双工通信,面向字节流
UDP: 不可靠的,不面向连接的协议,传输效率高,面向报文,无拥塞控制,可一对多,多对多,多对一.
6.套接字(socket)初使用:
首先,TCP是基于链接的,因此必须先启动服务端,然后再启动客户端去链接服务端.
server服务器端:
sk=socket.socket() 实列化一个套接字对象
sk.bind((192.168.88.88,6613)) 把地址绑定到套接字
sk.listen() 监听链接
conn,addr=sk.accept() 接受客户端链接
ret=conn.recv(1024) 设置接受用户端信息多少
print(ret) 打印客户端信息
conn.send(b’xxx’) 向客户端发送信息
conn.close() 关闭客户端套接字
sk.close() 关闭服务器套接字
client客户端:
sk=socket.socket() 创建客户端套接字
sk.connect(‘192.168.88’.88,6613) 尝试连接服务器
sk.send(b’xxxx’)
ret=sk.recv(10000) 对话
print(ret) 打印获得的信息
sk.close() 关闭客户端套接字
7.socket() 参数整理:
默认: sk = socket.socket(family = AF_INET, type=SOCK_STREAM)
family参数: AF_UNIX(基于文件形式的套接字)
AF_INET(基于网络形式的套接字)
type 参数: 一种是基于TCP协议 SOCK_STREAM
一种是基于UDP协议 SOCK_DGRAM
8.打印进度条:print('\r'+ i*'=' + '>' + str(i*2) + '%',end='') i为for i in range(51)里的
补充知识点:
1.交换机的通信方式: 广播, 单播, 组播
功能:组成局域网,将数据以点对点或点对多的方式发送给目标
路由器的功能: 跨网段的数据传输,为下联设备分配ip地址
2.TCP粘包原因:
什么是粘包: 发送端发送数据后,接收端不知道该接收多少,所以导致数据混乱
原因: 和包机制(nagle) 与 拆包机制. 都是发生在发送端的
3.操作系统本质就是个软件,只不过是用来直接操作硬件的,这是其特殊之处
4.进程的理论:
进程是一个动态的概念,理解为正在运行的程序
xx.sh 表示是个shell脚本文件 xx.bat 表示是个批处理脚本文件
xx.out 表示Linux系统中的可执行文件 xx.exe 表示win系统中的可执行文件
xx.lib 表示库文件 xx.dll 表示是个库
5.multiprocessing 内置模块,是python提供,用于多进程编程
6.TCP只允许在同一个时间内,只能由一个客户端和服务器保持连接
UDP允许一个服务器和多个客户端同时通信
TCP协议的三次握手和四次挥手简述:
三次握手: 第一次请求一定是客户端先发起!!!
客户端向服务端发送请求连接
服务端回复确认收到请求,并要求也连接客户端
客户端回复服务器确认连接
四次挥手: 谁先发起都可以,这里以客户端为例来说明
客户端发起断开连接的请求,并表示我已没有数据发送,你有数据继续发,我继续收
服务端回复确认收到
服务端再次回复一个确认断开的连接请求
客户端回复一个确认收到
补充:syn=1代表请求建立连接;ack=1代表确认连接;seq=12..3是个序列号;fin=1代表请求断开链接
TCP协议为什么比UDP协议可靠,主要原因是TCP会保留发送出去的数据备份,等另一端确认收到后才会销毁
掉备份,如一段时间内没有收到回复,则重新再发送一次,UDP无此机制
网络编程模块统计:
socket套接字模块, subprocess调用系统cmd窗口模块, struct转定长数模块(pack和unpack)
1) struct模块示列: import struct
y=struct.pack(‘类型’,数字) 把任意长度的数字转为固定4个bytes长度的二进制
num=struct.unpack(‘类型’,y)[0] 把4个bytes长度二进制反解成原数字,注意,反解出来的是个包含一个元素的
元组,含的这个元素就是转换前的数字,要使用就通过索引取出即可
2)subprocess模块使用示列:
r=subprocess.Popen( ‘cmd命令’ , shell=True, #表示调用shell窗口去运行前面的命令
stdout=subprocess.PIPE #用来保存正确命令执行后的结果,结果为bytes类型
stderr=subprocess.PIPE) #用来保存错误命令执行后的结果,结果为bytes类型
print(r.stdout.read().decode(‘gbk’)) #得到正确内容
print(r.stderr.read().decode(‘gbk’)) #得到错误内容