React学习20220312 生命周期

React学习20220312

CreateElement函数拆解

image-20220312150556893 image-20220312150653145 image-20220312150814067 image-20220312150922420

生命周期

image-20220312151139289

React16

image-20220312152345970

挂载过程

image-20220312152839851

getDerivedFromProps的功能:使用props来派生/更新state

  • 是针对某个属性的定向更新

更新过程

image-20220312153339553

getSnapshotBeforeUpdate:

image-20220312154540844 image-20220312154512940

React16引入的Fiber架构

之前组件更新:树状递归更新,同步更新,占用主线程,易卡死

Fiber会把大任务转为小任务,使得渲染线程可打断

重要特征

可以被打断的异步渲染模式

react将渲染过程分为render和commit两个过程

render可被打断

commit同步执行

因为commit会改视图,因此不可打断

数据的流动

基于props的单向数据流:

当前组件的state以props的形式流动时,只能流向组件树中比自己层级更低的组件

父子组件通信

父组件把this.props传入子组件

子父组件通信

父组件向子组件传递一个绑定了自身上下文的函数

子组件在调用该函数时,

就可以把想要交给父组件的数据以函数入参的形式传入

image-20220312163654393 image-20220312163734257 image-20220312163752751

黑盒测试

测试用例选择

  1. 为每一个等价类规定一个唯一编号;
  2. 设计一个新的测试用例,使其尽可能多地覆盖 尚未被覆盖的有效等价类,重复这一步,直到 所有的有效等价类都被覆盖为止;
  3. 设计一个新的测试用例,使其仅覆盖一个尚未 被覆盖的无效等价类,重复这一步,直到所有 的无效等价类都被覆盖为止

image-20220309134921110

分类

是否是三角形的三条边

等价类

A>0

B>0

c>0

A+B>C

B+C>A

A+C>B

非等价类

A<=0

B<=0

C<=0

A+B<=C

是否等腰

等价类

A=B

B=C

C=A

非等价类

A!=B!=C

是否等边
等价类

A=B=C

非等价类

A!=B

B!=C

C!=A

边界值分析法(单缺陷假设)

比最大值稍微小一点,比最小值稍微大一点

image-20220309140314690

健壮性测试:(再多两个点)

比最大值稍微大一点,比最小值稍微小一点

image-20220309140305899

最坏情况测试:

多变量取极值的情况

image-20220309140255646

健壮最坏情况测试

最坏情况取超边界情况

image-20220309140405550

错误推测法

根据经验推测

简单有效,但系统性差,是其他的补充

判定表法

判定表是一种用来表示和分析复杂逻辑关系的工具,最适 合描述在多个逻辑条件取值的组合所构成的复杂情况下, 分别要执行哪些不同的动作。

条件桩(Condition Stub):列出了问题的所有条件。通常认为列出的条件的次序无关紧要。

动作桩(Action Stub):列出了问题规定可能采取的操作。这些操作的排列顺序没有约束。

条件项(Condition Entry):列出针对它所列条件的取值,在所有可能情况下的真假值。

动作项(Action Entry):列出在条件项的各种取值情况下应该采取的动作

例子

“……对于功率大于50马力的机器,并且维修记录不全或已运行 10年以上的机器,应给予优先的维修处理……

(1)列出所有的条件桩和动作桩

– 条件桩 C1:功率大于50马力吗? C2:维修记录不全吗? C3:运行超过10年吗?

– 动作桩 A1:进行优先处理 A2:做其他处理

(2)确定规则个数

– 输入条件个数:3

– 每个条件的取值:“是”或“否”

– 规则个数:222 =8

image-20220309143736908

image-20220309143751694

因果图法

从用自然语言书写的程序规格说明 的描述中找出因(输入条件)和果(输出或程序状态的改 变),通过因果图转换为判定表

基本步骤

  1. 分析软件规格说明描述中,哪些是原因(即输入条件或输入 条件的等价类),哪些是结果(即输出条件),并给每个原因和 结果赋予一个标识符。

  2. 分析软件规格说明描述中的语义,找出原因与结果之间,原 因与原因之间对应的关系,根据这些关系,画出因果图

  3. 由于语法或环境限制,有些原因与原因之间,结果与结果之 间的组合情况不可能出现。为表明这些特殊情况,在因果图上用 一些记号标明约束或限制条件

  4. 把因果图转换成判定表。

  5. 把判定表的每一列拿出来作为依据,设计测试用例

图形符号

image-20220311152714975

image-20220311152824009

白盒测试

白盒测试

定义

知道内部工作过程,可通过测试内部动作来测试

目标

通过测试来检测软件产品内部动作是否按照规格说明书的规定正常执行

重点

看软件内部各条通路是否按照规定工作

特点

黑盒可能存在负负得正的情况,而白盒不会

白盒能发现一些隐患:如内存泄漏,误差累积等

作用

主要想对程序模块进行如下的检查

对所有独立测试路径至少测试一次

对所有的逻辑判定,取真/假的两种至少测试一次

在循环的边界和运行界限内执行循环体

测试内部数据结构的有效性

局限

一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。

比较

image-20220311162005086

如何安排白盒测试

单元测试

集成测试

  • 集成阶段,依据概要设计说明书

  • 静态结构分析

  • 代码质量度量

  • 功能确认与接口分析

  • 覆盖率分析

  • 性能分析

  • 内存分析

系统测试

到这步已经很少做白盒测试了

验收测试

白盒测试综合策略

  1. 在测试中,应尽量先用工具进行静态结构分析。

  2. 测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查和静态质量度量,再进行覆盖率测试。

  3. 利用静态分析的结果作为引导,通过代码检查和动态测试的方式对静态结构分析结果进行进一步的确认,使测试工作更为有效

  4. 覆盖率测试是白盒测试的重点,一般可使用基本路径测试 法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖标准衡量代码的覆盖率。

  5. 在不同的测试阶段,测试的侧重点不同:在单元测试阶段 ,以代码检查、逻辑覆盖为主;在集成测试阶段,需要增加静态结构分析、静态质量度量;在系统测试阶段,应根据黑盒测试的结果,采取相应的白盒测试

白盒测试用例设计技术

静态

  • 代码检查(人工+工具)

  • 静态结构分析(主要由软件工具自动进行)

  • 软件质量度量(主要由软件工具自动进行

动态

MC服务器设置

MC服务器设置

[toc]

今天心血来潮搞了个mc服务器,下面记录一下过程

基础配置

服务器系统:Debian(我也不知道是什么版本,反正是vultur上买的)

java版本:openjdk8 具体下载过程在后面有说

之后参考教程教程/架设服务器 - Minecraft Wiki,最详细的我的世界百科 (fandom.com)

java下载

参考: 如何在Debian 10 Linux上安装Java (myfreax.com)

执行以下代码即可

1
2
3
4
5
6
7
8
9
10
sudo apt update

sudo apt install apt-transport-https ca-certificates wget dirmngr gnupg software-properties-com

wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -

sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/

sudo apt update
sudo apt install adoptopenjdk-8-hotspot

最后看看是否真的安装了

1
java -version

预计输出如下

1
2
3
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b04, mixed mode)

服务器配置

基础代码仓我直接用了已有的github仓库(不想自己搞了)

直接在Linux命令行下输入这些就行

1
2
3
4
5
6
7
wget https://github.com/silvertriclops/MCSLI/archive/master.zip
unzip master.zip
cd MCSLI-master
sudo chmod +x install.sh
sudo chmod +x start.sh
./install.sh # tells the computer where Java is so it knows how to start Minecraft
./start.sh # starts the Minecraft server. You may want to run this command inside screen.

理论上来说,这样就已经可以用了

输入 stop退出

开放tcp端口

因为是服务器,需要和客户端交互,一个tcp端口是必不可少的

一般来说,根据上面创建的服务器,默认使用的是25565(启动的时候中间有一行会提示的)

就像下面这样

image-20211219204134588

然后输入下面代码就能开放对应端口(不过我也不知道开了到底会有什么坏影响,服务器做好备份?)

