KDMY https://kdmy.xyz/ zh-CN 十年饮冰,难凉热血。 Wed, 12 Apr 2023 22:19:11 +0800 Wed, 12 Apr 2023 22:19:11 +0800 学习笔记 https://kdmy.xyz/index.php/archives/57.html https://kdmy.xyz/index.php/archives/57.html Wed, 12 Apr 2023 22:19:11 +0800 KDMY 4.12

![](vx_images/109164820236746.png)
将通信接通
使用dhcp
使用ospf路由
链路聚合

![](vx_images/209964920256912.png)

二层交换机:
Sw0:

vlan 10
vlan 20
int f0/1
switchport access vlan 10
int f0/2
switchport mode trunk 
int f0/4
switchport mode trunk 

Sw2:

vlan 10
vlan20
int f0/1
int f0/3
int f0/2
switchport mode trunk 
int f0/4
switchport mode trunk 

![](vx_images/389745520249581.png)
将相应端口设置为trunk模式
Sw2:

int f0/2
switchport trunk encapsulation dot1q
switchport mode trunk 
int f0/4
switchport trunk encapsulation dot1q
switchport mode trunk 
int range f0/11-12
switchport trunk encapsulation dot1q
switchport mode trunk 

Sw3:

int f0/2
switchport trunk encapsulation dot1q
switchport mode trunk 
int f0/4
switchport trunk encapsulation dot1q
switchport mode trunk 
int range f0/11-12
switchport trunk encapsulation dot1q
switchport mode trunk 

创建设置链路聚合
Sw2:

int range f0/11-12
channel-group 1 mode on
sw t e dot1q 
switchport mode trunk 
spanning-tree vlan 10 priority 0

Sw3:

int range f0/11-12
channel-group 1 mode on
sw t e dot1q 
switchport mode trunk 
spanning-tree vlan 20 priority 0

虚拟网关
Sw2:
vlan10:

ip address 192.168.10.252 255.255.255.0
standby 10 ip 192.168.10.254

vlan20:

ip address 192.168.20.252 255.255.255.0
standby 10 ip 192.168.20.254

Sw3:
vlan10:

ip address 192.168.10.253 255.255.255.0
standby 10 ip 192.168.10.254

vlan20:

ip address 192.168.20.253 255.255.255.0
standby 10 ip 192.168.20.254

![](vx_images/249435821256912.png)
2911
dhcp:

ip dhcp pool vlan10
network 192.168.10.0 255.255.255.0
default-router 192.168.10.254
dns-server 192.168.117.117

dhcp2:

ip dhcp pool vlan10
network 192.168.10.0 255.255.255.0
default-router 192.168.10.254
dns-server 192.168.117.117

Sw2:

int vlan 10
ip helper-address 172.16.1.2
int vlan 20
ip helper-address 172.16.1.2

Sw3

int vlan 10
ip helper-address 172.16.2.2
int vlan 20
ip helper-address 172.16.2.2

![](vx_images/299731322248879.png)
2911
int g0/2
ip add 100.1.1.1 255.255.255.0

int range g0/0-1
ip nat inside

静态路由:

ip route 0.0.0.0 0.0.0.0 100.1.1.2 //静态路由
default-information originate   //广播到OSPF区域。标记O*E2.

NAT设置

access-list 1 permit 192.168.10.0 0.0.0.255
access-list 1 permit 192.168.20.0 0.0.0.255
int range g0/0-1

ip nat inside source list 1 interface g0/2 overload

R1(2911)

int g0/0
ip add 100.1.1.2 255.255.255.0
]]>
0 https://kdmy.xyz/index.php/archives/57.html#comments https://kdmy.xyz/index.php/feed/
linux挂载安装 https://kdmy.xyz/index.php/archives/51.html https://kdmy.xyz/index.php/archives/51.html Fri, 07 Apr 2023 09:39:00 +0800 KDMY 3.23

挂载光盘

临时挂载

mount   //用于挂载文件
umount //用于解除挂载

永久挂载

修改系统挂载的配置文件
/etc/fastab

cd /mnt/../repodata
rpm包之间的关联关系

rpm命令

rpm

-i    {包名.rpm}     //安装
-e    {包名}         //卸载
-ivh  {包名}         //安装 显示安装过程进度
-F    {包名.rpm}     /↓
-U    {包名.rpm}     //升级软件包
-q    {包名}         /↓
-qa   {包名}         //查看软件包
-ql   {包名}         //查看软件包安装的文件列表

仓库安装

如果配置本地源,必须挂载光盘
配置网络源,必须和网络源服务器正常进行通信

编写yum源文件:yum源文件必须保存在目录 /etc/yum.repos.d/

[XXX]
name=XXX
baseurl=file:///mnt/XXX
enabled=1
gpgcheck=0

dnf命令

dnf repolist          //列出仓库列表
dnf list all          //列出所有软件包,包括已安装
dnf list installed    //列出所有已经安装的软件包
dnf search httpd      //搜索仓库中的rpm包
dnf install -y        //直接安装软件包
dnf remove httpd      //卸载软件包

升级软件包: dnf update 或 dnf upgrade

查看命令或文件所对应的软件包
dnf provides */命令或文件名
dnf whatprovides */命令或文件名

yum或
yum update {软件}

源码包

获取源码包
wget/curl 下载软件包

ps 任务进程管理

top 查看当前系统状态

echo 输出
$? 表示上一次命令的结果

]]>
0 https://kdmy.xyz/index.php/archives/51.html#comments https://kdmy.xyz/index.php/feed/
linux学习笔记 https://kdmy.xyz/index.php/archives/49.html https://kdmy.xyz/index.php/archives/49.html Fri, 07 Apr 2023 09:35:00 +0800 KDMY 3.16

用户和组的概念

用户

  • 超级用户 管理员用户,对系统具有绝对的访问权限,root的UID为0并且只能为0。
  • 系统用户 也称程序用户,主要用于管理系统中的服务、进程及程序的相关用户。UID:1-999
  • 普通用户 由管理员root创建,对系统的操作权限是有限的。UID:1000-60000

