Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

SDN 软件定义网络

SDN(Software Defined Networking,软件定义网络)是一种将网络控制平面与数据转发平面分离,并通过可编程接口实现网络控制的架构。SDN的基本架构通常包含以下几个关键层:

  1. 应用层(Application Layer):这是最上层,包括各种网络应用程序和服务,它们可以通过SDN控制器提供的API来定制网络行为,比如流量路由、访问控制策略等。
  2. 控制层(Control Layer):这一层的核心是SDN控制器,它集中管理网络视图、计算数据包转发路径,并下发相应的转发规则到数据平面设备。控制器是网络智能和策略决策的中心。
  3. 转发层(Data Plane or Forwarding Layer):数据平面由网络交换机和其他数据转发设备组成,它们根据从控制层接收的指令转发数据包,而不再需要了解完整的网络拓扑或做出复杂的路由决策。

企业数字化转型

企业数字化转型分为5个发展阶段:初始级发展阶段、单元级发展阶段、流程级发展阶段、网络级发展阶段和生态级发展阶段。

  • 初始级发展阶段:处于该发展阶段的组织,在单一职能范围内初步开展了信息(数字)技术应用,但尚未有效发挥信息(数字)技术对主营业务的支持作用。
  • 单元级发展阶段:处于该阶段的组织, 在主要或若干主营业务单一职能范围内开展了(新一代)信息技术应用,提升相关单项业务的运行规范性和效率。
  • 流程级发展阶段:处于该阶段的组织, 在业务线范围内,通过流程级数字化和传感网级网络化,以流程为驱动,实现主营业务关键业务流程及关键业务与设备设施、软硬件、行为活动等要素间的集成优化。
  • 网络级发展阶段:处于该阶段的组织,在全组织(企业)范围内,通过组织(企业)级数字化和产业互联网级网络化,推动组织(企业)内全要素、全过程互联互通和动态优化,实现以数据为驱动的业务模式创新。
  • 生态级发展阶段:处于该阶段的组织,在生态组织范围内,通过生态级数字化和泛在物联网级网络化,推动与生态合作伙伴间资源、业务、能力等要素的开放共享和协同合作,共同培育智能驱动型的数字新业务。

需求管理

需求工程的活动主要被划分为以下几个阶段。
(1)需求获取:通过与用户的交流,对现有系统的观察及对任务进行分析,从而开发、捕 获和修订用户的需求。
(2)需求分析:为系统建立一个概念模型,作为对需求的抽象描述,并尽可能多的捕获现 实世界的语义。
(3)形成需求规格(或称之为需求文档化):按照相关标准,生成需求模型的文档描述,用 户原始需求书作为用户和开发者之间的一个协约,往往被作为合同的附件;软件需求描述规约 作为后续软件系统开发的指南。
(4)需求确认与验证:以需求规格说明为输入,通过用户确认、复审会议、符号执行、模 拟仿真或快速原型等途径与方法,确认和验证需求规格的完整性、正确性、一致性、可测试性 和可行性,包含有效性检查、一致性检查、可行性检查和确认可验证性。
(5)需求管理:包括需求文档的追踪管理、变更控制、版本控制等管理性活动。
软件需求开发的最终文档经过评审批准后,则定义了开发工作的需求基线 (Baseline)。 这 个基线在客户和开发者之间构筑了计划产品功能需求和非功能需求的一个约定 (Agreement)。 需求约定是需求开发和需求管理之间的桥梁。
在教材的图中有这么四块,变更控制,版本控制,需求跟踪,需求状态跟踪

需求跟踪

需求跟踪包括编制每个需求同系统元素之间的联系文档,这些元素包括其他需求、体系结 构、其他设计部件、源代码模块、测试、帮助文件和文档等,是要在整个项目的工件之间形成 水平可追踪性。跟踪能力信息使变更影响分析十分便利,有利于确认和评估实现某个建议的需 求变更所必须的工作

软件生命周期