1
2
sudo iptables -A INPUT -p tcp --dport 25565 --jump ACCEPT
iptables-save

换成我想要的版本(1.12)

不过这个仓库七年前就停止更新了,里面的服务器版本为1.8版本

想更新成自己的版本需要去MC官网下,就几十mb很小,下载好对应版本后

回到之前的文件夹(MCSLI-master)

把对应版本的文件放进来

如果不知道怎么把文件传给服务器,看下面

我用的Xshell连接服务器,这时候可以下载xftp,用于文件传输,图形化界面,用了都说好

之后更改配置(MCSLI-master/start.sh)

里面能看到写了一行启动代码,把它里面对应服务器jar包的那部分换成你的jar包(相对位置绝对位置都可以)

看看能不能用

1
./start.sh

只要不报错就算成功

加装mod

mod是mc的灵魂,不打mod我不认可(实际就是我菜)

这时候需要下载forge

打开forge的官网

Downloads for Minecraft Forge for Minecraft 1.12

下载对应的版本,我是1.12就下载了1.12

放到和刚才文件同一级目录下

执行

1
java -jar forge-1.12-14.21.1.2443-installer.jar --install

这时候你使用 ls 看看文件夹下,可以看到有类似

image-20211219203443648

这种东西出现

那么你的forge安装已经成功了一半了

之后打开你该死的本地MC(加装了对应版本forge的那种)

把.minecraft下的resources文件夹,整个给复制到服务器里头去(还是刚才那个文件目录)

之后执行

1
./start.sh

最后能看到这些信息就算成功

image-20211219203701426

享受服务器

打开你的本地MC,输入服务器ip,连接后进入就行

啸贴士

如果你一不小心做错了,或许可以评论,我期末摸鱼的时候可能会来评论一下

计算机网络复习

计网复习

大纲

[toc]

1. 计算机网络体系结构

1.1 计算机网络概述

1.1.1计算机网络的概念、组成

概念

计算机网络就是通过交换机,路由器等网络设备和通信线路将分散在不同地理位置的多个计算机系统连接起来,在网络协议和应用软件的控制下实现各种网络服务的系统.

  • 资源共享-最终目的
  • 数据通信-资源共享的前提

网络的结构

  • 网络边缘(network edge)-服务端和客户端

    • 服务端功能:发送分组数据

      收到应用数据->拆解为小组块->以R传输速率(带宽bandwidth)进行传输

      传输延迟$L_{比特数}/R_{传输速率}$


  • 接入网络(access networks)-物理介质

    • 物理层: 发送端和接收端之间

    • 导引型介质(guided media)

      • 固体介质-铜线,光纤(optical fiber),同轴电缆(coaxial cable)

        双绞线:螺旋排列减小电磁干扰

        同轴电缆:单信道/多信道

        光纤:光脉冲,低差错率,无电磁干扰

    • 非导引型介质(unguided media)

      • 自由发信号
      • e.g. 无线电
  • 网络核心(network core)-互联的路由器

    • 路由器网络

    • 分组交换

      主机把报文分解成分组

      网络核心转发分组(从源头到目的)-

      单个分组传输到相邻节点,存储下来后查转发表,转发到下一节点。

1.1.2计算机网络的分类

    1. Transmission technology传输技术
      广播链路

      image-20211210103557833点到点链路
      image-20211210103606005

    1. Scale距离尺度
      局域网LAN 101km
      城域网MAN 1km
      10km
      广域网WAN 100km~
    1. Topology拓扑结构
      星形什么的,看名字就知道了
    1. Switching交换
      1. Packet Switching 分组交换
      2. Circuit Switching 电路交换

1.1.3计算机网络与互联网的发展历史[不考]

1961-1972: Early packet-switching principles 分组交换的发展

1972-1980: Internetworking, new and proprietary nets网络互联.专用网络
1980-1990: new protocols, a proliferation of networks网络的激增
1990, 2000’s: commercialization, the Web, new apps 商业化

2005-present

1.1.4计算机网络的标准化工作及相关组织[不考]

IETF(因特网工程任务组)

IEEE802-局域网/城域网标准委员会,指定相关标准

1.2计算机网络体系结构与参考模型

1.2.1计算机网络分层结构

1.2.2计算机网络协议、接口、服务等概念

服务: 层的功能

协议: 同一层的对等实体间的交流服务

接口: 告诉上层如何访问

1.2.3ISO/OSI参考模型和TCP/IP模型

ISO/OSI 参考模型

ISO: international Standards Organization

OSI: Open Systems Interconnection

• application: 支持网络应用
• presentation:允许应用程序解释数据的意义,如加密、压缩
• session: 数据交换的同步,检查和恢复
• transport:进程到进程的数据传输(端到端)
• network:为数据报选择从源主机到目的主机 的路径
• data link:在邻近网元之间传输数据

• physical:在介质上传输原始比特

TCP/IP 参考模型

协议栈

image-20211210105419434

下图左为OSI,右为TCP/IP

image-20211210105133165

混合模型(Hybrid Model)

本课程使用的模型

image-20211210105705057

传世经典(bushi)-数据传输过程中在各层发生的变化

image-20211210105729673

1.3计算机网络性能指标

吞吐量Throughput-传输位数/传输时间

  • 带宽是吞吐量的绝对上限

带宽 Bandwidth

在单位时间内,从网络中的某一点到另一点所能通过的位数

时延/延迟 Delay

一个数据库从网络的一端传送到另一端所需要的时间

时延=处理时延+排队时延+传输时延+传播时延

  • 传输时延-数据量/带宽
  • 传播时延-传输距离/光速
  • 往返时延(RTT)-从发送端发出,到发送端收到接收端的确认的总时延
  • 端到端时延-分组从源主机到目的主机路径上每个节点时延的总和
  • 时延带宽积-传播时延*带宽

 

2. 应用层

2.1 应用层协议原理

2.1.1网络应用程序的体系结构

Client-Server(C/S)

server:

永远在线

永久ip

服务器集群增强可扩展性

client

与服务器交互

动态IP地址

客户机之间不直接通信

Peer-to-Peer(P2P)

没有长期存在的服务端

端系统之间直接通信

对等方向其他对等方(Peer)请求服务,同时给其他peer提供服务

对等方间歇性连接,IP可变

2.1.2可供应用层使用的传输层服务

app需要什么?

数据完整性

吞吐量

时效性

安全性

TCP

提供

  • 面向连接
  • 可靠传输
  • 流量控制
  • 拥塞控制

不提供

  • 定时(时效性)
  • 最小带宽保证

UDP

不可靠数据传输

不提供

流量控制

连接建立

可靠性

拥塞控制

时效性

最小带宽保证

因特网使用的应用层协议和传输层协议

image-20211210111555991

2.2应用层协议

2.2.1Web和HTTP

http:超文本传输协议

使用TCP协议

  • 客户端初始化传输端口,发送给服务端
  • 服务端接受连接请求
  • 交换信息
  • 连接关闭

非持久http: 每个连接只发送一个对象(HTTP/1.0)

例子

  • image-20211210125021314

持久http:每个连接发送多个对象(HTTP/1.1)

过程

  • 客户端初始化连接
  • 服务端接受
  • 下面步骤*n
    • 客户端发送请求
    • 服务端发送数据
    • 客户端收到数据
  • 服务端关掉连接

例子

  • image-20211210125349254
HTTP请求报文

两种type: 请求和响应

请求报文样式:

请求行 报头 空白行 正文

GET /somedir/page.html HTTP/1.1 –请求

Host: www.someschool.edu User-agent: Mozilla/4.0 Connection: close Accept-language:fr–报头

无状态(Statelessness)和Cookies

无状态-服务器不保留有关客户过去请求的任何信息

Cookies

一个小文件/字符串,使得服务端能够跟踪用户

实现

在Http响应报文上加上set-cookie头

请求报文上加入cookie报头

cookie文件留在用户本地,用浏览器管理

在服务端留有后端的服务器存储用户真正信息

image-20211210174626429
Web缓存 -代理服务器

目的:缩短对客户请求的响应时间,减少组织接入链路上的流量

用户浏览器:通过缓存访问网站