拥有相同权限的用户的集合,一个组可以包含多个用户,一个用户可以属于多个组。

主组

也叫默认组,任何一个用户默认都会有一个主组,有且只有一个
创建用户时不指定主组会创建一个与用户名同名的主组

附加组

也叫附属组,一个用户除主组之外,也可以有0个或多个附加组。

用户的管理

创建用户

useradd {选项} 用户名
-g  表示主组
-G  表述附加组
-u  表示uid
-s  表示登录的shell,默认登录shell为可交互
    设置不可交互的shell,设置/sbin/nologin
-d  表示设置用户的家目录,默认普通用户的家目录在/home 目录

查看用户

id {用户名} 或 cat /etc/passwd

修改用户

usermod

-c  修改描述信息
-s  该用户帐号的新登录 shell
-d  修改用户家目录

echo {密码} | passwd --stdin {用户名}
![修改密码](vx_images/252791016249485.png)
设置用户的密码使用passwd命令。普通用户只能由超级用户root来设置,普通用户只能修改密码,但是密码必须符合复杂度要求

删除用户

uaserdel

在删除用户的时候,用户的家目录和邮件池不会被删除
-r 删除用户所有文件和邮件池

组的管理

创建组

groupadd

groupadd {选项} 组名
-g 表示GID
-G
-u

查看组

cat /etc/passwd | grep 组名
cat /etc/group 保存组相关信息文件,该文件每一行表示的是一个组的信息,有多少行就有多少个组。
四个栏位:

  1. 组名
  2. 密码占位符
  3. GID
  4. 组成员

shadow
cat /etc/gshadow 保存组密码及相关信息的文件,有多少行就有多少个组。
四个栏位:

  1. 组名
  2. 加密之后的密码(感叹号没有密码)
  3. 组的管理员
  4. 组成员

groups 表示打印当前用户所在的组

tail /etc/gshadow 查看后面几行

修改组

groupmod

groupmod {选项}
-g 修改组ID
-n 修改组名

groupmod -n {修改组名} {组名}
groupmod -g {新组id} {组名}

gpasswd

gpasswd {组名} 为一个组添加密码 
-a 向组里面添加用户
-d 向组里面删除用户
-M 设置组 GROUP 的成员
-A 设置组里的管理员

删除组

groupdel

groupdel {选项}
-f 强制删除

用户相关的文件

cat /etc/passwd-保存用户相关信息
七个栏位:

  1. 用户名
  2. 密码占位符
  3. 用户ID
  4. 主组GID
  5. 用户描述
  6. 家目录
  7. 登录shell

cat /etc/shadow-保存用户密码信息
九个栏位

  1. 用户名
  2. 用户加密之后密码
  3. 最后修改密码时间
  4. 密码最小生存周期(0表示立刻可以修改)单位天
  5. 密码最大生存周期(99999表示密码永不过期)单位天
  6. 密码警告期(到期前x天警告)
  7. 密码非活动期(密码一到期,在x天内仍然可以登录)
  8. 账户失效的时间
  9. 保留字段

chage 改变密码期限
chage {用户名}
-l {用户名} 查看密码期限信息
![chage参数](vx_images/285722820230357.png)

普通用户的提权操作

工作时通常创建一个普通用户,然后授予普通用户的某些权限
系统中的一个普通用户ys,此用户本身没有创建用户和修改用户的权限;可以通过提权操作让ys拥有临时创建用户和修改用户的权限
三种方法:

方法一

visudo
set un显示行号
100行

查看绝对路径:which
ys ALL=(ALL)  (绝对路径)需要使用的命令

提权给用户修改密码时,密码默认可以保留5分钟,5分钟之后密码失效
使用命令时添加 sudo,使用前需要给用户设置密码

方法二

vim /etc/sudoers
和方法一同步操作
修改完必须强制保存

方法三

创建提权文件
vim /etc/sudoers.d/00-ys

ys  ALL=(ALL)  命令绝对路径

如果在提权的时候免密码:

ys  ALL=(ALL)  NOPASSWD:命令绝对路径

组的提权

组中的所有用户提权

方法一

visudo
107行
%adminuser ALL=(ALL) (绝对路径)需要使用的命令

方法二

vim /etc/sudoers
和方法一同步操作
修改完必须强制保存

方法三

创建提权文件
vim /etc/sudoers.d/00-adminuser

%adminuser  ALL=(ALL)  命令绝对路径

如果在提权的时候免密码:

%adminuser  ALL=(ALL)  NOPASSWD:命令绝对路径

命令:
su - 用户名 切换用户
exit 用于退出登录的用户
超级管理员可以root可以在不需要密码的情况下切换到任何可交互登录的普通用户,当一个用户的shell为非交互登录的shell(/sbin/nologin),超级管理员root用户是不能进行切换登录的
普通用户切换到其他可交互式登录的用户包括root用户,是必须要输入登录的密码

--stdin 标准输入
管道符|前面命令执行结果,作为后面的输入
id 用户名
ll -d /home/用户名
vim /etc/passwd

3.2(s)

一、查找命令

which

查找命令的绝对路径

whereis

用于查找命令的绝对路径及相应的文档手册

find

用于根据查找条件进行查找
查找条件:
查找条件:可以根据文件大小、格式、权限、属主属组等条件查找。
find命令也可以对查找的结果进行相应的操作

语法:

  • find 查找路径 选项 -ok
  • find 查找路径 选项 -exec

Linux操作系统中一切皆文件。而文件是有类型的,有七种类型文件:

  1. 普通文件:f或.
  2. 目录文件:d
  3. 软链接文件:l
  4. 字符设备文件:c
  5. 块设备文件:b
  6. 套接字文件:s
  7. 管道文件:p

grep

在Linux系统中:
^ 表示以什么开头,例如以ys开头表示^ys
$ 表示以什么结尾,例如以/bin/bash结尾表示/bin/bash$
grep -v 不匹配相应的行,即是取反