按照传统的软件生命周期方法学,可以把软件生命周期划分为软件定义、软件开发、软件运行与维护3个阶段。

RUP

1.RUP的生命周期
RUP软件开发生命周期是一个二维的软件开发模型, R U P 中有9个核心工作流,这9个核 心工作流如下。

  • 业务建模 (Business Modeling): 理解待开发系统所在的机构及其商业运作,确保所有 参与人员对待开发系统所在的机构有共同的认识,评估待开发系统对所在机构的影响。
  • 需求 (Requirements): 定义系统功能及用户界面,使客户知道系统的功能,使开发人 员理解系统的需求,为项目预算及计划提供基础。
  • 分析与设计 (Analysis & Dcsign): 把需求分析的结果转化为分析与设计模型。
  • 实现 (Implementation): 把设计模型转换为实现结果,对开发的代码做单元测试,将
    不同实现人员开发的模块集成为可执行系统。
  • 测试 (Test): 检查各子系统之间的交互、集成,验证所有需求是否均被正确实现,对
    发现的软件质量上的缺陷进行归档,对软件质量提出改进建议。
  • 部署 (Deployment): 打包、分发、安装软件,升级旧系统;培训用户及销售人员,并
    提供技术支持。
  • 配置与变更管理 (Configuration & Change Management): 跟踪并维护系统开发过程中
    产生的所有制品的完整性和一致性。
  • 项目管理 (Project Management): 为软件开发项目提供计划、人员分配、执行、监控
    等方面的指导,为风险管理提供框架。
  • 环境 (Environment): 为软件开发机构提供软件开发环境,即提供过程管理和工具的
    支持。

结构化设计

盒图、HIPO图、程序流程图均属于结构化设计工具(教材没找到原文)

面向对象设计

顺序图属于面向对象分析与设计工具

UML 2.0

UML 2.0提供了13种图,分别是类图、对象图、用例图、序列图、通信图、状态图、活动
图、构件图、部署图、组合结构图、包图、交互概览图和计时图。序列图、通信图、交互概览 图和计时图均被称为交互图。

PAD图

P A D 图是一种改进的图形描述方式,可以用来取代程序流程图,相比程序流程图更直观, 结构更清晰。最大的优点是能够反映和描述自顶向下的历史和过程。 PAD提供了5种基本控制 结构的图示,并允许递归使用。 P A D 的特点如下:

  • 使用PAD符号设计出的程序代码是结构化程序代码;
  • P A D所描绘的程序结构十分清晰;
  • 用PAD图表现程序的逻辑易读、易懂和易记;
  • 容易将PAD图转换成高级语言源程序自动完成;
  • 既可以表示逻辑,也可用来描绘数据结构;
  • 支持自顶向下方法的使用。

构件

构件又称为组件,是一个自包容、可复用的程序集。构件是一个程序集,或者说是一组程 序的集合。这个集合可能会以各种方式体现出来,如源程序或二进制的代码。这个集合整体向外提供统一的访问接口,构件外部只能通过接口来访问构件,而不能直接操作构件的内部。构 件的两个最重要的特性是自包容与可重用。

网络安全威胁

一般认为,目前网络存在的威胁主要表现在以下5个方面。
(1)非授权访问。没有预先经过同意就使用网络或计算机资源被看作非授权访问,如有意 避开系统访问控制机制,对网络设备及资源进行非正常使用或擅自扩大权限,越权访问信息。 它主要有以下几种形式:假冒、身份攻击、非法用户进入网络系统进行违法操作、合法用户以 未授权方式进行操作等。
(2)信息泄露或丢失。信息泄露或丢失指敏感数据在有意或无意中被泄露出去或丢失,它 通常包括信息在传输中丢失或泄露、信息在存储介质中丢失或泄露以及通过建立隐蔽隧道等方 式窃取敏感信息等。如黑客利用电磁泄露或搭线窃听等方式可截获机密信息,或通过对信息流 向、流量、通信频度和长度等参数的分析,推测出有用信息,如用户口令、账号等重要信息。
(3)破坏数据完整性。以非法手段窃得对数据的使用权,删除、修改、插入或重发某些重 要信息,以取得有益于攻击者的响应;恶意添加,修改数据,以干扰用户的正常使用。
(4)拒绝服务攻击。它不断对网络服务系统进行干扰,改变其正常的作业流程,执行无关 程序使系统响应减慢甚至瘫痪,影响正常用户的使用,甚至使合法用户被排斥而不能进入计算 机网络系统或不能得到相应的服务。
(5)利用网络传播病毒。通过网络传播计算机病毒的破坏性大大高于单机系统,而且用户 很难防范。