浏览器把所有的HTTP响应发送给cache

  • 条件GET
    如果缓存中有最新缓存版本,就不发送该对象

2.2.2FTP[不考]

2.2.3Electronic Mail——SMTP, POP3, IMAP

关键组件:

用户代理

  • 邮件阅读者

    撰写,编辑,阅读邮件

    发送/接收在server上存储的邮件

邮件服务器

  • mailbox 保留用户收到的信息

    为发送的邮件信息创建发送队列

    在server中间提供SMTP协议服务,用来发送邮件

示意图

image-20211210175052267

邮件发送协议:

  • SMTP:简单邮件传输协议
  • MIME:通用因特网邮件拓展
    SMTP只能传输ASCII码,不能传输二进制数据,MIME允许二进制数据以ASCII编码

邮件读取协议:

  • pop:邮局协议 Post Office Protocol
    授权+下载
  • IMAP:因特网报文读取协议
    更多功能
    操作存储在服务器上的报文
  • HTTP: gmail,Hotmail,Yahoo!Mail

2.2.4DNS 域名系统

提供的服务

主机名到ip的翻译

主机别名

邮件服务器错误识别

负载分配(即一个主机名对应一组IP地址)

分布式层次化数据库

image-20211210182515156

访问www.amazon.com的过程

客户->root,得到com server

客户->com server 得到 amazon.com DNS server

客户->amazon.com DNS server 得到对应ip地址

本地域名服务器

大学/公司内部搭建

主机创建DNS请求的时候,先送到本地DNS server

域名解析例子
DNS Protocol

使用UDP协议的53号端口传输

2.2.5P2P[不考]

2.3网络编程[不考]

网络应用程序编程接口-套接字[不考]

3.传输层

3.1传输层提供的服务

3.1.1传输层的功能

为运行在不同主机上的应用进程之间提供逻辑通信

  • 端到端
  • 依赖并强化网络层服务

3.1.2无连接服务与面向连接服务

无连接:无握手

面向连接:数据交换前通过握手初始化发送方与接收方的服务

3.1.3传输层寻址与端口

传输层寻址通过TCP和UDP的端口实现

TCP/IP:0~65535

  • 0~ 1023:标准端口,用于特定服务
  • 其余临时端口

不同的端口表示不同的应用程序

3.2无连接的传输协议——UDP

特征

尽力而为(会丢包,顺序会乱)

无连接-没有握手,每个报文的处理与其他报文独立

经常被流媒体使用(能容忍丢包,对时间敏感)

DNS和SNMP是用UDP的

UDP格式