二、打包压缩工具

压缩工具:
语法:zip 压缩之后的文件 需要压缩的文件

压缩命令解压命令
zip命令压缩unzip命令解压
gzip命令压缩gunzip命令解压
bzip2命令压缩bunzip2命令解压
xz命令压缩unxz命令解压

打包命令:tar(归档)
解压:tar -zxvf {包}

三、网络管理

临时修改:hostname
永久修改:
vim /etc/hostname
hostnamectl set-hostname yishun.example.com
hostnamectl 命令可以查看主机名,也可以修改主机名

配置IP地址

在rhel7以前默认管理网络的服务为network,在rhel8以默认管理网络的服务为NetworkManager,而没有network服务。

nmtui命令

打开图形化网络管理界面

修改网卡的配置文件:

vim /etc/sysconfig/network-scripts/ifcfg-ens160

TYPE="Ethernet"     //网卡类型
BOOTPROTO="dhcp"    //获取IP地址的方式:none或static表示静态获取或手动配置;dhcp表示自动获取
NAME="ens160"       //连接的名字
UUID="36760cb7-c331-4bcb-b771-8e66abda7528" //UUID
DEVICE="ens160"     //设备名
ONBOOT="yes"        //是否启用网卡

IPADDR=192.168.36.1  //IP
PREDIX=24            //子网掩码
GATEWAY=192.168.36.254 //网关
dns=192.168.117.117    //dns

如果配置没有问题卡启动,重启即可

使用nmcli命令

设置IP:
nmcli connection modify ens160 ipv4.addresses 192.168.36.2/24 ipv4.gateway 192.168.36.254 ipv4.dns 192.168.117.117 ipv4.method manual
多个IP在对应添加后+ipv4.XXX 192.168.118.118
cat /etc/resolv.conf
route -n

ipv4.add 192.168.36.2/24     //配置它的IP
ipv4.gateway 192.168.36.254  //配置它的网关
ipv4.dns 192.168.117.117     //配置dns
ipv4.method manual           //设置手动模式
nmcli connection down ens160 //关闭ens160网卡(可更改)
nmcli connection up ens160   //开启ens160网卡(可更改)

3.23(权限管理)

/ 根目录
~ 用户家目录

  • 上一次访问的目录

![2023-3-23 20-10-6](vx_images/456821020249492.jpg =403x)

file可以查看文件类型
ls -l 也可以查看文件类型

查看二进制文件
ldd {文件名}

删除空目录
rmdir

权限

权限英文数字
r4
w2
执行x1
没有权限-0
执行执行执行

设置权限
chmod

chmod u=rwx,g=rwx,o=--- {文件路径}   //添加权限
chmod u+rwx {文件路径}               //添加权限
chmod u-x {文件路径}                 //去掉权限

数字设置权限

chmod 777 {文件路径}
chmod 000 {文件路径}

chown {用户名}:{属组} {文件}
没有指定组名,默认是用户名的组

]]>
0 https://kdmy.xyz/index.php/archives/49.html#comments https://kdmy.xyz/index.php/feed/
linux学习笔记 https://kdmy.xyz/index.php/archives/41.html https://kdmy.xyz/index.php/archives/41.html Fri, 07 Apr 2023 09:31:00 +0800 KDMY 2.23(整合)

Linux操作系统管理(相关证书)

  • 初级:RHCSA(红帽系统管理员):300分 - 210分
  • 中级:RHCE(红帽工程师):300分 -210分
  • 高级:RHCA(红帽架构师):300分 - 210分

    常用命令?Vi/vim编辑器使用?软件包的安装?

    关机,重启命令

  • 关机:shutdown -h now; poweroff; init 0
  • 重启:reboot; shutdown -r now

    文件操作的命令

    创建文件:
    touch - touch创建文件的时候,文件不存在创建文件;文件存在的时候更新文件的时间戳;
    创建目录:

  • mkdir 目录名
  • mkdir -p 目录名

Stat命令可以查看一个文件的详细状态信息。包括文件的权限,大小,时间戳等信息。

查看文件:

  • ls 或 ls -l 或 ls -al ;
  • 查看文件:cat、tac、head、tail、less、more
  • 修改文件 -重命名文件:mv ;
  • 修改文件的内容:vi/vim编辑器、echo

    查看目录本身:

    ls -d 目录名

    或详细信息:

    ls -ld 目录名

    移动文件:

    mv

    复制文件:

    cp

    复制目录:

    cp -r

    删除文件:

    rm 或 rm -f 强制删除

    删除目录:

    rm -r 目录名 或 rm -rf 目录名

    查看当前工作路径的命令:

    pwd
    注意:在linux操作系统中,以“.”开头的文件是隐藏文件

    Shell就是Linux中的解释器。

    -bash
    ![](vx_images/188835815236558.png)
    ![](vx_images/334755815256724.png)

    Linux中的路径:

    /是Linux的最顶层的路径;/有且只能有一个根。 “/”在路径最前面表示的是“”;“/”在路径中间表示是路径的分隔符。

  • 绝对路径:是以“/”根最开头的路径;
  • 相对路径:以当前路径开始的路径;

特殊路径:

  • / 根目录
  • ~ 用户的家目录
    上一次访问的目录
  • . 或 ./ 当前目录
  • .. 或 ../ 上一级目录(父目录)

切换目录:

cd 绝对路径或相对路径

编辑文件:

