网络并发编程01--OSI七层协议
1. 回顾python
# 变量与常量
# 基本数据类型
# 内置方法
# 字符编码&文件操作
# 函数
函数参数,闭包函数,装饰器
# 面向对象
封装,"继承",多态
"""
什么是对象
整合数据和功能,将来想要调用直接对象加点...就可以了
数据与功能的结合体(类似于工具包,化妆盒)
什么是类
类,最主要的功能是为了简化代码
多个对象公共的数据与功能的结合体
什么是父类
多个类,公共的数据与功能的结合体
对象必须要由 类 产生!!!
"""
# 自定义json类,实现其他数据类型与json的序列化
import json
from datetime import datetime, date
class MyJsonClass(json.JSONEncoder):
def default(self, o):
# 正常是用于当数据不符合默认序列化类别的时候报错
if isinstance(o, datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o, date):
return o.strftime('%Y-%m-%d')
return super().default(o)
# 定义字典
d = {'k1': datetime.today(), 'k2': date.today()}
print(d)
# 序列化
res = json.dumps(d, cls=MyJsonClass)
print(res)
"""
时间类型默认不支持json序列化
方式一:str()包裹一下
方式二:面向对象之继承(继承父类,重写方法,调用父类方法)
也就是自定义一个json类来实现序列化,参照上面代码
"""
2. 软件开发架构
两大类
C/S架构(client/server)
# 客户端/服务端
"""
将客户端看作是去店里消费的客人
将服务端看成是提供服务的店面
eg:手机端app,就是各大软件客户端
服务端需要具备三大特征:
1. 24小时不间断提供服务(24小时监听)
2. 固定的地址(IP地址)
3. 能够服务多个用户(高并发)
"""
B/S架构(browser/server)
# 浏览器/服务器
"""
浏览器统一充当各个服务端的客户端
本质:bs架构本质上也是cs架构
目前bs架构居多
"""
统一:统一接口的思想,也是各大互联网巨头正在做的事情
eg:
微信小程序(微信自主提供开发小程序软件)
支付宝小程序(各大程序接口)
# 总结:
网络编程学完,可以开发cs架构的软件(简易版本)
并发编程,前端,数据库,后端框架学完,可以开发bs架构软件
# 任何类型的软件!!
3. 网络编程前戏
网络编程就是研究程序之间的数据通信。
:基于远程传输的技术最早诞生于美国军方
#(前沿技术通常是由军事产生)
远程数据传输发展史(民用):
1.有线电话 电话线互联
2.无线电话 信号发射器
3.打屁股电脑 网线
4.笔记本 网卡
...
# 想要实现远程数据交互的前提是
必须要有物理连接介质
# 除了有物理连接介质之外,还应该有一些能够保证数据彼此无障碍交互的东西
# 也就是一些标准 OSI七层协议
4. OSI七层协议
协议规定了远程传输必须有的东西(计算机)
# 所有的计算机都必须有这七层
应用层
表示层
会话层
传输层
网络层
数据链路层
物理连接层
# 开发层面可以归纳为五层
应用层(包含应用层,表示层,会话层)
传输层
网络层
数据链路层
物理连接层
针对七层协议,从下向上研究
"1. 物理连接层:"
为了保证必须要有物理连接介质/接口
可以是网线,网卡...
"2. 数据链路层:"
1. 规定了电信号的分组方式
2. 以太网协议
规定了计算机必须有一块网卡,并且网卡上面要有一个固定的一串数字
12位的十六进制数
前六位:厂商编号
后六位:流水线号
也称之为计算机的mac地址(以太网地址/网卡地址)
类似于身份证号,是独一无二的(其实可以改,但是不要改)
"3. 网络层:"
IP协议:规定了接入互联网的计算机都必须有一个IP地址,用于唯一标识。
IP协议的两个版本
IPV4:点分十进制
最小0.0.0.0
最大255.255.255.255
255**4
IPV6:能够表示出地球上的每一粒沙子
# IP地址能够唯一 标识接入互联网的一台独一无二的计算机
公网IP 和 私网IP
公网IP需要花钱购买并申请
私网IP自带的,但是无法直接基于互联网访问
# arp协议 -- 不属于哪个层
# 地址解析协议
用来做IP地址和mac地址之间的转换
将IP地址转换成mac地址(基于网络请求完成的)
"4. 传输层:"
# 协议最多
TCP协议
UDP协议
(稍后)
# 端口协议:
范围:0 ~ 65535
特性:动态分配
eg:第一次运行微信,系统随机取一个端口号2022
关闭微信重新启动,端口号系统随机再分配
端口号基本使用
0 ~ 1024一般是系统默认需要使用的
1024~8000常见软件端口号
以后我们开发的软件最好使用8000之后的端口
# 端口号(port):能够唯一标识一台计算机上面正在运行的一款应用程序
"""
端口冲突可能会导致程序起不来
端口号在同一计算机,同一时刻,不能重复
"""
"总结:"
IP + port
能够唯一标识世界上某一台接入互联网的计算机上面的某一个正在运行的应用程序。
"5. 应用层:"
# 协议相对也较多
# 都是人为自定义的协议标准,可遵循,也可不遵循
最经典的协议有:http协议,ftp协议...
4.1 TCP&UDP协议
协议不同连接和传输数据的细节也会不同。
-
TCP(Transmission Control Protocol)传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接,然后再进行收发数据(如果数据丢失了还会重发。)
-
UDP(User Data Protocol)用户数据报协议,是一个无连接的简单的面向数据报的传输层协议。UDP不提供可靠性,他只是把应用程序传给IP层的数据报发送出去,但是并不能保证他们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快,节省资源。
下面我们详细来看
"TCP协议"
# 也叫流式协议,可靠协议
"面试题:"TCP协议之所以可靠的原因在于有双向通道,对不对???
不对
# 可靠的原因在于,接收数据时有反馈机制
# 流式协议
像流水一样,连续不断的发过去
TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。
"三次握手"
三次握手 建立链接
# 重要状态
listen监听态:等待对方发请求
syn_rcvd态: 忙于回复确认建立请求
# 洪水攻击:服务端在同一时间接收到了大量的要求建立链接的请求
# 通过压力,数量,让你的服务器瘫痪
"四次挥手"
四次挥手 断开连接
不能合并成三次
# 因为另一方还要查看有没有未完成的数据发送给对方
"UDP协议"
# 不可靠协议
速度快,节省资源
数据发送没有通道的概念,发送出去就不管了
"""
TCP协议相当于打电话,你一句我一句
# 网站,手机app数据获取等。。
UDP协议相当于发短信,只负责发送,不管看不看
# 语音通话,视频通话,实时游戏画面等。。
"""
常见硬件
交换机:能够使接入该机器的所有计算机之间彼此互联
局域网:由交换机组成的网络
互联网:将所有局域网全部连起来
简单的理解为是多个局域网之间彼此互联
"基于mac地址的数据传输"
# mac地址只能在局域网内使用
# 广播风暴
路由器:能够连接多个局域网,并实现局域网之间的数据传输。