源端口(16bit目的端口(16bit)长度(16bit)校验和(16bit)报文

UDP校验和计算

临时把伪首部(12字节IP首部)和数据报连接在一起,用于检验是否在正确的端点之间传送

计算校验和

过程

image-20211210184555287

反码求和

image-20211210184821480

校验和例子

image-20211210185822703

3.3可靠数据传输的原理

目的

数据位不被损坏

没有数据丢失

数据以发送顺序被传输

总结-要在非可靠信道上提供可靠的数据通信

基础操作

ARQ自动重传请求:接收方发现错误/丢失分组后要求发送方重传

错误分组检测-校验和

丢失分组-确认,超时

重传(Retransmit)

3.3.1停止-等待协议(SW)

发送方发送一个分组后,必须停下来等待接收方确认后才可以发送下一个分组

错误处理:收到错误分组,接收方发送否定确认,让发送方重发

丢失处理:发送方内部设置定时器,超过定时时间还未收到ACK确认,则重发

处理重复分组:给每个分组带上序号(模$2^n$)

性能分析及计算
image-20211210190424127

3.3.2回退N协议(GBN)

发送方

在收到确认前可以发送多个分组

发送窗口$W_s$最大为$2^n-1$

每发送一个分组后,就启动内部计时器,若超时未收到确认,则重发该分组之后已发送的N个分组

image-20211210193707525

接收方

接收方只能缓冲一个分组

接收方只对按序到达的最后一个分组发送确认分组(因此对乱序分组会产生重复的确认分组)

序号:

  • 是模2^n的,n是字段的位数

3.3.3选择重传协议(SR)

避免不必要的重传

image-20211210194222054

接收方

接逐个确认接收到的每一个分组

发现某个分组出错后,其后继续送来的正确分组还是被接收,放在缓冲区中,同时要求发送方重新传送出错分组

发送方

只有在接收窗口向前滑动时,发送窗口才有可能向前滑动

即$W_S>=W_R$ 且 $W_s+W_R<=2^n$

窗口长度<=$2^{n-1}$

3.3.4滑动窗口机制(可用于实现不同可靠传输协议)

流水线协议/连续ARQ(也叫<u>滑动窗口协议</u>)

当发送端等待确认时,我们需要传输多个分组来提高利用率

Pipeling: 允许发送方发送多个未被确认的分组

概念

发送窗口: 发送方在没收到确认的情况下,能够连续发送的分组的序号表
<img src="https://s2.loli.net/2021/12/10/wgjTx5c3aqrCoHD.png" alt="image-20211210191530175" style="zoom:50%;" />

  • 大小:$W_s$
  • 下界表示未得到确认的分组的最小序号

接收窗口: 希望接收的分组的序号表
image-20211210191655633

  • 大小$W_R$
  • 上界表示允许接收的分组的最大序号,下界表示希望接收的下一个分组的序号
  • 若序号等于下界的分组被正确接收,并发送一个确认分组,上下界都加1,接收窗口向前滑动一次

3.4面向连接的传输协议—— TCP

总览

点到点

可靠有序的字节流-没有报文边界

流水线-拥塞控制和流量控制设置窗口大小

全双工数据-双方可以同时发送和接收

要求每一端都有两个窗口

流量控制

面向连接

拥塞控制

3.4.1TCP报文段

结构
image-20211210194733680

解释

  • 源端口和目的端口-2字节/each,

  • 序号-每字节都有序号,序号字段存储发送字节的第一个的序号

  • 确认号-希望收到下一个保温段的数据的第一个字节的序号
    TCP使用累积确认

  • 一些特殊位

    URG-紧急

    ACK-1时确认号字段有效

    PSH-尽快交付(不等待缓存写满)

    RST-reset 复位,重新建立连接

    SYN-如果为1表示这是个连接请求

    FIN-1的话释放连接

  • 校验和-检验首部和数据

3.4.2TCP可靠传输

用字节序号进行控制

过程模拟

B给出通告窗口值20->A构造长为20的发送窗口(31~50)

A发送11字节数据,此时还剩9字节可被发送

B接收窗口也为20,收到3字节,发送确认号33->A窗口移动到(34~53)

B窗口也滑动到34

重传计时器***

四个窗口(两发两收)动态变化

3.4.3TCP流量控制

目的:让发送方速率不要太快,让接收方来得及接收

利用滑动窗口机制实现

如果接收端顶不住发送端了,缓冲区被全部占用,就只能发送一个零通告窗口

发送端收到零通告窗口后停止发送,直到等到接收端发送一个非零的通告窗口

  • 持续计时器
    收到零通告窗口时启动,如果持续时间到期,就发送一个探测报文段,请求一个对方的通告窗口
    如果还是零,就重设计时器

3.4.4TCP连接管理[不考]

3.4.5TCP拥塞控制

太多的源太快地发送太多的数据,使网络来不及处理

表现:丢包(路由器缓冲区溢出)

长时延(缓冲区中排队)

作用: 提高吞吐量

image-20211210202844398

与流量控制的区别

拥塞控制

  • 需要确保通信子网能够承载用户提交的通信两,是一个全局性过程,涉及主机,路由器等很多因素

流量控制

  • 与点到点的通信量有关,主要解决快速发送方与慢速发送方的问题,是局部过程
拥塞控制方法

发送方维持一个拥塞窗口cwnd,其大小取决于网络拥塞程度,且动态变化

网络不堵塞,拥塞窗口增大一些

堵塞就把它减少一些

发送方发送窗口的上限为接收方通告窗口[rwnd]和拥塞窗口[cwnd]中较小的一个

四种办法

  1. 慢开始/启动
    cwnd初始化为1
    每收到一个对应确认,cwnd+=1
    image-20211210203322561
    每经过一个传输轮次,cwnd*=2,时间为RTT

  2. 拥塞避免
    每经过一个RTT,拥塞窗口+1,缓慢增长

    • 慢开始门限ssthresh

      cwnd<ssthresh ->慢开始/慢启动算法

      cwnd>ssthresh ->拥塞避免

      cwnd=ssthresh ->都行

      实现举例
      <img src="https://s2.loli.net/2021/12/10/rKaCnqT3tRbxd4m.png" alt="image-20211210203723811" style="zoom:50%;" />

      出现拥塞时

      把ssthresh设置为当前值的一半

      把cwnd重设为1

  3. 快重传
    要求接收方每收到一个失序的报文段后立即发出重复确认
    发送方一连收到三个重复确认就立即重传未收到报文段

  4. 快恢复
    当发送端收到连续三个重复确认时,把ssthresh设置为当前一半,但接下去不执行慢开始/慢启动算法,而是将cwnd设置为ssthresh减半后数值,然后开始执行拥塞避免算法
    <img src="https://s2.loli.net/2021/12/10/3oTXGBk4VdvAQuf.png" alt="image-20211210204852460" style="zoom:67%;" />

4.网络层

4.1网络层的功能

在发送端,将分组封装成数据报

在接收端,把数据报上传到传输层

路由器检查每个通过它的数据报

两个关键功能

转发-将分组从路由器的输入端口移动到输出端口

路由-决定分组从源主机到目的主机所采用的设备

网络层服务模型(我觉得没什么考的必要)
image-20211210212419693

4.2网络层设备

路由器

输入端口

物理层-比特级接收

链路层连接以太网

最后一层进行分散式交换-给定数据报目的地址,在输入端口中使用转发表查找输出端口
-到达较快的话还会排队

三种类型交换结构

image-20211211103137804

输出端口

当数据报来自比传输速率更快的交换结构时,需要**<u>缓存</u>**

<u>调度安排</u>-在排队的数据报中选择要传输的数据报

4.3IP

链路层之上,传输层之下

4.3.1IPv4分组

image-20211211103434802
首部字段解释

总长度-首部和数据之和的长度,最大为65535

标识-计数器,产生数据报标识

标志-3bit,最低位(M(ore)F(ragment)等于一代表还有分片,等于0代表没有分片,
中间一位=0才允许分片(D(ont)F(ragment))

片偏移-13bit,指出分片后该片在原分组中的相对位置,以8个字节为偏移单位

IP分片和重组

为什么分片-链路有最大传输单元,不同链路MTU不同

样例

image-20211211104103771

生存时间(TTL time to live) 限制数据报在网络中的生存时间,每经过一个路由器,TTL-1

协议-数据部分协议(TCP/UDP/IPV6等等)不一定是<u>上层,</u>

首部校验和-只检验首部

4.3.2IPv4地址

ip 地址-32位的主机/交换机标识号

接口interface-主机/路由器与物理链路之间的链接

交换机有很多个interface

主机一般就一两个

Ip地址与每个接口相关联

子网

设备接口Ip地址的子网部分相同

可以物理上直接联系,不用经过交换机

计算可用的主机地址

主机部分全0:网络地址

主机部分全1:广播地址

上两个不能设置为主机地址

子网掩码

/n 表示子网掩码位数为n

x.y.z.a,点分十进制形式表示32bit IP地址中哪些事子网部分

IP地址分配方案
  1. 子网位数固定-分类IP地址

  2. 不固定–CIDR(无类域间路由)

    子网部分被称为网络前缀,前缀部分任意长

    使用斜线记法

    路由表中每个项目由”网络前缀” 和”下一跳地址”组成,查找路由表时可能会得到不止一个匹配结果,因此引出下面内容

    最长前缀匹配

    举例

    image-20211211134931698

    CIDR子网划分***

    把一个大网络分成多个小网络,用路由器把这些小网络连接起来

    使用子网掩码255.255.255.192 (/26) 对网络
    192.168.10.0/24 进行子网划分,请回答如下问题 :
    – (1)子网数?

    192为二进制11000000,即 22 = 4 个子网;

    – (2)每个子网中可以容纳的主机数?

    26 -2 =62 个主机;

    – (3)哪些是合法的子网地址?

    每个子网的地址块大小为26 =64,子
    网地址的第4个字节从0开始以64递增,即:192.168.10.0、
    192.168.10.64、192.168.10.128、192.168.10.192

    – (4)每个子网的广播地址?

    – (5)哪些是合法的主机地址?

    子网地址 (192.168.10.) 0 64 128 192
    第一个主机地址 (192.168.10.) 1 65 129 193
    最后一个主机地址 (192.168.10.) 62 126 190 254
    广播地址 (192.168.10.) 63 127 191 255

4.3.3IP分组转发

网络层基于目的地址分组转发

下图一了百了

image-20211211140706891

转发算法

  1. 从收到分组的首部获得目的IP->D

  2. 判断是否在同一网络上

    用子网掩码和D逐位相与,看看是不是和**<u>相应的网络地址</u>**匹配,匹配就直接发过去

  3. 若路由表中有目的为D的特定主机路由,则将分组传送给指明的下一跳路由器,
    否则执行4

  4. 对路由表每行的子网掩码和D逐位相与,若结果与该行的目的网络地址匹配,就传送到下一跳
    否则,执行5

  5. 若路由表有默认路由,则将其传送给它,
    否则执行6

  6. 报告转发分组出错

4.3.4DHCP(动态主机配置协议)协议

Q.A

主机如何获得IP地址

  • 管理员硬编码

网络怎样得到IP地址的子网

  • 从其ISP的地址空间中得到分配的部分

ISP如何获得地址块

  • ICANN(因特网名字与号码分配公司)
DHCP目的: 使主机能够动态获取服务器的IP地址(当它加入网络时)

示意图

image-20211211142745600

4.3.5NAT[不考]

4.3.6IPv6[不考]

4.4路由算法

路由算法用于选择从源主机到目的主机的最佳路径

是产生路由表的算法(找到开销最小的路径)

分类

静态路由:路由随时间缓慢变化

动态路由:更快地变化,周期性更新,适应链路开销变化

4.4.1距离向量路由算法

Bellman-Ford方程

定义$d_x(y)$=从x到y的最小开销路径的开销

$c(x,v)$=从x到邻居节点v的链路的开销

$d_x(y)=min_v{c(x,v)+d_v(y)}$ ,min针对x的所有邻居

取值最小的结点对应最短路径中的下一跳->转发表

过程

结点x维护距离向量$D_x=[d_x(y):y\in N]$

  • 如果y不是x的邻居,则$d_x(y)=\infin,否则d_x(y)=c(x,y)$

每个节点周期性向邻居节点发送自己的距离向量,节点x保存其邻居节点的距离向量

当结点x收到来自邻居的新距离向量,它使用B-F方程更新自己的DV

  • $D_x(y)\gets min_v{c(x,v+D_v(y)} for each node y\in N$

示例

image-20211211144152548

4.4.4链路状态路由算法

  1. 发现邻居,学习网络地址
  2. 测量到每一个邻居的时延
  3. 构造一个分组来通告学习到的信息
  4. 向所有路由器发哦送分组
  5. 计算到其他路由器的最短路径
使用Dijkstra算法计算最短路径

循环:

从可达节点中找到最近的,加入当前节点组

更新其他节点距离

当当前节点组为全部节点时退出

4.5路由协议

目的:使路由选择是可计算的

有巨量的router

  • 构建自治系统
    自治系统内 OSPF
    自治系统间 BGP

4.5.1OSPF(Open Shortest Path First)

开放最短路径优先

使用<u>链路状态算法</u>

通告散布到整个自治系统

特点
  • 安全性-所有OSPF信息经过鉴别

  • 允许使用多条开销相同的路径

  • 对每条链路,为不同的服务类型设置多种开销度量

  • 集成的单播和多播支持

  • 在大域中使用层次OSPF

    层次OSPF
    • 两级层次-本地+主干
      仅在本地通告链路状态
      每个节点具有详细的区域拓扑
      仅知道其他区域中网络的方向
    • 区域边界路由器
      总结到自己区域中网络的距离,向其他区域的边界路由器通告
    • 主干路由器
      在主干范围内运行OSPF路由
    • 边界路由器
      连接到其他自治系统
报文格式

image-20211211150427755

4.5.2BGP

Border Gateway Protocol边界网关协议

提供功能

  1. eBGP:从相邻AS(自治系统)获得子网可达性信息
  2. iBGP:向AS内部的所有路由器传播可达性信息
    如下图
    <img src="https://s2.loli.net/2021/12/11/oJwg6KNUcvur8IY.png" alt="image-20211211150833119" style="zoom:50%;" />
  3. 根据可达性信息和策略,决定到子网的”好”路由

允许子网向因特网其余部分通告它的存在

两个BGP路由器通过半永久TCP连接交换BGP报文

两个重要的属性

AS-PATH

4.6ICMP协议[不考]

4.7SNMP协议[不考]

5. 数据链路层

5.1数据链路层的功能

将数据报从一个节点经过一条链路传输到相邻节点

组帧-将数据报封装进帧,加上首部和尾部

链路接入-控制信道接入

相邻节点间可靠交付

检错

纠错

5.2差错控制

通过通信信道接收的数据和发送的数据不一致的现象-传输差错,简称差错

5.2.1检错编码

检错

接收方能够推断发生了错误,要求重传

用于高可靠信道-光纤

  • 单比特奇偶校验

    增加冗余位使码字中1的个数恒为奇数/偶数

    能够检测<u>奇数个</u>比特差错

    分为垂直奇偶校验和水平奇偶校验

  • 因特网校验和

  • 循环冗余校验
    直接看例子

  • image-20211211155209760

  • image-20211211155153041

5.2.2纠错编码[不考]

纠错

接收方能够推断发送过来的原始数据是什么

用于易出错信道

  • 二维奇偶校验-能够检测并纠正单比特

5.3介质访问控制

5.3.1信道划分

将信道划分为较小的片

时分多路复用TDM

将时间划分为一段段等长的时分复用帧,每个用户在每个镇中占用固定序号的时隙

一目了然

image-20211211182642055

频分多路复用FDM

用户分配到频带后,在通信过程中始终占用该频带

不同用户同时间占用不同的(频率)带宽资源

image-20211211182751192

波分多路复用WDM

就是光纤上的频分多路复用

码分多路复用CDMA
  • 用于无线广播信道中
  • 为每个用户分配唯一的码型,所有用户共享相同的频率,但每个用户用自己的码片序列对数据进行编码
  • 抗干扰/抗发现性较好
  • 编码信号=(原始数据)X(码片序列)
  • 解码 = 编码信号和码片序列的内积
码片序列

每一比特时间划分为一个唯一的m bit 码片序列

要发送1,则发送码片序列
发送0,则发送二进制反码

码片序列的正交关系

两个不同站的码片序列正交

也就是说,二者规格化内积为0(每位相互乘累积后为0)

工作原理

image-20211211183405643

5.3.2随机访问

不划分信道,允许冲突,全速率传输

从冲突中恢复

时隙ALOHA(slotted ALOHA)-极限37%效率

假设

所有帧长度相同

时间划分为等长间隙,能传输一个帧

结点仅在时隙开始时开始传输帧

如果2+结点同时传输,所有结点检测到冲突

工作原理

有新帧,在下一个时隙传输

无冲突,直接发送

有冲突,在之后的每个后继时隙中以概率p重新传送

纯ALOHA(pure ALOHA)-极限18%效率

削弱版时隙ALOHA

帧到达立马传输,有冲突则等待一段随机时间开始传输

CSMA 载波侦听多路访问

思想

在传输前侦听

  • 信道空闲: 传输整个帧
  • 信道忙;推迟传输(下列三种推迟策略)
    1. 等待信道空闲(1-坚持)
    2. 等待随机时间(非坚持)
    3. 等待空闲,然后概率p发送(p-坚持)

传播时延的冲突

信道非真正空闲

争用期/冲突窗口:端到端往返时延 2$\tau$

只有争用期没检测到冲突才能肯定此次发送不会产生冲突

每个发送数据帧的结点,需要经过争用期才能确保这次发送不会产生冲突

CSMA/CD 载波侦听多路访问+冲突检测

CD:Collision Detection

使用CSMA协议进行数据发送

发送过程中一直侦听信道<u>(冲突检测)</u>

检测到冲突则立即停止发送,并等待一段随机时间,再侦听

image-20211211193703174

为了在发送时能检测到可能存在的冲突,CSMA.CD要求所有数据帧都必须大于最小帧长(2$\tau$*数据传输速率)

CSMA/CA

IEEE802 无线局域网所用的多路访问协议,参考后续

5.3.3轮流访问[不考]

节点轮流发送,但有更多信息要发送的节点能够占用更 长的时间

5.4局域网(LAN)

5.4.1局域网的基本概念与体系结构

集中在一个地理区域中的计算机网络

属性

  • 范围限制
  • 传输技术
  • 拓扑结构
IEEE802参考模型-只相当于链路层和物理层

image-20211211194132210

LLC保证传输正确性

MAC解决共享信道访问

5.4.2链路层寻址与ARP协议

MAC地址/LAN地址/物理地址

  • 将数据报从一个接口传送到物理上相互连接的另一个接口
  • 网络层及以上用IP地址,链路层及以下用硬件地址
ARP:地址解析协议

每个主机上设有ARP高速缓存,里面有所在局域网上各主机和路由器的IP地址到硬件地址的<u>映射表</u>

A想向B发数据,先查看ARP中有无B的IP,如果有,就查出它的硬件地址,再将其发送

没有,则运行ARP来找到B的硬件地址

即主机A向所有主机广播请求,目的主机对主机A直接回应,同时将主机A的地址映射到自己的高速缓存中

image-20211211194645026

ARP四种情况

主机->本网络上另一个主机 ARP找到目的硬件地址

主机->另一个网络上的主机 ARP找到本网络一个路由器地址

路由器->本网络主机 ARP找到目的主机的硬件地址

路由器-> 另一个网络主机 ARP找到本网络上另一个路由器硬件地址

5.4.3以太网与IEEE802.3

星型拓扑结构

  • 中心是交换机
  • 节点间不冲突
以太网帧结构

image-20211211200110878

目的地址:

第一位0: 单节点接收

1:被一组节点接收

全1:广播

校验字段

32位CRC校验(范围:目的地址,源地址,类型,数据)

数据字段:最小长度为46B,小于46则填充,但这些填充不计入长度字段值中
最大长度为1500B

因此Ethernet帧最小长度64B,最大1518B

以太网特点

不可信(接收方不发送ACK之类的)

无连接(无握手)

MAC控制:

以太网的CSMA/CD

将之前的强化冲突方式,设置为使用<u>二进制指数退避</u>

  • 在第m号冲突后 NIC选择{0,1,2,…$2^{m-1}$中的随机一个数K
  • 然后等待K*512 bit时间

5.4.4无线局域网与IEEE802.11[不考]

无线网的介质访问控制

特点: 无法获得冲突信息

目的:避免冲突

方式

物理层执行信道载波侦听

信道空闲–源节点等待DIFS后,仍然空闲,则发送一帧,然后等待ACK帧

目的节点在收到正确的数据帧的SIFS时间后,向源节点发送ACK帧

CSMA/CA

允许发送端预订信道

  • 发送端发送请求帧到AP
  • AP广播允许发送(CTS)的回复
  • 所有结点收到CTS,发送端发送

5.5数据链路层设备

局域网交换机

存储并转发以太网帧

特征: 对主机透明(即ip地址什么的和它无关)

自学习-

收到对应接口分组后记录对应接口MAC地址在自己对应接口上

如果发现目的接口没有,会洪泛(将分组分发到所有接口上,等待回复)

冲突域VS广播域

冲突域;网络的一部分,在其中会发生帧冲突(当两个设备同时发送数据报)

image-20211209105458295

广播域:包含了通过链路层广播能直接相互了解的所有设备

image-20211209105941059

虚拟局域网–为了防止过多的广播信息引起不便

虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组

每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个 VLAN。(在以太网帧中插入一个4字节的标识符,称为VLAN标记)

image-20211209110309425

6. 物理层

6.1通信基础

6.1.1数据通信系统的基本概念

物理层目标:在通信信道上传输原始比特

确定与传输介质的接口的一些特性

  • 机械特性
  • 电气特性
  • 功能特性
  • 过程特性

6.1.2编码与调制

6.1.3奈奎斯特定理和香农定理

6.2物理层设备

集线器

7. 综合

7.1各层设备的广播域、冲突域及总结

7.2Web访问全过程

网络地址转换

网络地址转换

目的:解决ip稀缺

三个专用地址块

image-20211118100015197

原理:本地网络中的所有计算机在访问Internet时使用同一个IP地址
,within the local network, computers use private addresses for
routing intramural traffic在本地网络中,计算机使用专用地址
进行路由。对于目的地址是专用地址的数据报,路由器一律
不予转发。

本质:通过端口号区分主机

IPV6

同样是为了改变缺少ip地址的问题

源ip:128位

目的ip:128位

image-20211118111114068

隧道技术

解决ipv4和ipv6共存

ipv6作为ipv4的payload(数据)发送

image-20211118111549533

网络层

网络层-控制平面

路由算法

产生路由表的算法

图论抽象

Graph: G = (N,E)

N = set of routers = { u, v, w, x, y, z } 节点是路由器

E = set of links ={ (u,v), (u,x), (v,x), (v,w), (x,w), (x,y), (w,y), (w,z), (y,z) } 边是物理链路

链路开销Cost of link:时延、费用或拥塞等级 路径开销Cost of path:c(x1 , x2 , x3 ,…, xp ) = c(x1 ,x2 ) + c(x2 ,x3 ) + … + c(xp-1 ,xp )

路由算法:找到开销最小的路径(路由器序列)

分散式算法–只知道和部分路径,通过和邻居交换信息

典型就是下面这个算法

• 距离向量路由算法

描述

  1. 节点x维护距离向量

    Dx=[dx (y): yєN ]
    (如果y不是x的邻居节点, 则dx (y)=∞,否则dx (y)= c(x,y))

  2. 每个节点周期性向其邻居节点发送它自己的 距离向量, 节点x保存其邻居节点的距离向量
    Dv = [dv (y): y є N ]

  3. n当节点x接收到来自邻居的 新距离向量,它使用B-F方程更新自己的DV :
    Dx (y) ← minv {c(x,v) + Dv (y)} for each node y ∊ N
    Bellman-Ford方程:

    1. 定义
      $d_x$ (y) = 从x到y的最小开销路径的开销,c(x,v) = 从x到邻居节点v的链路的开销
    2. 则dx (y) = minv {c(x,v) + dv (y) }
    3. 取值最小的节点对应最短路径中的下一跳(只有一个地址)➜ 转发表

    示例<img src="https://s2.loli.net/2021/12/09/HhICGUakqft2zm1.png" alt="image-20211122134953146" style="zoom:50%;" />

• 链路状态路由算法 •

  1. Discover its neighbors, learn their network address. 发现邻居,学习它们的网络地址
  2. Measure the delay or cost to each of its neighbors. 测量到每一个邻居的时延或开销
  3. Construct a packet (link state packet)telling all it has just learned. 构造一个分组(链路状态分组) 来通 告其学习到的所有信息
  4. Send this packet to all other routers. 向所有路由器发送该分组
  5. Compute the shortest path to every other router. 计算到其他路由器的最短路径
    使用Dijkstra算法计算最短路径
    <img src="https://s2.loli.net/2021/12/09/mCdF4G2wO7vxpUW.png" alt="image-20211122143134224" style="zoom:50%;" />

路由协议

受到分组压力,单位需求的影响,产生了as(自治系统)

系统内可以用之前的算法,系统外–?自治系统间专门的路由协议

• O(pen)S(hortest)P(ath)F(irst)路由协议

自治系统内路由-开放最短路径优先
使用的算法是链路状态算法

OSPF的特点

  1. 安全性–报文经过签名鉴别
  2. 使用多条开销相同的路径
  3. 对每条链路,为不同的服务类型设置多种开销度量
  4. 集成的单播和多播支持
层次ospf

自治系统内进一步再分

• BGP路由协议(border gateway protocol)

-自治系统间路由

算法-距离向量算法(改名—路径向量算法)

  1. eBGP: Obtain subnet reachability information from

neighboring ASes.从相邻AS获得子网可达性信息

  1. iBGP: Propagate reachability information to all AS-internal

routers. 向AS内部的所有路由器传播可达性信息

  1. Determine “good” routes to subnets based on reachability

information and policy.根据可达性信息和策略,决定到子网

的“好”路由

•ICMP-The Internet Control

差错报告–不可达网络\主机\端口\协议

回声请求

trace route

源主机从ttl=1,一点点开始发送更大的ttl,目的端口号设置为一个不可能到达的端口,

当ttl超时时,该路由器发送一个ICMP报文到源主机,这样会获取路径上路由器的信息

到达目的主机后,会返回一个端口不可达报文,探测结束

Message Protocol

•网络管理——SNMP协议

计网笔记-数据链路层

12_2_数据链路层

1. 数据链路层的基本功能

<u>将数据报从一个节点经过一条链路传输到相邻节点</u>

  1. 组帧:将数据报封装进帧,加上首部和尾部
  2. 链路接入:如果共享媒体,控制信道接入,使用帧首部中的“MAC”地址标识源和目的地
  3. 相邻节点间的可靠交付,
  4. 检错
  5. 纠错:接收方识别并纠正比特差错,而不需要重传

它放在哪?适配器(网卡),和主机系统总线相连

2.差错控制

通过通信信道接收的数据与发送的数据不一致的现象称为传输差错(简称差错)。

2.1检错编码

2.1.1单比特奇偶校验

奇偶校验码是一种通过增加冗余位使得码字中“1”的个数恒为奇数或偶数的编码方法

image-20211202102617007

能力:能够检测单(奇数)个比特差错

2.1.2InternetChecksum–UDP里讲过

2.1.3循环冗余校验

原始数据:D

校验位:长度r,

原始数据后补上r位0,

Generator: G:r+1的长度

image-20211202103409058

D不断异或G(其实是求余数),最后剩下的为校验位

image-20211202103258900

检测能力

image-20211202103444659

2.1.4二维奇偶校验

二维奇偶校验能够检测并纠正单比特差错

image-20211202103521291

2.2纠错编码

3.介质访问控制

点对点/广播

3.1信道划分

将信道划分为较小的“片” (时隙,频率,编码)

为节点分配专用的片

3.1.1频分多路复用

3.2.2时分多路复用、

3.1.3波分多路复用

3.1.4码分多路访问

3.2随机访问

不划分信道,允许冲突

从“冲突”中恢复

3.2.1ALOHA协议、CSMA协议、

image-20211202111307619

传播时延的冲突:

传播时延:传输距离/光速

image-20211202111802943

端到端往返时延 2t 称为争用期,或冲突窗口

3.2.2CSMA/CD协议

需要在发送完帧之前就能收到自己发送出去的数据,即帧的传输时延至少是数据在总线中的传播时延的2倍

最小帧长=传播时延* 2 *数据传输速率

例如,以太网的冲突窗口长度为51.2µs,数据传输速

率为10Mbps,51.2µs可以发送512bit(64B)数据,因

此,64B是以太网的最短帧长度;

、CSMA/CA协议

3.3轮流协议

3.3.1令牌传递协议

3.3.2轮询协议

4.局域网

4.1局域网的基本概念与体系结构

4.2局域网寻址与ARP协议

4.3以太网与IEEE 802.3

4.3.1以太网拓扑结构

90年代前:总线型拓扑(单冲突域)

现在星形(中心是交换机,节点之间不冲突,不需要CSMA)

image-20211209100351905

4.3.2以太网帧结构

4.3.3 以太网属性

•connectionless: no handshaking between sending and receiving NICs

连接之间没有握手

•unreliable: receiving NIC doesn’t send ACKs or NAKs to sending NIC

就是说,如果没收到就直接扔了,不发消息

以太网的MAC Control

CMSA/CD+指数回避(用来防止连续冲突)

4.4无线局域网(IEEE 802.11)

4.4.1典型结构

image-20211209102241124

4.4.2冲突控制

CSMA/C(ollision)A(voidance)

允许发送端预订信道

  • 发送端发送请求帧到AP
  • AP广播允许发送(CTS)的回复
  • 所有结点收到CTS,发送端发送

5.数据链路层设备

5.1局域网交换机

查看进入的MAC地址,然后转发给出链路

**<u>透明</u>因此在转发的时候分组里<u>不会</u>**有交换机的物理地址

<u>自学习</u>:

收到对应接口分组后记录对应接口MAC地址在自己对应接口上

如果发现目的接口没有,会洪泛(将分组分发到所有接口上,等待回复)

5.2 冲突域vs广播域

冲突域

当两个设备在同时发送分组的时候会冲突

下面每个圈都是冲突域

image-20211209105458295

广播

通过广播能发到的一堆设备

image-20211209105941059

虚拟局域网(为了防止过多的广播信息引起不便)

虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组

每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个 VLAN。(在以太网帧中插入一个4字节的标识符,称为VLAN标记)

image-20211209110309425

21/12/6 软件体系结构复习-设计模式

策略模式

基本原则:责任分离+高内聚低耦合

各部分组成及说明

  1. strategy:定义了一个共同的接口,所有的具体算法类实现这个接口.换进该类context调用这个接口调用具体的算法类
  2. ConcreteStragety 封装了具体的算法,实现统一个几口
  3. Context 环境类.用于配置一个具体的算法策略对象,维持一个策略接口类型的参考,并且可以定义一个让接口Strategy的具体对象访问的接口(可省略)

使用策略模式的情况

  1. 当有多个行为上不同但是相关的类存在.
  2. 当某个算法使用用户不该知道的数据时,使用策略模式可以将算法实现细节隐藏起来.
  3. 当一个类有多种行为,这些行为以大块的条件语句实现时,可以将这些条件块移入他们自己的Strategy类中
使用策略模式的出发点
  1. 将一组相关的算法封装为各个策略分支,从而将策略分支相关的代码隐藏起来
  2. 提升程序的可拓展性

优点

  1. 得到一系列可服用的算法,这些算法继承一个共同的抽象类,因此公有的功能可以放到超类中
  2. 将不同算法封装在不同的策略子类中,使逻辑更加清晰,各个算法可以独立地变化
  3. 是功能改变或拓展变得更容易

创建型模式

工厂模式

简单工厂

img

各组成部分的功能
  1. Creater 核心,包含应用程序锁需要的业务逻辑.同时负责委托工厂生产对象
  2. Product 接口/抽象类 是具体子类的超类/接口
  3. ConcreteProduct 实现Product接口/继承Product抽象类
优点
  1. 工厂方法包含从一个类的结构中选择初始类的业务逻辑
  2. 客户类不直接创建产品类的对象,值作为对象的消费者
  3. 实现了责任分离
  4. 如果有新产品子类加入,不必修改客户类(前提是客户类不用新产品)
  5. 因为1,所以客户类不需要繁杂的逻辑判断
缺点
  1. 增加产品类时,要修改工厂类
  2. 因为工厂类的工厂方法是静态的,所以工厂类中的方法不能被继承,因此只能承载一个单独的类群,而不是一个有多层结构的类
为了解决简单工厂的缺点—工厂方法

工厂方法

核心思想:将简单工厂中单一的工厂类改写成一个层次类
image-20211114142203065
类图解释

Creater: 接口,含有一个factory方法,然后可以用和产品类相同的结构产生创建者类结构,其中包含CreaterA和CreaterB

CreaterA/B:负责创建对应的ProductA和ProductB的对象

和简单工厂的相同之处
  1. 方法模式一样,工厂方法也返回一个属于父类Product类型的对象,客户不必知道返回对象的具体类型
和简单工厂的区别
  1. 中心不同.工厂方法的中心是抽象工厂类/接口,而简单工厂方法的中心是一个实的工厂类
    在简单工厂的工厂方法是静态的,而工厂方法是动态的
  2. 简单工厂方法不支持开闭原则.而工厂方法支持.
    简单工厂增加产品类:在工厂类中也应增加条件语句
    工厂方法增加产品类:在Product类的结构体重增加一个实体,在工厂类层次结构体中增加一个相应的能产生该新产品对象的实类
  3. 工厂方法工厂类不必包含创建对象的逻辑判断
使用工厂方法的情况
  1. 创建某些类的对象的逻辑比较复杂,并且有很多条件分支
  2. 一个类不能准确预知它要创建一个层次类中哪个子类的对象
  3. 一个类使用子类决定要创建的对象
  4. 需要封装创建类的对象的逻辑,使这些逻辑局部化

抽象工厂模式

类图

IMG_20211114_144057_edit_205109997971306

抽象工厂模式中包含
  1. 一系列互相有关联的产品类,(有相同的结构)
  2. 一系列实的工厂类,实现由抽象工厂提供的接口.他们各自生产一组相关的产品类对象
当客户对象要从一个相关的产品组中创建一个对象,而没有必要知道到底创建哪个对象时使用抽象工厂
抽象工厂方法不符合开闭原则–增加一个新产品层次类,则必须在每个工厂实类中增加方法

装饰者模式

提供一个比继承更加灵活的方案

类图

image-20211114145247937

访问者模式

解决问题–对一个已经完成设计与diamante编写的类的层次结构进行功能修改或增加新功能

IMG_20211114_150707

类图解释

  1. VIsitor: 为每个element的类声明了一个访问操作
  2. concreteVisitor: 实现Visitor声明的运算
  3. Element: 定义了一些基本的方法,包含提供基本数据的方法.
    重要的是,它的子类必须定义一个接收者方法,为被访问者对象和访问者对象之间提供接口
  4. ConcreteElement :具体的Element的子类
  5. ObjectStructure 提供一个高层接口,允许访问者访问Element的子类.,提供一个访问列表

使用访问者模式的情况

  1. 当一个对象的结构中,包含有多种类型的具有不同接口的对象,且用户要在这些对象上进行依赖于具体的类的运算
  2. 当有多个不同的并且互不相关的运算将作用域这些对象上,且用户不希望这些运算混淆这些类时
  3. 当对象的数据类型很少改变,但需要经常改变操作或增加新操作的情况下.

状态模式

将不同状态下的行为封装在不同的类中,每个类代表一个状态

使用场景:

当一个类依赖于状态,那么程序员在描述该对象的类中通常会使用很多条件语句,
这时,使用状态模式可以有效消除条件语句并使得状态转换非常清楚

GANG OF FOUR的定义:
允许一个对象在其内部状态改变时,改变其行为.这个对象看起来似乎修改了它的类
类图

IMG_20211121_185300

各组件描述:

Context:定义了和客户程序的接口,它保持了一个ConcreteState的代表现在状态的实例

State:状态接口,子类封装各个状态下行为
ConcreteState:State的子类

使用状态模式的情况

  1. 对象的行为依赖于状态,对象再运行时改变状态
  2. 操作有大量依赖于状态的条件语句

优点

  1. 容易添加新的状态(因为封装在子类),
  2. 状态迁移很明确

桥接模式

将对象的继承转为对象的组合
将一个软件设计的抽象部分和实现部分分离,使它们都可以独立地变化.

类图IMG_20211121_192040

各部分解释

  1. Abstraction接口,定义抽象部分的接口,为吃Implementor对象的一个参考
  2. RefinedAbstraction,继承或者实现Abstraction
  3. Implementor:定义Implementation类的接口,接口形式可以不和Abstraction界面严格对应
  4. ConcreteImplementor:实现Implementor接口

优点

  1. 分离接口和实现部分,
  2. 提高了可扩展性
  3. 实现了细节对客户的透明

适配器模式

目的:解决接口不一致

分为类适配器模式和对象适配器模式

类图

IMG_20211121_193024_edit_222571278535829

类适配器: 写一个target接口声明所有需要的方法,写一个adaptor类继承adapee类,并且实现接口target

对象适配器:写一个target接口声明所有需要的方法,采用聚合的方法来实现adaptee类中的方法

使用适配器模式的情况

  1. 想要使用现有的类,但现有类的接口不符合需求
  2. 当需要通过创建一个可服用的类,是的本来接口不相容且无关的类结合在一起工作时
  3. 在设计中需要改变多个子类接口,在作用相同但名称不同的类或方法之间进行适配时.

MVC

  • 视图:管理作为位图展示到屏幕上的图形和文字输出;
  • 控制器:翻译用户的输入并依照用户的输入操作模型和视图;
  • 模型:管理应用的行为和数据,响应数据请求(经常来自视图)和更新状态的指令(经常来自控制器);

如果用户通过一个View的Controller改变了Model,所有其他的View都必须反映出该改变.

当数据发生变化的时候,Model负责通知所有的View,告诉他们数据已经改变了

21/12/6 软件体系结构复习

复习

1.基本概念

软件体系结构

系统的基本组织结构,包括系统构成要素,这些构成要素之间以及与环境之间的关系,系统设计及演化时所应遵循的原则

什么设计模式?

是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结.

为什么要用设计模式?

为了<u>可重用代码</u>,让代码更容易<u>被他人理解</u>,保证<u>代码可靠性</u>

非功能需求有哪些?,含义是什么?

  1. 性能
  2. 可扩展性/伸缩性
  3. 可维护性
  4. 可用性
  5. 安全性
  6. 业务质量
    成本,周期,投入的人力,需要的资源
  7. 性能需求:用户在软件响应速度,结果精度,运行时资源消耗量等方面的要求
  8. 可靠性需求:用户在软件失效的频率,严重程度,易恢复性,以及故障可预测性等方面的要求
  9. 易用性要求:用户要求在界面的易用性,美观性,以及对面向用户的文档和培训资料等方面的要求
  10. 安全性需求:用户在身份认证,授权控制,私密性等方面的要求
  11. 运行环境约束:用户对软件系统运行环境的要求
  12. 外部接口:用户对待开发的软件系统与其他软件系统或硬件设备之间的接口的要求
  13. 可保障性要求:用户在软件可配置性,可扩展性,可维护性,可移植性方面的要求

编程的三个层次?

针对实现编程

Dog d = new Dog();

d.bark();

针对接口/超类型编程

Animal animal = new Dog();

animal.makeSound();

运行时才指定具体实现的对象

a=getAnimal();

a.makeSound();

设计模式的三大原则

单一职责

一个类只负责一个功能领域中相应的职责,

依赖倒置

针对接口编程,而非针对实现编程

即程序中所有的依赖关系都是终止与抽象类或者直接接口.

开闭原则

对拓展开放,对修改关闭

面向对象的三大原则

软件体系结构

分层风格

指将软件设计成层次结构,每个层为其上层服务,同时又是其下层的客户,不允许隔层调用

优点

  1. 层次结构 支持基于随着层次不断增加而不断抽象的设计.能将一个复杂的问题分一系列从初等的与硬件相关的功能到可以被用户使用的高级功能.
  2. 支持更新.每层只和两个层交互,因此,在接口不变的前提下,可以单独修改或更换某一层的某些组件而不影响其他层.
  3. 支持复用.

缺点

  1. 不是什么系统都容易被组织成层次结构
  2. 有时层次结构的逻辑上的较高层级和较低层级会有比较紧密的耦合
  3. 正确的层次抽象往往可能很困难.

管道-过滤器风格

每个过滤器都有一组输入和输出,组件读入输入数据流,经过数据处理,然后产生输出数据流.

系统由负责运送数据的管道和负责对数据进行处理的过滤器组成

优点

  1. 高内聚低耦合
  2. 允许设计者将整个系统的输入/输出行为看做是多个过滤器行为的简单合成
  3. 支持软件重用
  4. 系统维护和增强系统性能简单
  5. 允许对一些如吞吐量,死锁等属性的分析
  6. 支持并发

缺点

  1. 导致进程称为批处理结构
  2. 不适合处理交互应用
  3. 因为每个过滤器上都增加了解析和合成数据的工作,因此系统性能下滑,

主程序-子程序风格

采取分而治之策略,将一个复杂的问题分解为多个独立的字问题

自顶向下功能化设计思想(结构化设计)

从功能需求出发,将一个整体问题分解为多个子问题,然后将子问题划分为几个更小的子问题,直到不可划分为止

优点
  1. 逻辑设计与物理设计分开
  2. 开发过程中形成一套规范化的文档,以便后期修改和维护

适用于组织相对稳定,业务处理过程规范,需求明确且在一定时期内不会发生大的变化的大型复杂系统的开发.

缺点:开发周期长,系统难以适应环境的变化及开发过程复杂繁琐

功能演化困难,显示中的系统功能不容易描述,功能化设计丢掉了数据与数据结构,产生的可复用代码少.

面向对象软件体系结构

系统看做由一些对象的集合构成,消息从一个对象发送到另外一个对象.每个对象都有其相关的功能

对象是一个具有状态和行为的实体.一个对象存储它的状态在域中,面向对象设计隐藏对象的内部状态,并且要求所有对象之间的交互都通过该对象的方法,这叫做数据封装,是面向对象编程的基本原则.

面向对象设计的特点

  1. 封装性,限制对特定信息的访问
  2. 继承性,共享同一个功能定义
  3. 动态绑定性:在程序运行前,不知道创建哪个类的对象,运行时才动态生成
  4. 复用和可维护性:因为封装与局部化
  5. 系统功能通过对象服务表示:对象的接口提供了一系列的方法.
  6. 共享数据区域被取消
  7. 对象可以是分布的.通过函数或者方法调用互相交互.
  8. 对象是对现实世界的抽象并且可以自己管理自己.

优缺点

优点:

  1. 容易维护
  2. 可复用性好
  3. 映射现实世界
  4. 容易对一个系统进行剖分

缺点

  1. 占用欧冠内存较大.因为每个新被创建的对象都必须占用一块内存,而面向对象程序中,往往有大量对象被创建
  2. 一个对象要和另外一个对象交互,该对象必须知道另外一个对象的身份,包括对象名,方法名和参数类型等.

基于共享数据的事件风格

  1. 系统中的每个组件可以注册一种事件
  2. 当一个组件要发布事件时,该组件可以广播一个或多个事件到事件空间
  3. 每当一个事件被广播了,系统将负责自动调用那些已经注册了该事件的组件或者过程,被调用的组件将运行.

2.设计模式

mvc模式

model 包含核心数据和功能,独立于输入行为和输出表示

View 将模型中的数据显示给用户

Controller处理用户输入,如果用户通过一个view 的controller改变了model,其他controller必须反映出该改变,即当数据发生变化的时候,model负责同志所有的view,告诉他们数据已经改变了.(观察者模式,model对象是被观察者,controller是观察者)

优缺点

优点

  1. 对于同一个模型,可以有不同的视图和控制器,一遍提供给用户不同类型的用户图形界面
  2. 改变-传播机制保证了模型在改变的同时自动刷新所有的视图
  3. mvc体系结构的设计使的改变图形界面非常容易,适合业务逻辑较少改变,而图形界面需要经常改变的应用
  4. 全部的核心数据和核心功能都包含在模型中,很容易对核心的应用进行测试
  5. 可拓展性比较好

命令模式

三个部件

客户程序

调用者程序

被调用者程序

解除调用者类与被调用者类的耦合–为响应客户新请求的行动创建一个抽象

client对象负责初始化Command对象,并且提供将来要调用的方法的全部信息

Invoker决定什么时候调用所要调用的方法

receiver是含有索要调用方法的代码的实例

3.期末复习