vi/vim 、 echo
echo命令输出字符串 >> 表示追加重定向
![](vx_images/249851816249393.png)
\> 表示覆盖重定向
![](vx_images/470801816245948.png)
vi编辑器,vim是vi的增强版;通常情况下,最小化安装的操作系统是默认是没有安装vim的。

]]>
0 https://kdmy.xyz/index.php/archives/41.html#comments https://kdmy.xyz/index.php/feed/
Anime https://kdmy.xyz/index.php/archives/38.html https://kdmy.xyz/index.php/archives/38.html Sat, 04 Feb 2023 18:42:00 +0800 KDMY 2022.11.30
2022.12.10
2023.06.02

]]>
0 https://kdmy.xyz/index.php/archives/38.html#comments https://kdmy.xyz/index.php/feed/
C++ string and vector https://kdmy.xyz/index.php/archives/26.html https://kdmy.xyz/index.php/archives/26.html Wed, 02 Nov 2022 11:03:00 +0800 KDMY C++ string and vector

string

标准库类型 string 表示可变长的字符序列,使用 string 类型必须首先包含 string 头文件。
#include<string>
using std::<string>

定义和初始化string对象

下列列出了string对象最常用的一些方式:

string s1;          //默认初始化,s1是一个空串
string s2 = s1;     //s2是s1的副本
string s3 ="hiya";  //s3是该字符串字面值的副本
string s4(10,'c')   //s4的内容是 cccccccccc

可以通过默认的方式初始化一个 string 对象,这样就会得到一个空的 string 对象,也就是说该 string 对象中没有任何字符。如果提供了一个字符串字面值,则该字面值除了最后那个空字符以外其他的所有字符都被拷贝到新创建的 string 对象中去。

string s1          //默认初始化,s1是一个空串
string s2(s1)      //s2是s1的副本
string s2 = s1     //等价于s2(s1),s2是s1的副本
string ("value")   //s3是字面值"value"的副本,除了字面值最后的那个空字符外
string "value"     //等价于s3("value"),s3是字面值"value"的副本
string s4(n,'c')   //把s4初始化为连续n个字符c组成的串

直接初始化和拷贝初始化

如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。与之相反,如果不使用等号,则执行的是直接初始化

string s5 = "hiya";  //拷贝初始化
string s6("hiya");   //直接初始化
string s7(10,'c');   //直接初始化,s7的内容ccccccccccc

对于用多个值进行初始化的情况,非要用拷贝初始化的方式来处理,需要先创建一个显式地创建一个(临时)对象用于拷贝:

string s8 = string(10,'c'); //拷贝初始化,s8的内容是cccccccccc

实际上是用数字10和字符c两个参数创建出来的一个string对象,然后这个string对象又拷贝给了s8。这条语句本质上等价于下面的两条语句:

string temp(10, 'c');  //temp的内容是cccccccccc
//temp 临时变量
string s8 = temp;      //将temp拷贝给s8

string对象上的操作

os << s        将s写到输出流os当中,返回os
is >> s        从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s)  从is中读取一行赋给s,返回is
s.empty()      s为空返回true,否则返回false
s.size()       返回s中字符的个数
s[n]           返回s中第n个字符的引用,位置n从0计起
s1 + s2        返回s1 和 s2连接后的结果
s1 = s2        用s2的副本代替是s1中原来的字符
s1 == s2       如果s1和s2中所含的字符完全一样,则它们相等;string对象的相等性判断对字面的大小写敏感
s1 != s2
<, <=, >, >=   利用字符在字典中的顺序进行比较,且对字母的大小写敏感

读写string对象

int main(){
    string s;            //空字符串
    cin >> s;            //将string对象读入s,**遇到空白则停止**
    cout << s << endl;   //输出s
    return 0;
}

在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇到下一个空白为止。
例如:

int main(){
    string s;
    cin >> s;   //输入 hello word
    cout << s << endl;
}

输出结果如下:

结果

如上所述,如果程序输入的是:" hello word "(注意开头和结尾的空格),则输出将是"hello",输出结果中没有任何空格。

string s1, s2;
cin >> s1 >> s2;           //把第一个输入读到s1中,第二个输入读到s2中
cout << s1 << s2 << endl;  //输出两个string对象

假设给上面这段程序输入与之前一样的内容" hello word! ",输出的将是"helloword!"

使用geline读取一整行(待更新)

vector容器

定义和初始化vector对象

vector<T> v1              v1是一个空vector,它潜在的元素是T类型的,执行默认初始化
vector<T> v2(v1)          v2中包含有v1所有元素的副本
vector<T> v2 = v1         等价于v2(v1),v2包含有v1所有元素的副本
vector<T> v3(n, val)      v3包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n)           v4包含了n个重复的执行了值初始化的对象
vector<T> v5{a,b,c...}    v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5 = {a,b,c...} 等价于v5{a,b,c...}
]]>
1 https://kdmy.xyz/index.php/archives/26.html#comments https://kdmy.xyz/index.php/feed/
用三层交换机互连三个地区的网络 https://kdmy.xyz/index.php/archives/24.html https://kdmy.xyz/index.php/archives/24.html Sat, 29 Oct 2022 09:02:00 +0800 KDMY 用三层交换机互连三个地区的网络

思路

配置

一台三层交换机,三台交换机,一个路由器(按需求)、按照需求的电脑

将三个区域划分出来。用直通线和交叉线将它们连接

将各个地区的IP地址、网关以及广播地址分配确定。

创建三个vlan,将三个区域的电脑分别进入不同的vlan。
以下是一个区域二层交换机的配置:

en                //进入特权模式
conf t            //进入全局配置模式
vlan 10           //创建vlan 10
vlan 20           //创建vlan 20
vlan 30           //创建vlan 30
int range f0/1-3  //操作多个端口
sw m access       //将端口设置为access模式
sw access vlan 10 //将端口加入到vlan 10

在上面的基础上,将其它区域的二层交换机一个个配置。

配置三层交换机(S)

en                                     //进入特权模式
conf t                                 //进入全局配置模式
int r g 1/0/1-3                        //操作多个端口
switchport t en dotlq                  //入接口协议封装 dotlq 
switchport mode trunk                  //端口设置为 trunk模式
vlan 10                                //创建vlan 10
vlan 20                                //创建vlan 20
vlan 30                                //创建vlan 30
int vlan 10                            //配置vlan 10
ip add 192.168.10.1 255.255.255.128    //添加区域1的网关
int vlan 20                            //配置vlan 20
ip add 192.168.10.129 255.255.255.128  //添加区域2的网关
int vlan 30                            //配置vlan 30
ip add 192.168.30.1 255.255.255.0      //添加区域3的网关
exit                                   //返回上一级
ip routing                             //打开路由模式(重要)

