运维课程第四周小结
第十天:网络协议和通信

10.1 网络协议基础知识
计算机网络范围分类:
- 局域网 LAN:小区域内
- 城域网 MAN:大号局域网
- 广域网 WAN:长距离传输
网络分层
- OSI七层模型

-
TCP/IP四层模型
网络接口层 网络层 传输层 应用层

通信机制:单工通信机制、半双工通信机制、全双工通信机制

单工:只能水管单向流
半双工:只能单向,但可以从左到右,或从右到左
全双工:可以双向同时传输
10.2 局域网

链路层包含源mac和目标mac
网络层包含源ip和目标ip
传输层包含源port和目标port
数据包从A主机到B主机,要识别mac
网络设备
- 交换机 从每个口去找人 里面维护着mac地址表
- 路由器 定向找人 记录网段信息 有网关

网络适配器,也称网卡
以太网:边发边听,有冲突就冲突停止,并尝试延迟重发
- mac地址:网卡唯一的身份标识(全球唯一)
分层网络:一般分2层,细分3层

10.3 TCP/IP
TCP:面向连接的、可靠的、基于字节流的传输层协议
UDP:无连接、不可靠、基于报文
传输层协议:把两个程序进行传递输出(端口到端口)
报文:数据封装后的产物就是报文,就是数据包裹,类似于一层一层洋葱
TCP报文

- 需要关心的是:源端口 目的端口 FIN SYN ACK

TCP端口:
-
知名端口(范围0~1023):HTTP80,SSH22,
-
动态端口(范围1024~65535):MySQL3306
重点
TCP的三次握手和四次断开

- 见面的时候才能握手(断开时)
- 客户端发出请求(第一次握手):标志位SYN的值标记为1(表示客户端到服务端建立连接的第一次请求),服务端接收信息
- 服务端确认信息建立连接,发出请求建立连接(第二次握手):标志位ACK和SYN的值都标记为1(ACK标记1表示确认收到消息了)
- 客户端收到确认,确认建立连接(第三次握手):标志位ACK标记为1(确认收到消息了)
- 最终双方都处于连接状态
传完消息,需要断开了

- 前提:双方都处于连接状态
- 客户端发起断开请求(第一次断开):FIN标记为1(中断连接)
- 服务端接收断开请求,发送确认(第二次断开):ACK标记为1 ,此时客户端单方面与服务端断开
- 服务端发起断开请求(第三次断开):FIN标记为1(中断连接)
- 客户端接收断开请求,发送确认(第四次断开):ACK标记为1 ,此时双方彻底断开
但是问题来了,这么多ack等的状态,谁知道哪个是第几次呢?
解决方案:有限状态机

UDP报文:只需要源端口和目标端口
进程间通信:cpu执行程序放到队列里按照顺序执行

IP报文:源IP和目标IP
网络层协议:IP协议,ICMP协议,ARP协议
10.4 IP
IP是互联网协议地址,互联网上唯一的身份标识
- ipv4:32位二进制数字表示IP地址

分为网络位(掩码)和主机位
掩码的长度变化:长度变短=主机位长度增加=该网段可容纳主机数增加
长度变长=主机位长度缩短=该网段可容纳主机数减少

长度每+n,拆分成2n个子网

长度每-n,合并2n个子网
IP地址分为公网和私网,一共分为5类(A,B,C,D,E)

用自己的掩码分别和自己IP和别人IP比对,相同则同一网段可以访问,不同则不可访问
所以会出现我可以访问你,但你不可以访问我的情况

10.5 VM网络
VM网络:桥接、NAT、仅主机

bridge:动态分配ip地址,但是不好的是ip地址太多
NAT模式:网络地址转换,虚拟机数据离开主机时候,使用主机的ip地址上网
mobaxterm,通过生成的虚拟网卡10.0.0.1来连接虚拟机(属于主机),用10.0.0.1上网(w命令)
仅主机:自己玩,但是上不了网

网卡名字

需要改成eth0之类的
/etc/netplan/
ls
rm -rf 50和01
mv 90 50
ls
改成eth0
修改grub文件(立即生效)
reboot
完成操作