UML 5种视图
对于同一个系统,不同人员所关心的内容并不一样。因此一个系统应从不同的角度进行描
述,从一个角度观察到的系统称为一个视图 (View), 每个视图表示系统的一个特殊的方面。 按照图本身具有的特点,可以把图形划分为5类视图,分别是用例视图、逻辑视图、进程视图、实现视图和部署视图,其中的用例视图居于中心地位。

  • (1)用例视图:描述系统的功能需求,方便找出用例和执行者;它展示了一个外部用户能
    够观察到的系统功能模型,主要包括用例图。对此关心的开发团队成员主要包括客户、分析者、 设计者、开发者和测试者。
  • (2)逻辑视图:描述如何实现系统内部的功能;系统的静态结构和因发送消息而出现的动 态协作关系。逻辑视图包含类图和对象图、状态图、顺序图、合作图和活动图。
  • (3)进程视图:描述系统的并发性,并处理这些线程间的通信和同步;它将系统分割成并 发执行的控制线程及处理这些线程的通信和同步。进程视图主要包括状态图、顺序图、合作图、 活动图、构件图和配置图;对此关心的开发团队成员主要包括开发者和系统集成者。
  • (4)实现视图:描述系统代码构件组织和实现模块及它们之间的依赖关系;实现视图主要 包括构件图;对此关心的开发团队成员主要有设计者、开发者和测试者。
  • (5)部署视图:定义系统中软硬件的物理体系结构及连接、哪个程序或对象驻留在哪台 计算机上执行;主要包括配置图;对此关心的开发团队成员主要包括开发者、系统集成者和测
    试者。

之前跟着大佬的脚步用上了traefik,但是对具体的原理不太理解,或者说比较疑惑
因为这个具体的配置是在后面服务的docker-compose配置文件的label上的
traefik好像没办法直接读到这个配置
现在搜索资料好像也没有很明确的介绍,包括官方文档,只是介绍了provider
结合一些已知信息,首先它要读取docker.sock

1
- /var/run/docker.sock:/var/run/docker.sock

这样就能使用docker的api来获取容器container的开始结束等事件
这样也能在事件发生时读取对应容器的配置label
比如当前这个应用的路由规则是

1
- "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)"

让claude帮忙解答了下画了个图

这样理解起来感觉就明白多了,之前感觉挺难懂的

之前也有迁移过一些服务器,这次也是因为原来的续费太贵了,所以做了下迁移,直接续费1xxx每年,重新买一个99一年,
这里主要是两方面,一个是冷备份,我用的是rsync

1
rsync -avP --exclude xxxx1 --exclude xxxx2 server1:/home/username/xxx/ /local/xxx/

这里是三个注意点,一个是-avP表示是整个目录下的递归传输,显示具体的同步文件和进度,还能在断开后续传
第二个就是目录最后的/,如果缺少就不是目录下的整个同步
第三个是exclude,表示排除某些文件,如果有多个就像上面那样用多个--exclude

一个是最好用下zip压缩一些比如代码或者带有很多小文件的目录
zip命令因为不常用,也记录下

1
zip [options] output.zip file1 file2 ...

还有对应的解压缩

1
unzip -d destination output.zip

剩下的就是比较简单的docker命令
查看docker进行

1
docker ps 

从docker复制文件

1
docker cp containerId:/tmp/xxxx /home/username/xxx