将各个互连设备的IP和网关设置好

设置好后用ping来进行检查是否能互相通信
区域1与通信它的网关:

区域1与区域2通信:

区域1与区域3通信:

区域2通信它的网关:

区域2通信区域1:

可以看到在通信时掉了一个包,那是正常的,它在学习路线。
区域2通信区域3:

区域3通信它的网关:

区域3通信区域1:

区域3通信区域2:

]]>
0 https://kdmy.xyz/index.php/archives/24.html#comments https://kdmy.xyz/index.php/feed/
因特网概述 https://kdmy.xyz/index.php/archives/12.html https://kdmy.xyz/index.php/archives/12.html Sun, 09 Oct 2022 22:24:00 +0800 KDMY 因特网概述

网络、互连网和因特网

网络(Network)由若干个结点(Node)和连接这些结点的链路(Link)组成。
多个网络还可以通过路由器互连起来,这样就构成了一个覆盖范围更大的网络,即为互联网(互联网)。因此,互连网是“网络的网络(Network of Networks)”。
因特网(Internet)是世界上最大的互连网络(用户数以亿计,互连的网络数以百万计)。

internet与Internet的区别

  • internet(互联网或互连网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。这些网络之间的通信协议是可以任意的。
  • Internet(因特网)则是一个专用名词,它指当前全球最大的、开放的、由多网络相互连接而成的特定计算机网络,它采用TCP/IP协议族作为通信的规则,其前身是美国的ARPANET。

    ISP(Internet Service Provider)

    什么是ISP?

    ISP译为因特网服务提供者,ISP可以从管理机构申请到很多的IP地址,机构和个人可以通过某个ISP获取到IP地址的使用权,这一点很重要,因为因特网上的主机都必须有IP地址才能进行网络通信,这样就能通过ISP接入到因特网。

    基于ISP的三层结构的因特网

  • 第一层ISP被称为因特网主干网(主干ISP),第二层被称为地区网(地区IPS),第三次IPS被称为本地网(本地ISP)
  • 主干网:一般能覆盖国际范围拥有高速链路和交换设备。(第一层ISP之间直接互联)
  • 地区网:通常具有区域性或国家性覆盖规模,第二层ISP和一些大公司都是第一层ISP的用户,(与少数第一层ISP相连接)
  • 本地网:只拥有本地范围的网络,一般校园网企业网,第二层ISP的用户。
  • 一个但某个用户能接入到因特网,那么它也可以成为一个ISP,但需要调制器或路由器这样的设备,让其它用户能够与它相连。

    因特网的组成

    边缘部分

  • 由所有连接在因特网上的主机(端系统)组成。这部分用户是直接使用的,用来通信(传送数据、音频或视频)和资源共享

    核心部分

  • 大量网络和连接这些网络的路由器组成。这部分是为边缘部分提供服务的(提供连通性和交换)

    三种交换模式

    电路交换(Circuit Switching)

    如果有n部电话机需要两两相连,就需要n(n - 1)/2条电线,这样做太过于麻烦,于是就使用一个间设备将这些电话连接起来,这个中间设备就是电话交换机,每一个电话都连接在电话交换机上,将需要通信的任意两部电话的电话线路按需接通。

  • 电话交换机接听电话线的方式称为电路交换。
  • 从通信资源分配来看,交换(Switching)就是按照某种方式动态地分配传输线路的资源。

    • 电路交换的三个步骤:
      • 1.建立连接(分配通信资源)
      • 2.通话(一直占用通信资源)
      • 3.释放连接(归还通信资源)
    • 当使用电路交换来传输计算机数据时,其路线的传输效率往往很低。

    分组交换(Packet Switching)

    英特网中最重要的分组交换机就是路由器,它将各个网络互联起来并对接收到的分组进行转发(分组交换)。
    把要发送的数据(整块数据,比如一个word文档)称为一个报文,发送报文之前,发送源主机将报文划分为多个更小的等长数据段,在每个数据段前面加一写必要的控制信息(比如目的地址)组成首部,就构成一个分组,也可称为,首部就叫包头。
    分组交换机(路由器)就根据首部的目的地址来查表转发,发到目的地主机,然后目的地主机将各数据段去掉首部组合还原出原始报文
    各分组传输过程有不同路径即不同路由;分组乱序,即分组达到目的地的顺序不一定和分组在源站的发送顺序相同;才外还有传输过程的分组丢失误码重复

  • 发送方:构造分组 发送分组
  • 路由器:缓存分组 转发分组 —简称为存储转发
  • 接收方:接收分组 还原分组

    报文交换

    报文交换中的交换节点也采用存储转发方式,但报文交换对报文没有大小限制,这就要求交换节点有较大的缓存空间(也就是不分组了,直接将报文存储转发)。报文交换主要用于早期的电报通信网,现在较少使用,通常被更先进的分组交换方式取代。

    三种交换方式的缺点优点

    电路交换

    优点:

  • 通信时延小
  • 有序传输
  • 没有冲突
  • 适用范围广
  • 实时性强
  • 控制简单

缺点:

  • 建立连接时间长
  • 线路独占,使用效率低
  • 灵活性差
  • 难以规格化

    报文交换

    优点:

  • 无需建立连接
  • 动态分配路线
  • 提高线路可靠性
  • 提高线路利用率
  • 提供多目标服务

缺点:

  • 引起了转发时延
  • 需要较大存储缓存空间
  • 需要传输额外的信息量

    分组交换

    优点:

  • 无需建立连接
  • 线路利用率高
  • 简化了存储管理
  • 加速传输
  • 减少出错概率和重发数据量

缺点:

  • 引起了转发时延
  • 需要传输额外的信息量
  • 对于数据报服务,存在失序、丢失或重复分组的问题;对于虚电路服务,存在呼叫建立、数据传输和虚电路释放三个过程

    计算机网络的定义和分类

    计算机网络的定义

  • 计算机网络的精确定义并未统一
  • 计算机网络的最简单的定义是:一些接的、自治的计算机的集合
    • 互连:是指计算机之间可以通过有线或无线的方式进行数据通信
    • 自治:是指独立的计算机,它有自己的硬件和软件,可以单独运行和使用;
    • 集合:是指至少需要两台计算机
  • 计算机网络的较好的定义是:计算机主要是由一些通用的、可编程的硬件互联而成,而这些硬件并非专门用来实现某一特定的目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用
    • 计算机网络所连接的硬件,并不限于一般的计算机,而是包括了智能手机等智能硬件。
    • 计算机网络并非专门用来传输数据,而是能够支持很多种应用(包括今后可能出现的应用)。

计算机网络的分类

按交换技术分类

  • 电路交换网络
  • 报文交换网络
  • 分组交换网络

按使用者分类

公用网

  • 致电信公司出资建造的大型网络,“公用”的意思就是指愿意按电信公司的规定缴纳费用的人都可以使用这种网络,因此公用网也可称为公众网。

    专用网

  • 是指某个部门为本单位的特殊业务工作的需要建立而建立的网络。网路不向本单位以外的人提供服务(例如,军队、铁路、电力等系统)。

按传输介质分类

有线网络

  • 有线网是采用同轴电缆、双绞线、光钎等有型的实体物理介质来传输数据的网络。

    无线网络

  • 无线网是采用微波、卫星等无线形式来传播数据的网络。

按覆盖范围分类

广域网 (Wide Area Network, WAN, 也称为远程网)

  • 覆盖范围:几十公里 —— 几千公里,可以覆盖一个国家、地区、甚至横跨几个州;
  • 广域网是因特网的核心部分,其任务是为核心路由器提供远距离(例如,跨越不同的国家)高速连接,互连在不同区域的城域网(MAN)和局域网(LAN)。

    城域网 (Metropolitan Area NetWork, MAN)MAN

  • 覆盖范围:10km~100km
  • 用于将一个城市、一个地区的企业、机关或学校的局域网连接起来,实现区域内的资源共享

    局域网 (Local Area NetWork, LAN)

  • 覆盖范围:常见的办公室、宿舍或网吧中的网络就是局域网。几米到10km以内。
  • 特点:连接范围窄,用户少,配置容易,连接速率高。

    个域网 (Personal Area Network, PAN, 也称无线个人区域网WPAN)

  • 它不同于上述网络,不是用来连接普通计算机的,而是在个人工作的地方把属于个人使用的电子设备(例如,便携式计算机、打印机、鼠标、键盘等),用无线技术连接起来的网络。

按拓扑结构分类

总线型结构

总线型结构

  • 总线型结构是指各结点均挂在一条总线上,地位平等,无中心结点控制,其传递方向总是从发送消息的结点开始向两端扩散,如同广播电台发散信息一眼,因此又称广播式计算机网络
  • 优点:建网容易、增减结点方便、节省线路;
  • 缺点:重负载时通信效率不高,总线任意一处出现故障,则全网瘫痪。

    星型结构

    星型结构

  • 星型结构是指各工作站以星型方式连接成网,实际上可以看做是在总线结构的网络,其公用总线缩成一个点形成的网络结构。星型网络有中央结点,其他工作站。服务器等结点都与中央结点直接相连,这种结构以中央结点为中心,因此称为集中式网络。
  • 优点:结构简单、便于管理;控制简单、便于建网;网络延时小,传输误差底。
  • 缺点:成本高、可靠性较低、资源共享能力也较差,但由于作为中心结点的设备近年来可靠性大幅提高、价格下降,因此星型结构网络目前在小型网络中占据较大的比例。

    环形网络

  • 环型结构由网络中若干结点通过点到点的链路首尾连形成一个闭合的环。这种结构使用公共传输电缆组成环型连接,数据在环路中沿着一个方向在各个结点间传输,信息从一个结点到另一个结点。
  • 优点:

    网状型网络

  • 在网状结构中,网络的每台电脑设备之间均有点到点的链路连接,这种连接不经济,只有每个站点都要频繁地互相发送信息时才使用这种方法。它的安装配置也很复杂,但系统可靠性高,容错能力强。有时网状结构也称为分布式结构
  • 优点:可靠性高
  • 缺点:控制复杂、线路成本高

计算机网络的性能指标

性能指标可以从不同的方面来度量计算机网络的性能。

常用的计算机网络的性能指标有以下8个:

速率

  • 速率:连接在计算机网络上的主机在数字信道上传送比特的速率,也称为比特率或数据率。
  • bit/s (b/s, bps) , kb/s = 10^3^ b/s (bps) , Mb/s = k $\times$ Kb/s = 10^3^ $\times$ 10^3^ b/s = 10^6^ b/s (bps) , Gb = k $\times$ Mb/s = 10^3^ $\times$ 10^6^ b/s = 10^9^ b/s (bps) , Tb/s = k $\times$ Gb/s = 10^3^ $\times$ 10^9^ b/s = 10^12^ b/s (bps)
  • 常用数据单位:bit/s(b/s, bps) , kb/s = b/s
  • 比特:8 bit = 1 Byte , KB = 2^10^ B , MB = K $\times$ KB = 2^10^ $\times$ 2^10^ B = 2^20^ B , GB = K $\times$ MB = 2^10^ $\times$ 2^20^ B = B , TB = K $\times$ GB = 2^10^ $\times$ 2^30^ B = B

    带宽

  • 带宽在模拟信号中的意义:
  • 单位:Hz (kHz,MHz,GHz)
  • 信号所包含的各种不同频率成分所占领据的频率范围
  • 带宽在计算机网络中的意义:
  • 单位:b/s (kb/s, Mb/s, Gb/s, Tb/s)
  • 用来表示网络的通信线路所能传送的数据的能力,因此网络带宽表示在单位时间内从网路某一点到达另外一点所能通过的“最高数据率”

    吞吐量

  • 表示在单位时间内通过某个网络(或信道、接口)的数据量。
  • 吞吐量被经常用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。
  • 吞吐量受网络的带宽或额定速率的限制。

    时延

  • 网络时延:
  • 发送时延
    $$\frac{分组长度(b)}{发送速率(b/s)}$$
  • 传播时延
    $$\frac{信道长度(m)}{电磁波传播速率(m/s)}$$
  • 电磁波传播速率:自由空间:3 $\times$ 10^8^ m/s;铜线:2.3 $\times$ 10^8^ m/s;光纤:2.0 $\times$ 10^8 m/s。
  • 处理时延:一般不方便计算

    时延带宽积

  • 时延带宽积 = 传播时延 $\times$ 带宽
  • 若发送端连续发送数据,则在第一个比特即将到达终点时,发送端就已经发送了时延带宽积个比特;
  • 链路的时延带宽积又称为以比特为单位的链路长度。

    往反时间

  • RTT(Round-Trip Time)往返时间在计算机网络中它是一个重要的性能指标。表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认,不包含数据传输时间)总共经历的时间。

    利用率

    $$ 利用率\left \{ \begin{array}{c} 信道利用率 \\ 网络利用率 \end{array} \right. $$

  • 信道利用率:用来表示某信道有百分之几的时间是被利用的(有数据通过)。
  • 网络利用率:全网络信道利用率的加权平均。
  • 根据排队论,当某信道的利用率增大时,该信道引起的时延也会迅速增加;
  • 因此,信道利用率并非越高越好;
  • 如果令D0表示网络空闲时的时延,D表示网络当前的时延,那么在适当的假定条件下,可以用下面的简单公式来表示D、D0和利用率U之间的关系:
  • $$D=\frac{D~0~}{1-U}$$
    • 当网络的利用率达到50%时,时延就要加倍;
    • 当网络的利用率超过50%时,时延急剧增大;
    • 当网络的利用率接近100%时,时延就趋于无穷大;
    • 因此,一些较大主干网的ISP通常会控制它们的信道利用率不超过50%。如果超过了,就要准备扩容,增大线路的宽带。
  • 也不能使信道利用率太低,这会使宝贵的通信资源白白浪费。应该使用一些机制,可以根据情况动态调整输入到网络中的通信量,使网络利用率保存在一个合理的范围内。

    丢包率

  • 丢包率即分组丢失率,是指在一定范围内,传输过程中丢失的分组数量与总分组数量的比例;
  • 分组丢失的两个主要原因:分组误码,结点交换机缓存队列满(网络拥塞)

    计算机网络体系结构(重点)

    计算机网络体系结构

    OSI体系结构(法律上的国际标准)

  • 物理层
  • 数据链路层
  • 网络层
  • 运输层
  • 会话层
  • 表示层
  • 应用层

    TCP/IP体系协议(事实上的国际标准)

  • 网络接口层 网络接口1 网络接口2 为了将不同的网络接口进行互连,因此它的网络接口层并没有规定什么具体的内容。
  • 网际层 IP IP协议可以将不同的网络接口进行互连,并向TCP协议和UDP协议提供网络互联服务。
    • IP协议作为TCP/IP体系界中的核心协议,负责互连不同的网络接口(IP over everything;),为各种网络应用提供服务(everything over IP).
  • 运输层 TCP TCP协议在享受IP协议提供的网络互连服务的基础上,可向应用层的相应协议提供可靠传输的服务 UDP UDP协议在享受IP协议提供的网络互连服务的基础上,可向应用层的相应的协议提供不可靠传输的服务。
  • 应用层 HTTP SMTP DNS RTP

    原理体系结构(适于教学)

  • 物理层
  • 数据链路层
  • 网络层
  • 运输层
  • 应用层

    计算机网络体系结构分层的必要性

  • 物理层:解决使用何种信号来传输比特的问题
  • 数据链路层:解决分组在一个网络(或一段链路)上的传输问题
  • 网络层:解决分组在多个网络上传输(路由)的问题
  • 运输层:解决进程之间基于网络的通信问题
  • 解决通过应用进程的交互来实现特定网络应用的问题
]]>
0 https://kdmy.xyz/index.php/archives/12.html#comments https://kdmy.xyz/index.php/feed/
指针 https://kdmy.xyz/index.php/archives/11.html https://kdmy.xyz/index.php/archives/11.html Sun, 09 Oct 2022 20:45:00 +0800 KDMY 指针