第十一天 网络配置管理和进程基础
11.1 网卡属性定制
要定制,首先得知道配置文件在什么地方?

这里将展示openeuler的网卡属性定制方法


-
为主机添加一块新网卡,使用nat网络
-
进入配置文件
cp ifcfg-ens160 ifcfg-ens224 sed -i 's/ens160/ens224/g' ifcfg-ens224 vim ifcfg-ens224 删UUID,更改ip至10.0.0.114 systemctl restart NetworkManager ####如果上述命令不管用#### nmcli connection down ens224 systemctl restart NetworkManager
这里将展示rocky9的网卡属性定制方法

nmcli是NetworkManager的客户端配套工具,该工具离不开NM服务
但NWM的作用只能重载配置文件,断开不了之前的连接
解决方法:上图中总结出来的两条命令
-
依旧是增加网卡
-
cd /etc/NetworkManager/system-connections/ 生成配置文件: 场景1 -- 网卡处于未连接状态 nmcli device up 就可以生成配套网卡配置文件 场景2 -- 网卡处于连接状态 断开网卡的连接状态 nmcli con reload -- 重载网卡连接配置 nmcli device up 进行配置: 删除uuid

-
nmcli connection down ens224 systemctl restart NetworkManager -
生效
这里将展示Ubuntu的网卡属性定制方法
-
添加网卡
-

-
添加新网卡名,addresses和routes
-
netplan apply -- 使网卡生效
11.2 网络命令解读
hostname命令
hostnamectl set-hostname 主机名 --- 更改主机名字
hostnamectl -- 查看主机名(只要记忆这个就可以)
ifconfig命令
ifconfig -- 看ip地址
ifconfig down ens37 -- 关闭设备
ifconfig up ens37 -- 启用设备
ifconfig eth1 10.0.0.55 netmask 255.255.255.0 -- 临时更改ip地址
route命令
route -n -- 显示路由
route add -net 11.0.0.0/8 gw 10.0.0.2 -- 增加网关为10.0.0.2,目标为11.0.0.0/8的路由
route del -net 11.0.0.0/8 -- 删除路由
netstat命令
netstat -tnulp -- tcp,number,udp,listen,port
nmcli命令
nmcli con -- 看网络连接状态
nmcli con show ens160 -- 看具体连接状态
nmcli dev show ens224 -- 看设备连接状态
nmcli connection up ens224 -- 建立连接
nmcli connection down ens224 -- 取消连接
***
要使得修改生效
先断开连接
再修改
重启服务
再连接


注意:网关定制要选择距离目标网段最近,且ip地址和我同网段的ip地址
11.3 网络进阶
网卡绑定

流量来了之后从网卡交给主机,但如果网卡坏了,就出现单点故障
解决方法:增加一个网卡
出现情况:服务器是给程序用的,程序不知道网卡有没有坏
解决方法:把网卡绑定,提供唯一的入口,生成vip(虚拟ip) 必须在同一网段,是同网络模型
同样的,在服务器级别上,坏了一台服务器称为单点故障,也通过vip绑定两台,叫高可用。

- 轮询:外部流量过来,交替交给不同的网卡,也称RR
- 主备:外部流量过来。先找老大(主),如果主网卡坏了,再给备网卡
- 平衡策略:根据源端口
网卡绑定实践
modprobe -- first-time bonding
其余见pdf

如果流量切换的时候有数据进来,流量会丢失,叫网络抖动
网络组:不多介绍,了解即可
流程:设定team0检测流程,检测状态。把两个网卡绑定在team0上,给team0流量
11.4 软路由实践
配ip地址很重要,占比95%!!!

软路由:用主机来模拟路由器,达到流量转发的效果
-
注意,网关的选择是距离目标最近的ip地址,且与我同网段
-
分别配置ip
-
对于ubuntu: 修改后netplan apply 对于rocky: address= method=manual 修改后systemctl restart NetworkManager -
发现15主机居然能ping通172.24.100.7???
原因:没从规划好的路线走,172.24.100.7的流量从nat模型自动生成的vmnet8出去了(vmnet8和vmnet1都属于Windows,可以互相通信)
解决办法:
route del default

