Featured image of post 第三周

第三周

1 基于gcc说明c语言编译过程

尝试基于gcc命令说明 c语言编译过程。

  1. 分步编译运行
1
2
3
4
5
6
7
8
# 1对hello.c进行预处理,生成hello.i文件
gcc -E hello.c -o hello.i  
# 2对预处理文件进行编译,生成汇编文件
gcc -S hello.i -o hello.s
# 3对汇编文件进行编译,生成目标文件
gcc -C hello.s -o hello.o
# 4对目标文件进行链接,生成可执行文件
gcc hello.o -o hello
  1. 一步实现
1
gcc hello.c -o hello

2 包管理器总结

总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取? yum/dnf/apt

2.1 主流的包管理器

  1. redhat: rpm文件,rpm包管理器
  2. debian: deb文件,dpkg包管理器

2.2 程序包内的文件

  • 二进制文件
  • 库文件
  • 配置文件
  • 帮助文件

3 程序包获取途径

总结程序包获取途径,以及rpm, yum, apt命令选项示例。

获取途径:系统发行版的光盘或第三方镜像网站

3.1 镜像网站

  1. 官方centos https://www.centos.org/download
  2. 阿里 https://developer.aliyun.com/mirror
  3. 腾讯 https://mirrors.cloud.tencent.com
  4. 华为 https://mirrors.huaweicloud.com
  5. 清华 https://mirror.tuna.tsinghua.edu.cn
  6. 中科大 https://mirrors.ustc.edu.cn

Ubuntu

3.2 rpm的使用

1
2
3
4
5
6
    # 常用命令
    -ivh    # 显示安装过程
    -q      # 查看安装的包名
    -ql     # 显示详细信息
    -qi     # 
    -qf     # 查询文件来自哪个包

3.3 yum的使用

yum能自动查找并解决rpm包之间的依赖关系

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
    # 常用命令
    yum provides */route 已知文件名路径,查找出对应的软件仓库
    yum -y # 忽略询问
    yum install # 安装软件
    yum info # 查询软件详细信息
    yum remove # 卸载程序包
    yum -y install --downloadonly --downloaddir=/data/httpd httpd 只下载相关依赖包不安装
    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 清除缓存
    yum makecache # 构建缓存
    yum history # 安装历史

3.4 apt的使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    # apt常用选项
    apt install # 安装
    apt show # 显示安装细节
    apt list # 列出包含条件的包
    apt remove/purge # 卸载(推荐使用purge卸载,可移除软件包和配置文件)
    apt update # 刷新存储库索引
    apt upgrade # 升级所有可升级的软件包
    apt full-upgrade # 在升级软件包时自动处理依赖关系
    apt search # 搜索应用程序
    apt-cache stats # 查看包相关信息
    dpkg -S filename # 查找存在的文件来自于哪个包

    # apt包索引配置文件路径
    /etc/apt/source.list
    /etc/apt/source.list.d

4 yum工作原理及搭建yum仓库

简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用。
yum/dnf工作原理**

1
2
3
4
5
6
7
8
#yum/dnf基于C/S模式
1、yum服务器存放rpm包和相关包的元数据库
2、yum客户端访问yum服务器进行安装和查询等
#yum实现过程
现在yum服务器上创建yum repository(仓库),在仓库中事先存储了众多
rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客
户端利用yum/dnf工具进行安装包时,会自动下载repodata中的元数据,查询
元数据是否存在相关的包及依赖关系,自动从仓库中找到相关的包下载并安装。

4.2 搭建yum私有仓库

http://localhost:1313/p/yum-private/

5 系统安装后的初始化步骤

总结系统安装之后的常用初始化步骤。rocky/ubuntu

5.1 更改yum源

5.1.1 Centos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

# 更改为清华
# 对于 CentOS 7
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo

# 对于 CentOS 8
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-*.repo

# 更新软件包缓存
yum makecache

5.1.2 Ubuntu

  1. 中科大 https://mirrors.ustc.edu.cn/help/ubuntu.html#id7
  2. 清华 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 备份
/etc/apt/sources.list

# 更改为清华
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

5.2 关闭SELinux

需要重启生效
sed -i.bak '/SELINUX=enforcing/c SELINUX=disabled' /etc/selinux/config

5.3 关闭防火墙

systemctl disable --now firewalld

5.4 修改网卡配置

centos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE=ens33
NAME=ens33
#BOOTPROTO=dhcp  //自动分配IP
BOOTPROTO=static  //配置静态IP

IPADDR=192.168.1.101
GATEWAY=192.168.1.1

NETMASK=255.255.255.0
#PREFIX=24  //子网掩码, 和上面等价

DNS1=192.168.1.1
DNS2=223.5.5.5

ubuntu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 修改网卡名称
sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0#' /etc/default/grub
grub2-mkconfig  -o /boot/grub2/grub.cfg ; reboot
vim /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [192.168.1.1/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1]

