07_01、软件开发架构、OSI七层协议、Socket编程
一、软件开发架构
1、C/S架构
C: client 客户端
S:server 服务端
客户端可以有多个
服务端需要具备的两大特征:
1. 24小时对外提供服务
2. 必须要有一个公网IP地址
2、B/S架构
B: browser 浏览器
S: server 服务端
本质上B/S也是C/S架构
二、OSI七层协议
互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。
实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
每层常见的物理设备
三、OSI七层协议—网络层
网络层的由来:
有了ethernet、Mac地址、广播的发送方式,世界上的计算机就可以彼此通信了,问题是世界范围的互联网是由 一个个彼此隔离的小的局域网组成的,那么如果所有的通信都采用以太网的广播方式,那么一台机器发送的包全世界都会收到。这个问题就不仅仅是效率低的问题了,更会是一种灾难。
所以必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关
网络层功能:
引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
IP协议:
规定网络地址的协议叫IP协议,它定义的地址称之为IP地址,广泛采用的v4版本即IPv4,它规定网络地址由32位2进制表示
IP协议规定了接入互联网的任何一台计算机都要有有个ip地址,ip地址能够确定世界上任何一台接入互联网的计算机
ip地址:
ipv4:
最小:0.0.0.0
最大:255.255.255.255
本机回环地址:127.0.0.1
ipv6:表示的范围非常大
本机ip地址的查看方式;win + r => cmd => ipconfig
公网IP和内网IP:
公网IP: 是需要购买的
内网IP:192.168开头
广域网,局域网
四、OSI七层协议—传输层
传输层的由来:
网络层的IP帮我们区分子网,以太网层的Mac帮我们找到主机,然后大家使用的都是应用程序,你的电脑上可能同时开启qq,暴风影音,等多个应用程序。
那么我们通过IP和Mac找到了一台特定的主机,如何标识这台主机上的应用程序,答案就是端口,端口即应用程序与网卡关联的编号。
传输层功能:
建立端口到端口的通信
端口(port)
范围0-65535,0-1023为系统占用端口,1024-8000 是常用软件使用的端口,以后我们自己开发的软件端口号要使用8000以后的
一个端口在同一时间不能同时使用
有了Mac地址+IP地址+端口,我们就能确定世界上独一无二的一台计算机上的应用程序
常用软件的端口号
应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL
熟知端口 21,20 69 23 25 53 80 22 3306
传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP
# http协议的端口号:80
# https协议: http + ssl证书
TCP协议
也叫流式协议, 可靠协议
TCP三次握手和四次挥手
UDP协议
不可靠传输,没有传输通道
应用场景:远程控制软件
TCP协议换人UDP协议的优缺点:
TCP:
1. 数据安全可靠
2. 速度慢
UDP:
1. 数据不安全,也不可靠
2. 速度快
五、Socket编程
1、什么是Socket编程
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的
2、套接字工作流程
3、 基于TCP协议的套接字编程(简单)
3.1 服务端
# 1. 实例化对象socket import socket # 2. 得到对象 # 2.1. 如果不传参数,代表的是TCP协议:SOCK_STREAM # 2.2 type=socket.SOCK_DGRAM => UDP协议 # server = socket.socket(type=socket.SOCK_STREAM) server = socket.socket() # 3. 绑定 server.bind(('127.0.0.1', 8002)) # 4. 监听, 数字代表的是半连接池 server.listen(3) print('服务端开始接收客户端消息了:') # 5. # sock: 当前连接的客户端对象 # addr: 客户端的地址 sock, addr = server.accept() # 6. 接收客户段发送的消息 # 1024代表的是字节数,接收数据的最大字节数 # 粘包现象 data = sock.recv(1024) # hello print('客户端数据:', data) # 7. 给客户端返回数据 sock.send(data.upper()) # HELLO # 8. 断开连接 sock.close() # 9. 关门 server.close()
3.2 客户端
# 1. 实例化对象 import socket client = socket.socket() # 2. 连接 client.connect(('127.0.0.1', 8002)) # 3. 给服务端发送数据,发送的数据类型必须是字节类型 client.send('hello'.encode('utf-8')) # 4. 接收服务端发送过来的数据 data = client.recv(1024) print('服务端的数据:', data) # 5. 断开连接 client.close()