-
接下来定制路由
对于路由器主机rocky: route add -net 192.168.8.0/24 gw 10.0.0.15 -- 设置路由 开启转发能力: echo 1 > /proc/sys/net/ipv4/ip_forward 对于客户端主机ubuntu: route add default gw 172.24.100.6 -- 设置路由,即流量唯一出口
11.5 网桥实践


小结:
11.6 网络工具解读
tcpdump命令
yum install tcpdump -y
tcpdump -D -- 显示所有可以用来抓包的接口
tcpdump -nn -- ip和port都用数字形式展示
tcpdump -vv -- 显示更细的内容
tcpdump -nn host ip -- 抓特定主机的双向包
tcpdump -nn src host ip -- 抓特定主机的单向包
tcpdump -nn dst host ip -- 同上
tcpdump +
ip host -- 抓ip报文
tcp port -- 抓port报文
多条件:使用and进行层层过滤
tcpdump ip host 10.0.0.12 and host 10.0.0.1 -- 就抓两台特定节点之间的数据包
nmap -- 安全方面的命令,用的比较少(安全审核工具)
nmap 10.0.0.13/24
11.6 进程基础知识

我们知道,对于一个程序:
-
文件在硬件中,若要执行程序,我们把数据加载到内核空间
-
内存划分为两个区域,彼此隔离,通过复制把内容放到用户空间,从而让程序使用
-
旁边有cpu,cpu有多核来执行操作
-
为了方便cpu更快执行操作,里面又分为了L1,L2,L3等缓存
-
程序在运行时,会把所需要的数据提前加载到缓存中
-
之后程序执行
-
执行完的内容原路返回(回到用户空间)
-
用户空间再复制一份到内核空间
-
内核空间复制到硬件
但是程序有很多很多个,假如有10000个程序给双核cpu执行,每个cpu中分5000个
- cpu会提供一个队列,挨个执行,维护执行顺序
- cpu内部把时间进行分片(每个程序存活并执行一定时间,然后去别的队列里)
- 让程序实现“同时运行”的效果
这里衍生出并发和并行的关系:

并行要求有多个cpu,可以一起执行
对于程序而言,进程是正在进行中的程序
表现样式:
- 程序唯一的身份标识:PID
- 如果有网络通信需求,则还会有port
- 每个程序内部划分资源,内存资源来源于文件,文件是否允许读?与权限有关
进程运行方式分类:
守护进程:后台运行,不占用终端
前台进程:前台运行,会占用终端

- 进程文件来源于存储设备(有大量文件)
- 向操作系统申请一块内存空间
- 把数据加载到内存空间
- 为内存空间中的进程设定用户属性,操作权限,身份标识等
进程的创建:
-
为进程分配唯一的PID
可通过 ls /proc/查看 -
里面的东西都是操作系统分配的
-
为进程分配空间
-
初始化模块(搬到新家需要初始化环境)目的:方便cpu调度
-
设置准确连接(队列来连接程序,决定执行顺序)
-
如果程序结束,自动消失
父进程和子进程

为子进程分配新空间,生成后里面就有相应数据
查看进程关系
pstree -p
列表形式查看进程
ps aux
进程由程序,数据(生成的数据)和进程控制块(PID等)三部分组成
第十二天:进程基础和shell编程进阶
12.1 进程基础知识
12.1.1 进程与线程
上图为进程的梳理:

-
操作系统上开启了一个独立的进程
-
进程运行时,把程序加载到运行环境,运行的文件都放在内存里
-
进程中由负责运行的程序代码,运行中的数据和控制器PCB构成
进程是操作系统资源分配的基本单位
线程