指针(pointer)“指向(point to)“另外一种类型的复合类型。与引用类似,指针也实现了对其它对象的间接访问。
指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
指针无需在定义时赋初值。在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值
int *p1, p2; //p1和p2都是指向int型对象的指针
double dp, *dp2 //dp2都是指向double型对象的指针,dp是double型

获取对象的地址

指针存放着某个对象的地址,想要获取该地址,需要使用取址符(操作符&):

int ival = 42;
int *p = &ival; //p存放变量ival的地址,或者说p是指向ival的指针

因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。

指针值

指针的值(即地址)应属于下列4种状态之一:

  1. 指向一个对象
  2. 指向紧邻对象所占空间的下一个位置。
  3. 空指针,意味着指针没有指向任何对象。
  4. 无效指针,也就是上述情况之外其他值。
    试图拷贝或以其他方式访问无效指针的值都将引发错误。

    利用指针访问对象

    如果一个指针指向了一个对象,则允许使用解引用符(操作符 *)来访问该对象:

    int ival = 42;
    int *p = &ival;     //p存放着变量ival的地址,或者说p是指向ival的指针
    cout << *p << endl; //由符号*得到指针p所指的对象,输出42

    对指针解引用会得出所指的对象,因此如果给解引用的结果赋值,实际上也就是给制作所指的对象赋值:

    *p = 0;            //由符号*得到指针p所指的对象,即可经由p为变量ival的赋值
    cout << *p << endl; //输出0

    为 *p 赋值实际上是为了 p 所指的对象赋值。

    空指针

    空指针(null pointer)不指向任何对象,在试图使用一个指针代码可以首先检查它是否为空。以下列出几个生成空指针的方法:

    int *p = nullptr;         //等价于int *p = 0;
    int *p = 0;               //直接将p2初始化为字面常量0
    //首先需要 #include cstdlib
    int *p3 =NULL;            //等价于int *p = 0;

    现在的C++程序最好使用nullptr,同时尽量避免使用NULL。

    赋值和指针

    引用本身并非一个对象。一旦定义了引用,就无法令其再绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象。
    指针和它存放的地址之间就没有这种限制了。和其他任何变量(只要不是引用)一样,给指针赋值就是令它存放一个新的地址,从而指向一个新的对象:

    int i = 42;
    int *pi = 0;    //pi被初始化,没有指向任何对象
    int *pi2 = &i;  //pi2被初始化,存有i的地址
    int *pi3;       //如果pi3定义于块内,则pi3的值是无法确定的
    
    pi3 = pi2;      //pi3和pi2指向同一个对象i
    pi2 = 0;        //现在pi2不指向任何对象了

    其他指针操作

    只要指针有一个合法值,就能将它用在条件表达式中。和采用算术值作为条件遵循的规则类似,如果指针的值是0,条件则取false:

    int ival = 1024;
    int *pi = 0;      //pi合法,是一个空指针
    int *pi2 = &ival; //pi2是一个合法的指针,存放着ival的地址
    if(pi)            //pi的值是0,因此条件存放的值是false
      //....
    if(pi2)           //pi2指向ival,因此它的值不是0,条件的值是true
      //....

    任何非0指针,对应的条件值都是true。

    void* 指针

    void*是一种特殊的指针类型,可以用于存放任意对象的地址。

    double obj = 3.14, *pd = &obj;
                      //正确:void*能存放任意类型对象的地址
    void *pv = &obj;     //obj可以是任意类型的对象
    pv = pd;             //pv可以存放任意类型的指针

    利用void 指针能做的事比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋值给另一个void 指针。不能直接操作void*指针所指的对象,因为我们并知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。

    指向指针的指针

    通过 的个数可以区分指针的级别。也就是说,表示指向指针的指针,表示指向指针的指针的指针,以此类推:

    int ival = 1024;
    int *pi = &ival;  //pi指向一个int型的数
    int **ppi = &pi;  //ppi指向一个int型的指针

    此处pi是指向int型数的指针,而ppi是指向int型指针的指针,下图描述了它们之间的关系。