sudo netplan apply //生效配置

6 一建安装httpd脚本

解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求
1)基于位置变量传递版本号
2)基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包。
3)基于独立函数进行下载包,解压包。
4)基于独立函数进行编译,安装包。
5)基于独立函数完成链接包。
6)启动服务,并输出自定义的语句,安装xxx服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash


CPUS=`grep -c processor /proc/cpuinfo`
VERSION='2.4.57'
URL="https://dlcdn.apache.org/httpd/httpd-${VERSION}.tar.bz2"
INSTALL_DIR=/apps/httpd
green() {
    echo -e "\e[32m$1\e[0m"
}
red() {
    echo -e "\e[31m$1\e[0m"

}

os=centos
# yum命令不存在,说明是ubuntu
command -v yum > /dev/null 2>&1 || os=ubuntu

# 安装依赖
if [[ $os == 'centos' ]]; then
   systemctl disable --now firewalld
   yum -y install gcc make apr apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2 wget --skip-broken
else
   apt update
   apt install -y libapr*  libpcre3* libssl-dev make wget
fi

# 下载源码包,并解压
cd /usr/local/src
wget $URL || (red 'download error';exit)
tar xf httpd-$VERSION.tar.bz2
cd httpd-$VERSION

# 编译安装
./configure --prefix=/apps/httpd
make -j $CPUS && make install

# 软链接启动
ln -s /apps/httpd/bin/apachectl /usr/local/bin
apachectl start

# 提示
addr=`hostname -I | cut -d' ' -f1`
green "httpd服务安装成功 http://${addr}"

7 OSI模型

总结开放系统互联OSI模型,每层作用及对应的协议。

OSI模型总共有七层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层以及应用层。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

1.物理层
	物理层用于建立维护断开物理连接主要是网线中继器调制解调器等2.数据链路层
	数据链路层的主要功能就是合成数据块封装成帧 与其他计算机进行通信的APP应用程序支持APP应用程序的通信服务同时通过端口与端口之间连接进行物理寻址寻找MAC地址数据链路层主要设备是交换机3.网络层
   网络层是OSI参考模型中的第三层介于传输层和数据链路层之间它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上进一步管理网络中的数据通信将数据设法从源端经过若干个中间节点传送到目的端从而向传输层提供最基本的端到端的数据传送服务网络层进行逻辑地址寻址实现在不同网络的选择主要的设备是路由器4.传输层
    传输层位于网络层与会话层之间传输层在终端用户之间提供透明的数据传输向上层提供可靠的数据传输服务传输层在给定的链路上通过流量控制分段/重组和差错控制来保证数据传输的可靠性里面有TCP协议保证传输的稳定安全UDP协议保证传输的速度主要的设备是防火墙5.会话层
     位于传输层与表示层之间主要的功能是对话管理数据流同步和重新同步主要的工具像QQ微信6.表示层
     位于会话层与应用层之间表示层向上对应用层服务向下接受来自会话层的服务表示层为在应用过程之间传送的信息提供表示方法的服务它只关心信息发出的语法和语义7.应用层
    应用层其功能为处理”,即通过云计算平台进行信息处理应用层与最低端的感知层一起是物联网的显著特征和核心所在应用层可以对感知层采集数据进行计算处理和知识挖掘从而实现对物理世界的实时控制精确管理和科学决策

8 TCP总结

总结TCP包头结构,TCP三次握手,4次挥手。
TCP包头

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

1源端口目标端口计算机之间进程的通信是通过端口连接的同一时间一个端口只允许一个进程占用所以通过源端口和目的端口就可以知道那两个进程通信源端口目标端口是用16位表示的可推算计算机的端口个数为2^16,即65536
2序列号表示本报文段所发送数据的第一个字节的编号在TCP连接中所传送的字节流的每一个字节都会按顺序编号由于序列号由32位表示所以每232个字节就会出现序列号回绕再次从 0 开始
3确认号表示接收方期望收到发送方下一个报文段的第一个字节数据的编号也就是告诉发送方我希望你指发送方下次发送的数据的第一个字节数据的编号为此确认号
4数据偏移表示TCP报文段的首部长度共4位由于TCP首部包含一个长度可变的选项部分需要指定这个TCP报文段到底有多长它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15所以数据偏移也就是TCP首部最大60字节
5SYN同步标志位用于建立会话连接同步序列号6ACK确认标志位对已接收的数据包进行确认7FIN完成标志位表示我已经没有数据要发送了即将关闭连接8PSH推送标志位表示该数据包被对方接收后应立即交给上层应用而不在缓冲区排队9RST重置标志位用于连接复位拒绝错误和非法的数据包10URG紧急标志位表示数据包的紧急指针域有效用来保证连接不被阻断并督促中间设备尽快处理11窗口大小表示现在允许对方发送的数据量也就是告诉对方从本报文段的确认号开始允许对方发送的数据量达到此值需要ACK确认后才能再继续传送后面数据由Window size value * Window size scaling factor此值在三次握手阶段TCP选项Window scale协商得到得出此值
12校验和提供额外的可靠性
13紧急指针标记紧急数据在数据字段中的位置