已知进程在CPU上执行,但cpu上有很多程序在运行,里面的缓存是很有限的
所以它维持了一个队列,里面有链接,到谁了就把数据加载到cpu里,到点了就释放出去
- 但是很多程序都使用共同的数据,没必要每次都扔了再拿
- 所以把共性的数据放在一起,让其他的东西单独运行就可以了
- 每个小进程(线程)只要自己加载自己的东西就可以
线程是程序调度和分配的基础单位
相当于一个总控中心,把东西带来,让不同服务员帮忙来处理就行了
不然就得自己一家一家跑
所有线程共享进程内的数据,脱离进程,线程不复存在
12.1.2 进程查看
pstree -p
查看线程:
grep -i threads /proc/PID/status -- 在status的threads里

-
大括号括起来的是线程
以796为例,它是单进程多线程的工作模式
-
没有大括号的就是进程
有分支就代表多进程
12.1.3 进程状态

有多个状态:
- 创建时是创建状态
- 等待执行是就绪状态
- cpu的队列轮到我了,运行时是执行状态
- 如果cpu有别的事情,就把自己放在一边,处于阻塞状态
- 从阻塞状态出来后,还是要等到cpu准备好才能操作,又进入就绪状态
- 执行完就是终止状态

这里的stat就表示状态
12.2 进程管理基础知识
12.2.1 僵尸进程和孤儿进程

僵尸进程:父进程stop了,子进程依然在运行,没人管,什么信息都不接收,就处于僵尸进程了
孤儿进程:有一个中间进程切断父进程和子进程。父进程断掉时,按道理来说子进程应该也断掉,但它被中间进程控制着,变成孤儿进程了
12.2.2 内存清理策略
内存是有限的,一共就这么多,总有一天会满,需要清理

FIFO:先进先出
LRU:最近最少使用 – 记录的是时间值
LFU:最不经常使用 – 记录的是数量
每一种思路都是一种算法,每种算法不一样
如何选择最优算法呢?
我们就要考虑算法复杂度
12.2.3 进程间通信
其中有一个,是消息队列解决方案

不同主机直接通信,也会像cpu一样维护消息队列(用kafka之类的软件维护)
12.3 梳理
进程的结构,进程在运行过程中演变出线程,在进程中生成很多“小弟”,在运行程序时可以调用线程到cpu上,这样资源消耗就少很多
在cpu运行过程中,为了知道进程是什么情况,引入进程状态
进程运行时,会有优先级(高优先级进程来了,需要清理之前的内存),这时候就引入了进程的清理(算法复杂度)
进程之间还需要通信,方法很多(套接字,共享字符等)
12.4 进程优先级
cpu中有时间分块,进程优先级高的进程所占有的cpu时间更长

Linux中,把进程优先级进行了划分:系统优先级(无法控制,0 - 99)和实时优先级(可控,100 - 139)
但是可以控制的优先级中,理论层面为100 - 139 , 用nice或renice命令调整为-20 - 19 , 用top命令查看为0 - 39
12.5 进程管理命令解读

pstree命令
pstree -p
pstree -sp 1909 -- -s:跟踪溯源,可以用pstree -p | grep ssh来代替
ps命令
ps aux -- 查看进程
ps auxf -- 显示进程树形关系
kill命令
kill -9 pid -- 结束进程
killall 进程名
pkill 进程名 -- 这两个二选一
kill -l 查看所有命令
12.6 进程命令解读
top命令解读:
top -- 实时显示系统的运行情况(默认三秒刷新一次)
top -n1 -- 刷新一次后退出
htop -- 更炫酷的界面(其实功能和top一样)


注意swap交换分区:如果内存不够的话,就会开始用swap空间
交换分区尽量不要使用
内存使用率再高也无所谓,因为数据在内存里速度更快
系统负载:cpu在5分钟;10分钟;15分钟的负载

free命令
free -h -- 查看内存
里面的swap分区如果不想要:
vim /etc/fstab -- 把swap的行删除
其中:buffer/cache都是在内存当中