图片描述

解引用int型指针会得到一个int型的数,同样,解引用指向指针的指针会得到一个指针。此时为了访问最原始的那个对象,需要对指针的指针做两次解引用:

cout << "输出方式:\n"
     << "int类型输出:" << ival << "\n"
     << "指向ival的指针:" << *pi << "\n"
     << "指向指针的指针:" << **ppi
     << endl;

该程序使用三种不同的方式输出了变量ival的值:第一种直接输出;第二种通过int型指针pi输出;第三种两次解引用ppi,取得ival的值。

指向指针的引用

引用本不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:

int i = 42;
int *p;       //p是一个int型指针
int &r = *p;  //r是一个对指针p的引用

r = &i;       //r引用了一个指针,因此给r赋值&i就是令p指向1
*r = 0;       //解引用r得到i,也就是p指向的对象,将i的值改为0
]]>
0 https://kdmy.xyz/index.php/archives/11.html#comments https://kdmy.xyz/index.php/feed/
左值和右值 https://kdmy.xyz/index.php/archives/10.html https://kdmy.xyz/index.php/archives/10.html Sun, 09 Oct 2022 20:43:00 +0800 KDMY 前言

在学习C++的过程中,我一直对左值(lvalue)和右值(rvalue)的概念模糊不清,所以有了这篇文章。