或者反过来

1
docker cp /home/username/xxx containerId:/tmp/xxx

以及导入mysql

1
msyql --default-character-set=utf8mb4 -u$USER -p$PASS $DATABASE <xxx.sql

这些感觉用到的比较多,
还有一个是traefik的,因为最新版的docker不支持traefik使用的一个api
我是用的Ubuntu 24.04
可以用这个命令安装指定版本

1
sudo apt-get install docker-ce=5:28.5.2-1~ubuntu.24.04~noble docker-ce-cli=5:28.5.2-1~ubuntu.24.04~noble containerd.io docker-buildx-plugin docker-compose-plugin

这个traefik的issue在这里
有兴趣的可以仔细看看
保险起见还可以用

1
sudo apt-mark hold docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

来把这些版本给固定住,就不会在每次apt udpate & apt upgrade 的时候给升级掉
还有docker
腾讯云经常是访问github跟docker.io这种会很慢
可以参考这篇
是官方的文章,来加速docker的安装
简单截下命令

1
2
3
4
5
6
7
8
sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

再安装

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动

1
sudo systemctl start docker

还有拉取镜像加速
vim /etc/docker/daemon.json
写入以下内容

1
2
3
4
5
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}

然后保存

1
sudo systemctl start docker

重启下docker,完工

我跟LD一直在用的是比较古早iPhone7 plus,我是之前有另外买个安卓机作为主力,主要是觉得安卓经常可以换新,苹果用久了特别是存储空间比较贵,占满空间以后也会比较慢,LD一直说没啥用就一个手机用到现在,算起来应该有接近9年左右了,前阵子终于被我说动了买了个iPhone17,主要也是觉得这一代标准版配置很均衡,处理器是正代的,存储也有256了,高刷屏也有。
就是这个换机还是比安卓换机麻烦一些,首先就是想iTunes做个整机备份
这里是第一个比较麻烦的点,默认的iTunes备份是不支持自己设置备份文件的存储路径的,对于windows来说,特别是家里的老win7,可能版本比较早
并且也没有提前判断下C盘的剩余空间,对于C盘只有128G的,刚好手机也是128G且已经用的差不多了的情况,是比较尴尬的,因为它默认也是存在C盘里
这里主要两个方法,一个是提前判断好手机的存储大小,清理好C盘空间,不过有一点倒是iTunes备份比如因为盘满了,它下次不会从头再备份,而且会继续上一次的,所以比较满了再清理之后,继续备份还是可以延续上一次写入的文件继续写的,不用删除上一次失败的
另一个就是做个软连接,用管理员权限打开cmd命令行

1
mklink/j "C:\Users\你的用户名\AppData\Roaming\Apple Computer\MobileSync" "D:\iTunesBackup"

这里mklink前面的一个参数是默认的备份存储路径,后者是要修改的路径,这里的意思是前面的路径是苹果会去写入,做了软链接后前面的就是个快捷方式,后面的才是实际的存储位置,但是需要自己去用户目录下看下这个文件夹是否存在,已经存在的话要把原来的重命名成其他的或者删除(确认没用的话)
另外这是比较老的iTunes跟windows版本,如果是Win10,并且是在微软商店里下载的话可能路径是其他的
类似于
C:\Users\你的用户名\AppleMobileSync这样
这样就能改到我们存储空间比较大的盘,这是第一块,里面还有个小插曲,或者说也是蛮重要的,因为我其实不想把iTunes备份好的整个恢复到新iPhone上,它并没有类似于很多安卓手机会给你选择,比如只要恢复相册联系人这些,相当于会把整个iPhone再拷贝到新的上,这样有些比如很久不用的app,或者一些app的缓存啥的也会带过去;只是做一个以防万一,但是这里还有个问题是,iPhone通过iTunes备份,貌似如果选择不加密备份,是不会把整个iPhone都备份,而是把非安全相关的做个备份,比如一些浏览器存储的密码这些都不会,所以这里也是个注意点
第二部分是iCloud的使用,LD的习惯比较好,一些截图或者临时拍的照片都会即时删掉,所以照片占用的空间也比较少,正好iCloud也够用,所以在前面iTunes备份比较慢,经过盘空间失败,还有个比较头大的就是在iPhone通过无线网做迁移的时候,也是无法选择想要同步迁移的内容,这样也导致了时间非常久,从一开始的2小时变成导了一下午反而变成了11小时这种比较离谱的情况,所以最后选择了相册这些通过iCloud同步,其他的app反正本来就打算重新装,微信有自己的迁移同步工具;这里有个注意点iCloud会在手机存储空间不足的情况下将本地的照片换成像素比较低的占用空间比较小的照片
结果后一种方式整个都非常快,iCloud的下载比如相册也会是先下载缩略图,看起来就是一下就出来了照片,另外就是像短信跟联系人,这个都需要自己在新iPhone的iCloud设置里开启同步到此iPhone才会同步过来