-
buffer:缓冲
程序要把数据放到文件里,先写到用户空间的内存中,这就是写缓冲
-
cache:缓存
文件要从磁盘被程序读取,先加载到缓存里,在内核空间中的状态就是读缓存
vmstat命令:
vmstat -- 快速获取系统负载
procs:
r -- 可运行(正运行或等待运行)进程的个数,和核心数有关
b -- 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
free -- 空闲物理内存总量
swap:
si -- 从磁盘交换进内存的数据速率
so -- 从内存交换进磁盘的数据速率
io:(input output)
bi -- 从块设备读取数据到内存的速率
bo -- 保存数据至块设备的速率(文件数据保存到具体磁盘文件)
system:
in -- 中断速率
cs -- 进程切换速率

lsof命令:
lsof -Pti:80 -- 查看指定端口的进程
其实和ps aux |grep nginx 显示内容中的一部分差不多
也和pidof -f nginx也差不多
lsof命令用的最多的地方:
kill -9 $(lsof -Pti:80)
作业管理:
command & -- 放到后台去运行
jobs -- 查看终端作业
fg 编号 -- 把后台的内容调到前台
bg 编号 -- 让送往后台的作业继续在后台运行
nohup -- 就算中止终端也不影响后台运行
12.7 计划任务实践
计划任务:at计划任务和cron计划任务
at计划任务:一次性的执行任务
依赖atd服务
把计划放到一个文件里:
- 红帽:/var/spool/at/
- ubuntu:/var/spool/cron
交互方式定制:
at 时间
命令
ctrl + D
查看定制的命令:
at -l
免交互方式定制:
echo reboot | at now+5min
cron计划任务:周期性任务

命令运行时会有两种情况:
- root用户 编辑的是系统级别的
- 普通用户 编辑的是用户级别的,放在同名文件中
记住:分 时 日 月 周
,:表示离散的时间
-:连续的时间
/:表示步长
用户级别:
crontab -e
写的时候就确定作者了,不加用户(加了会当成命令,比如root)
但是不放进/etc/crontab
系统级别:
vim /etc/crontab
但是系统级别不代表root用户写的就是系统级别
必须加上root
12.8 循环语法解读

for 循环,条件可以是{1…10},$(seq 10) 等

while 条件:
永真:while true 死循环,永远不退出
用for输出12345:
for i in {1..5}
do
echo $i
done
用while输出12345
a=1 -- 设定初始值
while [ $a -lt 6 ]
do
echo $a
let a+=1
done

用until输出12345(条件不成立的时候走循环)
a=1
until [ $a -gt 5 ]
do
echo $a
done

12.9 循环控制语法解读

a=1 -- 设定初始值
while [ $a -lt 6 ]
do
if [ $a -eq 3 ]
then
exit -- 直接退出整体程序,结果输出1和2
fi
echo $a
let a+=1
done
a=1 -- 设定初始值
while [ $a -lt 6 ]
do
if [ $a -eq 3 ]
then
exit -- 直接退出整体程序,结果输出1和2
fi
echo $a
let a+=1
done

对于break:如果只有一个循环,那么就退出这个循环,效果和exit一样
如果有两个while循环,退出break所在循环,进入外层循环
a=1 -- 设定初始值
while [ $a -lt 6 ]
do
if [ $a -eq 3 ]
then
break -- 就一层循环,退出即直接退出整体程序,结果依然输出1和2
fi
echo $a
let a+=1
done
a=1 -- 设定初始值
while [ $a -lt 6 ]
do
if [ $a -eq 3 ]
then
continue -- 跳出当前循环,直接进入下一个循环 跳出循环后a=a+1不生效了,所以输出1和2
fi
echo $a
let a+=1
done
a=0 -- 设定初始值
while [ $a -lt 6 ]
do
let a=a+1
if [ $a -eq 3 ]
then
continue -- 跳出当前循环,直接进入下一个循环 跳出循环后a=a+1不生效了,所以输出1和2
fi
echo $a
done

for var1 in {1..5}
do
for var2 in {a..d}
do
if [ $var1 -eq 2 -o "$var2" == "c" ]
then
break
else
echo "$var1 - $var2"
fi
done
done

for var1 in {1..5}
do
for var2 in {a..d}
do
if [ $var1 -eq 2 -o "$var2" == "c" ]
then
continue
else
echo "$var1 - $var2"
fi
done
done

1362

被折叠的 条评论
为什么被折叠?