左值和右值的定义

在C++中,左值它是指向一个内存地址的,右值是则没有指向任何内存地址。这就造成了右值是短暂和短命的。而左值则能活很久,因为它是以变量(variable)的形式存在的。可以把左值看作一个容器(container),而右值是容器里面的事物。容器消失了,里面的事物就会消失。

int a = 60; //a是左值,60则是右值

在这里,60是一个右值,一个数字(字面常量(literal constant))它没有指定的内存地址,在程序运行时它储存在临时的寄存器外,在该例中,60被赋予(assign)给a,a是一个变量,一个变量(specific)有着具体的内存位置,所以它是一个左值。C++中声明赋值(assignment)需要一个左值作为它的左操作数(left operand);这完全合法的。
对于左值a,你可以做这样的操作:

int* b = &a; //ok

在这里我通过地址操作符&获取了a的内存地址并且把它放进b,&操作符需要一个左值且产生一个右值,这也是完全合法的操作,在赋值操作符左边我们有一个左值,在右边我们使用取址操作符产生右值。
然而,我们不能这样写:

int y;
60 = y; //error

上面的错误显而易见,但从技术上来说60是一个字面常量也就是一个右值,它没有一个具体的内存地址(memory location),所以它会把y分配到一个不存在的地方。导致程序错误。
下面是GCC给出的变异错误提示:
error: lvalue required as left operand of assignment
赋值的左操作符需要一个左值,这里我们使用了一个右值60
我们也不能这样做:

int* a = &60; //error

GCC给出了以下错误提示:
error: lvalue required as unary '&' operand\`
&操作符需要一个左值,因为右值它没有具体的内存地址,在进行取址操作时,会发生取不到地址的错误。

返回左值和右值的函数

待更新

Sources

参考博客 internalpoiners ==点击==

]]>
1 https://kdmy.xyz/index.php/archives/10.html#comments https://kdmy.xyz/index.php/feed/