最近在研究headscale的多局域网互通,但是因为设备和网络知识不过关,所以还没完全走通,不过对于mac设备的路由和linux的路由这些知识稍微多了一点
在mac上可以通过

1
netstat -nr

查看路由表
命令参数的解析是

1
2
3
4
5
 -n    Show network addresses as numbers (normally netstat interprets addresses and attempts to display them symbolically).  This option may be used with any
of the display formats.
-r Show the routing tables. Use with -a to show protocol-cloned routes. When -s is also present, show routing statistics instead. When -l is also
present, netstat assumes more columns are there and the maximum transmission unit. More detailed information about the route metrics are displayed with
-ll for TCP round trip times -lll for all metrics. Use the -z flags to display only entries with non-zero RTT values. (“mtu”) are also displayed.

比如我的路由表里

1
2
3
4
5
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default 192.168.xx.1 UGScg en0

这个表示是默认路由,走的网关转发,
这里的Gateway就是网关地址,一般是我们的路由器地址
Flags的意思是
U表示Up,表示路由是可用的,
G表示是Gateway,表示通过网关转发
S表示是Static,是静态路由,非动态生成,
c表示是Cloned,由父路由自动克隆生成
g表示是Global,全局的
比较全的

1
2
3
4
5
6
7
8
U = Up
G = Gateway
S = Static, e.g., default route added at boot time
H = Host-specific
C = Generate new (host-specific) routes on use
L = Valid link-layer (MAC) address
c = Cloned route
R = Reject route, known but unreachable route

表示我们的请求都是经过这个网关转发的,通过它把数据往外网或者局域网内其他设备发
至于这个Netif表示 network interface
就是网络接口也可以理解为网卡
比如我这里的en0,一般指物理网卡(通常是 Wi-Fi)
另外还可以通过

1
route get default

查看默认路由设置
可以这么理解网络连接过程

1
2
3
4
5
6
7
8
9
应用程序

路由表

netif(网络接口)

物理网卡 / 虚拟隧道

网络

原来的设置就是比如我可以在网关设备配置好tailscale节点,
然后让局域网内的设备都通过这个网关设备连接tailscale的网络,
对于非自建headscale应该就是subnet互联这样的逻辑
但是对于headscale中,可能因为我的网关设备是n1刷的openwrt,
对应的tailscale版本比较新,一直出现比较奇怪的问题
比如获取不到ipv4的地址,
启动tailscale就直接把本地局域网的地址全都走tailscale0虚拟网卡路由了
导致ipv4地址直接都不通了,
还得找下原因,可能是tailscale的客户端版本太高了,
一开始连接不上headscale的http地址,
高版本必须得用https才行,
结果就是用caddy套了一层https的壳
能连接上了又发现ipv4地址没了
而且还会出现一些很奇怪的问题
比如会出现局域网内的wifi也断连
是否是出现了局域网内的二层广播风暴或者arp冲突
应该是二层环路问题比较大
这一块还有待后续的研究

0%