软件开发架构
软件开发,分为C/S架构 和 B/S架构
C/S架构 C:client 客户端 S:sever 服务端
B/S架构 B:browser 浏览段 S:sever服务端
本质上,B/S架构也是C/S架构
OSI七层协议
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
网络层
IP协议:规定了接入互联网的任何一台计算机都要有有个ip地址
ip地址:
ipv4:
最小:0.0.0.0
最大:255.255.255.255
本机回环地址:127.0.0.1 (就是自己在自己电脑上,找自己的ip地址)
ipv6:表示的范围非常大
# ip地址能够确定世界上任何一台接入互联网的计算机
公网IP和内网IP
公网IP :需要购买付费的,比如 阿里云,腾讯云,华为云等等
内网IP :以192.168 打头的IP地址
传输层
TCP协议和UDP协议都是属于传输层的
端口(port):
范围:0-65535
基本使用:
0-1024是系统默认使用的
1024-8000 是常用软件使用的 3306, 8000, 5000
以后我们自己开大的软件端口号要使用8000以后的
一个端口在同一时刻不能同时使用
ip+port能够表示世界上唯一一台计算机上的唯一一个应用正在执行
常用熟知的端口号
TCL协议
也叫流式协议,可靠协议
里面包含了 三次握手 四次挥手
三次握手 目的是为了建立连接
四次挥手 目的是在关闭连接前确认前面的数据已经传输完成,所以需要多一次
面试题: 为什么连接时三次握手,关闭连接时四次挥手
UDP协议
是不可靠协议
并且没有传输通道一说(说明这个协议并不安全)
比如说:远程协助软件
TCP:数据安全可靠,但是速度相对于UDP来说稍慢
UDP:数据传输速度快,但是不安全
socket编程
我们把socket翻译成套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作,抽象为几个简单的接口供应层调用已实现进程在网络中的通信
基于TCP协议的套接字编程
翻译一下,要用python代码来实现以下套接字的工作流程
套接字的工作流程(下图,超级重要)
服务端
import socket # 1 先实例化对象 socker() # 2 不过不传参数,代表的是TCP协议:SOCK_STRAM # 3 如果是UDP协议,那就把参数type = # 用变量sever接收,产生对象 sever = socket.socket() # 绑定一个端口,一个服务端,用于对外交流 sever.bind(('127.0.0.1', 8001)) # 监听,数字代表半连接池里面的 会话间 等待数量 sever.listen(3) print('开始接收客户端消息') # 怎么接收,接受到的是什么 # 用socket实例化的对象的sever,里面的accept方法来接受数据, # 点进去看源码,看可以看到return的返回值是 包含2个值的元组,可以用解压赋值 # return返回的2个值,sock指的是当前连接的客户端对象,addr:客户端地址 sock, addr = sever.accept() # 接受客户发过来的消息,所以用sock # 括号里的1024代表的是 接收数据的最大字节数 # 粘包现象,如果客户传过来有1025个数据,多了1个,一次接收不完,那就是成为粘包现象 data = sock.recv(1024) print('这个是客户端数据', data) # 给客户端返回数据 sock.send(data.upper()) # 传输完成,关闭连接 sock.close() sever.close()
服务端
import socket client = socket.socket() # 连接 client.connect(('127.0.0.1', 8001)) # 传出数据 client.send('helloworld'.encode('utf-8')) # 接收数据 data = client.recv(1024) print('已经收到服务端的数据', data) # 关闭连接 client.close()