8.1 TCP三次握手


第一次握手: 客户端将TCP报文标志位SYN置为1,随机产生一个序号值seq=J,保存在TCP首部的序列号(Sequence Number)字段里,指明客户端打算连接的服务器的端口,并将该数据包发送给服务器端,发送完毕后,客户端进入SYN_SENT状态,等待服务器端确认。

第二次握手: 服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将TCP报文标志位SYN和ACK都置为1,ack=J+1,随机产生一个序号值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

第三次握手: 客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

8.2 TCP四次挥手


第一次挥手: Client端发起挥手请求,向Server端发送标志位是FIN报文段,设置序列号seq,此时,Client端进入FIN_WAIT_1状态,这表示Client端没有数据要发送给Server端了。

第二次分手: Server端收到了Client端发送的FIN报文段,向Client端返回一个标志位是ACK的报文段,ack设为seq加1,Client端进入FIN_WAIT_2状态,Server端告诉Client端,我确认并同意你的关闭请求。

第三次分手: Server端向Client端发送标志位是FIN的报文段,请求关闭连接,同时Client端进入LAST_ACK状态。

第四次分手: Client端收到Server端发送的FIN报文段,向Server端发送标志位是ACK的报文段,然后Client端进入TIME_WAIT状态。Server端收到Client端的ACK报文段以后,就关闭连接。此时,Client端等待2MSL的时间后依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

9 IP地址总结

总结IP地址 A, B, C, D 类,并解析IP地址的组成

9.1 IP地址的组成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
它们可唯一标识 IP 网络中的每台设备 ,每台主机(计算机、网络设备、外围设备)必须具有唯一的地址(ip地址可以实现逻辑管理功能)

IP地址由两部分组成:
IP地址=网络位+主机位
- 网络位:标识的是internet上的一个子网
- 主机位:标识的子网中的某台主机

网络 ID:标识网络,每个网段分配一个网络ID,处于高位
主机 ID:标识单个主机,由组织分配给各设备,处于低位
IPv4地址格式:点分十进制记法

9.2 IP地址的分类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
A类地址:
0 0000000 - 0 1111111.X.Y.Z : 0-127.X.Y.Z
网络ID位是最高8位,主机ID是24位低位
网络数:126=2^7(可变是的网络ID位数)-2
每个网络中的主机数:2^24-2=16777214
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
范例:114.114.114.114,8.8.8.8,1.1.1.1,123.56.174.200,119.29.29.29

B类地址:
10 000000 - 10 111111.X.Y.Z:128-191.X.Y.Z
网络ID位是最高16位,主机ID是16位低位
网络数:2^14=16384
每个网络中的主机数:2^16-2=65534
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
范例:180.76.76.76,172.16.0.1

C类地址:
110 0 0000 - 110 1 1111.X.Y.Z: 192-223.X.Y.Z
网络ID位是最高24位,主机ID是8位低位
网络数:2^21=2097152
每个网络中的主机数:2^8-2=254
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
范例: 223.6.6.6,223.5.5.5

D类地址:
组(多)播,1110 0000 - 1110 1111.X.Y.Z: 224-239.X.Y.Z
E类:保留未使用,240-255

10 主机数,子网掩码计算

201.222.200.111/18计算主机数?子网掩码?说明计算方法。
结果:

1
2
主机数 = 2^(32-18)-2 = 16382
子网掩码 = 255.255.192.0

计算方法:

1
2
3
4
5
6
7
8
9
CIDR:无类域间路由,目前的网络已不再按A,B,C类划分网段,可以任意指定网段的范围
CIDR无类域间路由表示法:IP/网络ID位数,如:172.16.0.100/16
netmask子网掩码:32位或128位(IPv6)的数字,和IP成对使用,用来确认IP地址中的网络ID和主机ID,对应网络ID的位为1,对应主机ID的位为0,范例:255.255.255.0 ,表现为连续的高位为1,连续的低位为0
**主机数**
CIDR表示法显示网络id是前18位,所以主机id为后14位,主机数=2^14-2=16382
**子网掩码**
子网掩码
主机IP为 201.222.200.111/18
根据CIDRD对应的子网掩码为:255.255.11000000.0 转换成二进制就是255.255.192.0

11 提取本机ip

通过ifconfig命令结果找到ip地址

12 检测在线的主机

使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 for i in $(seq 254)
 do
     ping -c1 192.168.1.${i} >> /dev/null
     if [ $? -eq 0 ];then
         echo "192.168.1.${i}"
     fi
 done

 for i in {1..254}; do
    if ping -c1 -W1 192.168.1.$i &> /dev/null; then
        echo 192.168.1.$i is up | tee hosts.txt
    fi
 done
转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计