第三周作业

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

C 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接
C语言的程序编译主要经过四个过程:
在这里插入图片描述

1.1 预处理(Pre-Processing)

1)将所有的#define删除,并且展开所有的宏定义
2)处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
3)处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
4)删除所有注释 “//“和”/* */”.
5)添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
6)保留所有的#pragma编译器指令,因为编译器需要使用它们

1.2编译 (Compiling)

编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成
相应的汇编代码

1.3汇编 (Assembling)

汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编
相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可

1.4链接 (Linking)

通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可

1.5执行文件

[root@rocky-8 p]# ll

总用量 48
-rwxr-xr-x 1 root root 18096 1010 17:53 hello
-rw-r--r-- 1 root root 15628 1010 17:52 hello.i
-rw-r--r-- 1 root root  1496 1010 17:53 hello.o
-rw-r--r-- 1 root root   460 1010 17:53 hello.s
-rw-r--r-- 1 root root    73 1010 17:51 helloword.c
[root@rocky-8 p]# cat helloword.c 
#include<stdio.h>
int main(void)
{
printf("Hello world!\n");
return 0;
}
[root@rocky-8 p]#[root@rocky-8 p]# ./hello
Hello world!
[root@rocky-8 p]# 

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

软件包管理器功能:

将编译好的应用程序的各组成文件打包一个或几个程序包文件,利用包管理器可以方便快捷地实现程序
包的安装、卸载、查询、升级和校验等管理操作

主流的程序包管理器

redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
debian:deb文件, dpkg 包管理器

软件包中的文件分类

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

获取程序包的途径
CentOS 镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
https://mirrors.huaweicloud.com/
https://mirror.tuna.tsinghua.edu.cn/
http://mirrors.sohu.com
http://mirrors.163.com
Ubuntu 镜像:
http://cdimage.ubuntu.com/releases/
http://releases.ubuntu.com
Rocky 镜像:

可以共用centos 8 版本的

http://mirrors.nju.edu.cn/rocky/ #南京大学
https://mirror.sjtu.edu.cn/rocky/ #上海交大
第三方组织提供
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/
https://mirrors.cloud.tencent.com/epel/
http://mirrors.nju.edu.cn/epel/
https://mirrors.huaweicloud.com/epel/

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

rpm命令选项示例(无法解决包的依赖关系 现在主要用来查询。)

功能:
安装、卸载、升级、查询、校验、数据库维护

rpm命令安装
安装格式:
rpm {-i|--install} [install-options] PACKAGE_FILE…
选项:
-v: verbose
-vv: 
-h: 以#显示程序包管理执行进度
常用组合:
rpm -ivh PACKAGE_FILE ...

其他选项:
rpm包安装[install-options]
  --test: 测试安装,但不真正执行安装,即dry run模式
--nodeps:忽略依赖关系
--replacepkgs | replacefiles
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscripts:不执行程序包脚本
 %pre: 安装前脚本 --nopre
 %post: 安装后脚本 --nopost
 %preun: 卸载前脚本 --nopreun
 %postun: 卸载后脚本 --nopostun
----------------------------------------------------------------------------
安装测试:
[root@centos7 ~]# ll
total 160
-rw-------. 1 root root  1243 Sep 25 20:29 anaconda-ks.cfg
-rw-r--r--  1 root root 36328 May 11  2022 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
drwxr-xr-x  2 root root    33 Sep 28 23:18 testdir22
lrwxrwxrwx  1 root root     8 Sep 28 23:12 testdir22link -> /testdir
[root@centos7 ~]# 
[root@centos7 ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
error: Failed dependencies:
	perl(DBD::mysql) is needed by mha4mysql-node-0.58-0.el7.centos.noarch
	perl(DBI) is needed by mha4mysql-node-0.58-0.el7.centos.noarch
####  需要依赖一些包安装失败
#### 加上 --nodeps 忽略依赖包安装体验下
[root@centos7 ~]# rpm -ivh --nodeps  mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:mha4mysql-node-0.58-0.el7.centos ################################# [100%]
[root@centos7 ~]# 

rpm命令卸载
格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] 
PACKAGE_NAME ...
注意:当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留

示例:
[root@centos7 ~]# rpm -ql mha4mysql-node 
/usr/bin/apply_diff_relay_logs
/usr/bin/filter_mysqlbinlog
/usr/bin/purge_relay_logs
[root@centos7 ~]# rpm -e mha4mysql-node 
[root@centos7 ~]# rpm -ql mha4mysql-node
package mha4mysql-node is not installed
[root@centos7 ~]# 

rpm命令之 查询(重要)
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
[query-options]
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
--last 最后安装的包
--changelog 安装包的变更历史
#和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R,--requires 查询指定的程序包所依赖的CAPABILITY

常用查询用法:
-qa
-q PACKAGE  #查看安装的包名
-qi PACKAGE  #查看包的版本、包名、版本、安装时间、发行者、功能
-qc PACKAGE   #查看安装的包名配置文件
-ql PACKAGE #详细显示安装的包的list
-qd PACKAGE  #列出所有文档文件
-q --scripts PACKAGE  #列出包的脚本文件
-qf FILE #反向查询文件来自哪个包
-qpi PACKAGE_FILE  
-qpl PACKAGE_FILE, ...
-qa --last|head  ##查看最近安装的包
范例: 查看最近安装的包
[root@centos7 ~]#  rpm -qa --last|head
wget-1.14-18.el7_6.1.x86_64                   Tue 10 Oct 2023 10:28:43 PM CST
lrzsz-0.12.20-36.el7.x86_64                   Tue 26 Sep 2023 06:04:07 PM CST
ntpdate-4.2.6p5-29.el7.centos.2.x86_64        Tue 26 Sep 2023 11:18:34 AM CST
ntp-4.2.6p5-29.el7.centos.2.x86_64            Tue 26 Sep 2023 11:18:34 AM CST
autogen-libopts-5.18-5.el7.x86_64             Tue 26 Sep 2023 11:18:34 AM CST
tree-1.6.0-10.el7.x86_64                      Tue 26 Sep 2023 11:13:33 AM CST
vim-enhanced-7.4.629-8.el7_9.x86_64           Mon 25 Sep 2023 09:25:47 PM CST
vim-common-7.4.629-8.el7_9.x86_64             Mon 25 Sep 2023 09:25:47 PM CST
vim-filesystem-7.4.629-8.el7_9.x86_64         Mon 25 Sep 2023 09:25:45 PM CST
perl-5.16.3-299.el7_9.x86_64                  Mon 25 Sep 2023 09:25:45 PM CST

范例:
[root@centos7 ~]# rpm -q gzip
gzip-1.5-10.el7.x86_64
[root@centos7 ~]# rpm -qd gzip
/usr/share/doc/gzip-1.5/AUTHORS
/usr/share/doc/gzip-1.5/ChangeLog
/usr/share/doc/gzip-1.5/NEWS
/usr/share/doc/gzip-1.5/README
/usr/share/doc/gzip-1.5/THANKS
/usr/share/doc/gzip-1.5/TODO
/usr/share/info/gzip.info.gz
/usr/share/man/man1/gunzip.1.gz
/usr/share/man/man1/gzexe.1.gz
/usr/share/man/man1/gzip.1.gz
/usr/share/man/man1/zcat.1.gz
/usr/share/man/man1/zcmp.1.gz
/usr/share/man/man1/zdiff.1.gz
/usr/share/man/man1/zforce.1.gz
/usr/share/man/man1/zgrep.1.gz
/usr/share/man/man1/zless.1.gz
/usr/share/man/man1/zmore.1.gz
/usr/share/man/man1/znew.1.gz
[root@centos7 ~]# rpm -q --scripts gzip
postinstall scriptlet (using /bin/sh):
if [ -f /usr/share/info/gzip.info* ]; then
    /sbin/install-info /usr/share/info/gzip.info.gz /usr/share/info/dir || :
fi
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
    if [ -f /usr/share/info/gzip.info* ]; then
        /sbin/install-info --delete /usr/share/info/gzip.info.gz /usr/share/info/dir || :
    fi
fi

yum 命令常用选项

yum [options] [command] [package ...]

yum的命令行选项:
-y #自动回答为"yes"
-q #静默模式
--nogpgcheck #禁止进行gpg check
--enablerepo=repoidglob    #临时启用此处指定的repo,支持通配符,如:"*"
--disablerepo=repoidglob #临时禁用此处指定的repo,和上面语句同时使用,放在后面的生效

显示仓库列表
yum repolist [all|enabled|disabled]

显示仓库的详细信息
yum repolist -v


Repo-baseurl : http://mirrors.aliyun.com/centos/7/os/x86_64/, http://mirrors.aliyuncs.com/centos/7/os/x86_64/,
             : http://mirrors.cloud.aliyuncs.com/centos/7/os/x86_64/

显示程序包
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]

 只查看已经安装的包
yum list installed|head

查看可安装的包
yum list available |head

查看可以升级的包
yum list updates

查看指定的包
yum list exim

yum 安装程序包
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...]  #重新安装
--downloadonly  #只下载相关包默认至/var/cache/yum/x86_64/7/目录下,而不执行
install/upgrade/erase
--downloaddir=<path>, --destdir=<path>  #--downloaddir选项来指定下载的目录,如果不存在
自动创建
yum只下载相关的依赖包,而不安装
#/data/目录如果不存在,会自动创建
[root@centos8 ~]#yum -y install --downloadonly --downloaddir=/data/httpd httpd
[root@centos8 ~]#ls /data/httpd/
yum卸载程序包
yum remove | erase package1 [package2] [...]
yum升级和降级
检查可用升级:
yum check-update
升级和降级
yum upgrade|update [package1] [package2] [...]
yum upgrade-minimal   #最小化升级
yum downgrade package1 [package2] [...] (降级)
yum查询

查看程序包information:

yum info [...]  

查看指定的特性(可以是某文件)是由哪个程序包所提供

yum provides | whatprovides feature1 [feature2] [...]

注意:文件要写全路径,而不只是文件名,否则可能无法查询到(也可以查找未安装的包)
[root@rocky-8 ~]# yum  provides  /etc/passwd

[root@rocky-8 ~]# yum  provides  */passwd


#注意要写文件全路径才能查询到
[root@centos8 ~]#yum provides vsftpd.conf
Last metadata expiration check: 0:56:45 ago on Fri 10 Apr 2020 11:24:00 AM CST.
Error: No Matches found
[root@centos8 ~]# yum provides /etc/vsftpd/vsftpd.conf
Last metadata expiration check: 0:33:13 ago on Fri 27 Dec 2019 03:47:34 PM CST.
vsftpd-3.0.3-28.el8.x86_64 : Very Secure Ftp Daemon
Repo       : AppStream
Matched from:
Filename   : /etc/vsftpd/vsftpd.conf
#使用通配符
[root@centos8 ~]#yum provides */vsftpd.conf
[root@centos8 ~]#yum provides */updatedb*

以指定的关键字搜索程序包名及summary信息

yum search string1 [string2] [...]

查看指定包所依赖的capabilities:

yum deplist package1 [package2] [...]
查看yum事务历史

yum 执行安装卸载命令会记录到相关日志中
日志 文件:

#CentOS 7以前版本日志
/var/log/yum.log
#CentOS 8 版本日志
/var/log/dnf.rpm.log
/var/log/dnf.log
查看包的安全警报

yum updateinfo --summary|–list|–info

apt命令选项示例

dnf 用法与yum一致,建议是用yum 通用性强一点

dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1

yum 和 dnf 失败最主要原因:

yum的配置文件格式或路径错误
解决方法:检查/etc/yum.repos.d/*.repo文件格式
yum cache
解决方法:yum clean all
网络不通:
解决方法:网卡配置

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

41. 简要总结yum/dnf工作原理

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

私有yum仓库(base, epel源)

第一步:yum服务器端需要能上网,然后开启http、https的服务。(apache,nagix等)

第二步:服务器的yum源需要配置好能装软件(epel源等)

yum install httpd

systemctl enable --now httpd

systemctl status httpd #检查服务是否开启

ss -ntl #检查是否开启了80端口

第三步:下载合法rpm和mate元数据到本地yum服务器:工具dnf reposync

   #CentOS 8 dnf 工具集成
dnf reposync --help #查看帮助
#默认只下载rpm包,不下载 meta数据,需要指定--download-metadata 才能下载 meta
dnf reposync  --repoid=REPOID --download-metadata -p /path 
#CentOS 7 以前版本,reposync工具来自于yum-utils包
reposync --repoid=REPOID --download-metadata -p /path
示意:dnf reposync --repoid=epel --download-metadata -p /var/www/html #提供http服务的目录

[root@rocky-8 html]# dnf reposync  --repoid=epel --download-metadata -p /var/www/html
Centos-8 - epel - mirrors.aliyun.com                                      2.3 MB/s |  16 MB     00:06    
上次元数据过期检查:0:00:07 前,执行于 2023年10月11日 星期三 22时48分29秒。
Centos-8 - epel - mirrors.aliyun.com                                      9.8 MB/s |  34 MB     00:03    
(1/9872): 6tunnel-0.13-1.el8.x86_64.rpm                                   113 kB/s |  29 kB     00:00    
(2/9872): 3proxy-0.8.13-1.el8.x86_64.rpm                                  503 kB/s | 175 kB     00:00    
(3/9872): Agda-2.5.3-14.el8.x86_64.rpm                                    391 kB/s |  79 kB     00:00    
(4/9872): AMF-samples-1.4.30-1.el8.noarch.rpm                             2.0 MB/s | 699 kB     00:00    
(5/9872): AMF-devel-1.4.30-1.el8.noarch.rpm                               4.1 MB/s | 3.2 MB     00:00    
(6/9872): AusweisApp2-1.22.3-1.el8.x86_64.rpm                             981 kB/s | 1.0 MB     00:01    
(7/9872): AusweisApp2-data-1.22.3-1.el8.noarch.rpm                        3.9 MB/s | 5.2 MB     00:01    
(8/9872): BackupPC-4.4.0-1.el8.x86_64.rpm                                 953 kB/s | 489 kB     00:00    
(9/9872): BackupPC-XS-0.62-1.el8.x86_64.rpm                               395 kB/s | 107 kB     00:00    
(10/9872): CCfits-2.5-14.el8.x86_64.rpm                                   1.3 MB/s | 226 kB     00:00    
(11/9872): BibTool-2.68-1.el8.x86_64.rpm                                  1.6 MB/s | 613 kB     00:00    
(12/9872): CCfits-devel-2.5-14.el8.x86_64.rpm                             411 kB/s |  97 kB     00:00    
(13/9872): AusweisApp2-doc-1.22.3-1.el8.noarch.rpm                        5.5 MB/s |  11 MB     00:02    
(14/9872): CCfits-doc-2.5-14.el8.noarch.rpm                               988 kB/s | 297 kB     00:00    
(15/9872): CGSI-gSOAP-1.3.11-7.el8.x86_64.rpm                             265 kB/s |  55 kB     00:00    

在这里插入图片描述

第四步:配置客户端的epel源为局域网本服务器

[root@centos7 yum.repos.d]# cat CentOS-Epel.repo
[epel]
name=LAN  Linux $releasever - EPEL
baseurl=http://192.168.44.18/epel/
gpgcheck=0
[root@centos7 yum.repos.d]
[root@centos7 yum.repos.d]# yum repolist  epel -v
Loading "fastestmirror" plugin
Config time: 0.006
Yum version: 3.4.3
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Setting up Package Sacks
pkgsack time: 0.005
Repo-id      : epel
Repo-name    : LAN  Linux 7 - EPEL
Repo-status  : enabled
Repo-revision: 1696990837
Repo-updated : Wed Oct 11 10:21:17 2023
Repo-pkgs    : 9,872
Repo-size    : 17 G
Repo-baseurl : http://192.168.44.18/epel/
Repo-expire  : 21,600 second(s) (last: Wed Oct 11 23:02:34 2023)
  Filter     : read-only:present
Repo-filename: /etc/yum.repos.d/CentOS-Epel.repo
repolist: 9,872
[root@centos7 yum.repos.d]# 

base同理,只是挂载cd或者下载网上的base的rpm和元数据的包

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

1,关闭防火墙。

2,关闭selinux

3,配置网卡为固定地址且网卡名称为eth-0

4,配置yum仓库,epel 和系统源

5,配置ssh服务远程root能登录
ubuntu 需要允许root登录
然后需要给root设置密码

6,安装常见的软件

6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求

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

#!/bin/bash
#
#********************************************************************
#Author:		    MR.lee
#QQ: 			    245388878
#Date: 			    2023-10-12
#FileName:		    httpd_install.sh
#mail: 			    13924531637@139.com
#Description:		The test script
#Copyright (C): 	2023 All rights reserved
#********************************************************************
CPUS=`grep -c processor /proc/cpuinfo`
            

HTTPD_VERSION=2.4.46

URL=http://archive.apache.org/dist/httpd/httpd-$HTTPD_VERSION.tar.gz

INSTALL_DIR=/apps/httpd

COLOR="echo -e \033[32:1m"

END="\033[0m"


disable_firewalld() {
   
   systemctl disable --now firewalld &> /dev/null
 
 }

installapps() {

yum -y install gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2


}

gethttp_src(){

cd /usr/local/src

if [ -e httpd-${HTTPD_VERSION}.tar.gz ];then

    tar xf httpd-${HTTPD_VERSION}.tar.gz

    cd httpd-${HTTPD_VERSION}

  else 

    rpm -q wget || yum -y install wget 

    sleep 5

    wget $URL || { $COLOR "下载失败,请检查网络环境" $END ; exit 20 ; }

    tar xf httpd-${HTTPD_VERSION}.tar.gz
  
    cd httpd-${HTTPD_VERSION}
fi
}

install_httpd() {
  
  ./configure --prefix=${INSTALL_DIR} --enable-ssl --disable-status

  make -j ${CPUS} && make install

  ln -s /apps/httpd/bin/apachectl /usr/local/bin/
  
}

start_httpd(){

  apachectl start && $COLOR"安装成功!"$END
  

  $COLOR"请访问:http://`hostname -I`"$END

}


disable_firewalld

installapps

gethttp_src

install_httpd

start_httpd


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

OSI模型,

即开放式通信系统互联参考模型,是国际标准化组织提出的一个试图是各种计算机或者通信系统在世界范围内互联为网络的标准框架。整个模型分为七层,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

每层作用

第7层 应用层
应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如:
HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等

第6层 表示层
主条目:表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式

第5层 会话层
会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

第4层 传输层
传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议
等发送信息。例如:传输控制协议(TCP)等。

第3层 网络层
网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。
网络表头包含了网络数据。例如:互联网协议(IP)等。

第2层 数据链接层
数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形
成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表
尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务
(GPRS)等。分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media
access control,MAC)子层

第1层 物理层
物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网
络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、主机接口卡等

在这里插入图片描述

对应的协议

在这里插入图片描述

7.调整动态端口范围为20000-60000

端口的作用:传输层通过port号,确定应用层协议,范围0-65535

IANA互联网数字分配机构负责域名,数字资源,协议分配如下:

0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用,
22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,

1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)

49152-65535:动态或私有端口,客户端随机使用端口,范围定义:/proc/sys/net/ipv4/ip_local_port_range

调整动态端口的意义:

猜测:预留部分端口给特定额程序使用。
:减少端口的使用。

[root@centos7 ~]# 
[root@centos7 ~]# 
[root@centos7 ~]# cat !*
cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999
[root@centos7 ~]# echo 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos7 ~]# 
[root@centos7 ~]# cat !*
cat 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range
cat: 20000: No such file or directory
cat: 62000: No such file or directory
[root@centos7 ~]# cat  /proc/sys/net/ipv4/ip_local_port_range
20000	62000
[root@centos7 ~]# 

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

TCP包头结构:

在这里插入图片描述
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口
某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通
信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536

序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字
节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0
开始

确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:
我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号

数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要
指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多
远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是
TCP首部最大60字节

URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只
有当URG=1时才有效

ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规
定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段

PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如
果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到
的数据读走,就会一直停留在TCP接收缓冲区中

RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放
连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志
的TCP报文段称为复位报文段

SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报
文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意
建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段

FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的
数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方
发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value *
Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值

校验和:提供额外的可靠性

紧急指针:标记紧急数据在数据字段中的位置

选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:
(2^4-1)*4-20=40字节
在这里插入图片描述

TCP三次握手

在这里插入图片描述

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

TCP4次挥手

在这里插入图片描述

当客户端没有数据再需要发送给服务端时,就需要释放客户端的连接,这整个过程为:

客户端发送一个报文给服务端(没有数据),其中FIN设置为1,Sequence Number置为u,客户端进入FIN_WAIT_1状态;

服务端收到来自客户端的请求,发送一个ACK给客户端,Acknowledge置为u+1,同时发送Sequence Number为v,服务端年进入CLOSE_WAIT状态;

服务端发送一个FIN给客户端,ACK置为1,Sequence置为w,Acknowledge置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;

客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态。

9 . 总结主机到主机的包传递过程。

七层模型:

物数网传会表应

TCP/IP层模型:
物(数)网传应

发送方封包顺序:封装数据内容—封装表示层头部-----封装会话层头部—封装传输层协议头部(TCP/UDP)-----封装网络层ip头部()
–封装数据链路层头部(MAC)— 物理层比特流。
在这里插入图片描述

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

IP地址组成

它们可唯一标识 IP 网络中的每台设备 ,每台主机(计算机、网络设备、外围设备)必须具有唯一的地
址IP地址由两部分组成

网络 ID:标识网络,每个网段分配一个网络ID,处于高位

主机 ID:标识单个主机,由组织分配给各设备,处于低位

IPv4地址格式:点分十进制记法

IP地址分类

在这里插入图片描述

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

公共和私有IP地址

私有IP地址:不直接用于互联网,通常在局域网中使用
在这里插入图片描述
公共IP地址:互联网上设备拥有的唯一地址
在这里插入图片描述

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

首先看掩码为18位,那么网络数为 32-18=14位

网络数:2^18=262144

每个网络中的主机数:2^14 -2= 16382

子网掩码:255.255.192.0
掩码18位的就是18个1: 1 1 1 1 1 1 1 1 ; 1 1 1 1 1 1 1 1 ; 1 1 0 0 0 0 0 0;00000000
对应的二进制数: 128,64,32,16,8,4,2 ,1 . 128,64,32,16,8,4,2 1 . 128,64,32,16,8,4,2,1 .0
掩码为1的相加就为掩码:255.255.192.0

12. 当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?

A根据IP和掩码判断在同一个网段,数据包能发送出去

A的网段10.0. 0.0 255.255.0.0

B的网段 10.0.2.0 255.255.255.0

B根据IP和掩码判断不在同一个网段,数据不接受。

A和B不在一个网段,不能通信。

13、 如何将10.0.0.0/8划分32个子网?

首先确定借多少主机位的,及2的多少次方大于等于32。即 2^5次方等于32 ,那么需要向主机位借5位用于网络号。
那么子网络号的掩码为:8+5=13

求每个子网的掩码,主机数。

掩码13位的就是13个1: 1 1 1 1 1 1 1 1 ; 1 1 1 1 1 0 0 0 ; 0;0
对应的二进制数: 128,64,32,16,8,4,2 ,1 . 128,64,32,16,8,4,2 1 . 10,0.0
掩码为1的相加就为掩码:255.255-7.0.0 =255.248.0.0

主机数为:2^(32-13) -2
= 2^19 -2=524286

14. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。

ifconfig工具

来自net-tools包,被ip工具代替,建议使用ip工具

[root@centos8 ~]#ifconfig eth0 10.0.0.68 netmask 255.255.0.0
#清除eth0上面的IP地址
[root@centos8 ~]#ifconfig eth0 0.0.0.0
#启用和禁用网卡
[root@centos8 ~]#ifconfig eth0 down
[root@centos8 ~]#ifconfig eth0 up
#对一个网卡设置多个IP地址
[root@centos8 ~]#ifconfig eth0:1 172.16.0.8/24
[root@centos8 ~]#ifconfig

ip工具
ip link show                     # 显示网络接口信息
ip link set eth0 up             # 开启网卡
ip link set eth0 down            # 关闭网卡
ip link set eth0 promisc on      # 开启网卡的混合模式
ip link set eth0 promisc offi    # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400        # 设置网卡最大传输单元
ip addr show     # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址

ip route show # 显示系统路由
ip route add default via 192.168.1.254   # 设置系统默认路由
ip route list                 # 查看路由信息
ip route add 192.168.4.0/24  via  192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via  192.168.0.254  dev eth0        # 设置默认网关为192.168.0.254
ip route del 192.168.4.0/24   # 删除192.168.4.0网段的网关
ip route del default          # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由
[root@centos7 ~]# ip address add 10.0.0.88/24 dev eth0
[root@centos7 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:d0:16:c8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.44.8/24 brd 192.168.44.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.88/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fed0:16c8/64 scope link 
       valid_lft forever preferred_lft forever
[root@centos7 ~]# ip route 
default via 192.168.44.2 dev eth0 proto static metric 100 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.88 
192.168.44.0/24 dev eth0 proto kernel scope link src 192.168.44.8 metric 100 

15. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。

/etc/sysconfig/network-scripts/ifcfg-eth0其中ifcfg-eth0 文件理论上随便写,习惯写成ifcfg-网卡名称:

NAME=eth0
DEVICE=eth0
BOOTPROTO=dhcp|static|none
IPADDR=10.0.0.100
PREFIX=24 OR NETMASK=255.255.255.0
GATEWAY=

能上网的必须的配置(DHCP):
DEVICE=eth0
NAME=eth0
BOOTPROTO=dhcp

能上网的必须的配置(static):
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=192.168.44.8
NETMASK=255.255.255.0
GATEWAY=192.168.44.2
DNS1=114.114.114.114

配置完成后:
#生效
CentOS6
service network restart
CentOS7
systemctl restart network
CentOS8和rocky
nmcli connnection reload
nmcli connnettion up eth0

常用参数:
在这里插入图片描述

16. 基于配置文件或命令完成bond0配置

bond聚合链路模式共7种模式:0-6 Mode

mod=0 ,即:(balance-rr) Round-robin policy(轮询)聚合口数据报文按包轮询从物理接口转
发。
负载均衡—所有链路处于负载均衡状态,轮询方式往每条链路发送报文这模式的特点增加了带宽,
同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。
性能问题—一个连接或者会话的数据包如果从不同的接口发出的话,中途再经过不同的链路,在客
户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络
的吞吐量就会下降。Bond0在大压力的网络传输下,性能增长的并不是很理想。
需要交换机进行端口绑定

mod=1,即: (active-backup) Active-backup policy(主-备份策略)只有Active状态的物理接口
才转发数据报文。
容错能力—只有一个slave是激活的(active)。也就是说同一时刻只有一个网卡处于工作状态,其他
的slave都处于备份状态,只有在当前激活的slave故障后才有可能会变为激活的(active)。
无负载均衡—此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个
接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N。

mod=2,即:(balance-xor) XOR policy(平衡策略)聚合口数据报文按源目MAC、源目IP、源目
端口进行异或HASH运算得到一个值,根据该值查找接口转发数据报文
负载均衡—基于指定的传输HASH策略传输数据包。
容错能力—这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常
的链路上。
性能问题—该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。既然目的地
是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有流量是通过
单个路由器,由于只有一个网关,源和目标mac都固定了,那么这个算法算出的线路就一直是同一
条,那么这种模式就没有多少意义了。
需要交换机配置为port channel

mod=3,即:broadcast(广播策略)这种模式的特点是一个报文会复制两份往bond下的两个接
口分别发送出去,
当有对端交换机失效,感觉不到任何downtime,但此法过于浪费资源;不过这种模式有很好的容
错机制。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。

mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)
在动态聚合模式下,聚合组内的成员端口上均启用LACP(链路汇聚控制协议)协议,其端口状态
通过该协议自动进行维护。
负载均衡—基于指定的传输HASH策略传输数据包。默认算法与blance-xor一样。
容错能力—这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常
的链路上。对比blance-xor,这种模式定期发送LACPDU报文维护链路聚合状态,保证链路质量。
需要交换机支持LACP协议

mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
在每个物理接口上根据当前的负载(根据速度计算)分配外出流量。如果正在接收数据的物理接口
口出故障了,另一个物理接口接管该故障物理口的MAC地址。
需要ethtool支持获取每个slave的速率。

mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡,而且不需要任何
switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应
答,并把源硬件地址改写为bond中某个物理接口的唯一硬件地址,从而使得不同的对端使用不同
的硬件地址进行通信。

mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会
发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只
占了小部分流量

配置思路,将2个物理网卡绑定在一个虚拟网卡上面,类似与路由器的vrrp。
配置:

[root@rocky-8 network-scripts]# ll
总用量 12
-rw-r--r-- 1 root root 216 1015 20:22 ifcfg-bond0
-rw-r--r-- 1 root root  71 1015 17:17 ifcfg-eth0
-rw-r--r-- 1 root root  71 1015 17:18 ifcfg-eth1
[root@rocky-8 network-scripts]# cat ifcfg-bond0 
/etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
GETEWAY=192.168.44.2
IPADDR=192.168.44.100
DNS1=114.114.114.114
PREFIX=24
BONDING_OPTS="mode=1 miimon=100  fail_over_mac=1"
[root@rocky-8 network-scripts]# cat ifcfg-eth0
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
[root@rocky-8 network-scripts]# cat ifcfg-eth1
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

[root@rocky-8 network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:da:9e:ea
Slave queue ID: 0

Slave Interface: eth0
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:da:9e:e0
Slave queue ID: 0
[root@rocky-8 network-scripts]# 

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

[root@rocky-8 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.44.18  netmask 255.255.255.0  broadcast 192.168.44.255
        inet6 fe80::20c:29ff:feda:9ee0  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:da:9e:e0  txqueuelen 1000  (Ethernet)
        RX packets 12291  bytes 17439314 (16.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5039  bytes 300254 (293.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

用命名取:

[root@rocky-8 ~]# ifconfig |grep netmask |grep -v 127  |tr -s " " |cut -d " " -f3
192.168.44.18

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

#!/bin/bash
#
#********************************************************************
#Author:            MR.lee
#QQ:                245388878
#Date:              2023-10-15
#FileName:         network-status.sh
#mail:              13924531637@139.com
#Description:      The test script
#Copyright (C):     2023 All rights reserved
#********************************************************************
NET=192.168.44.

netscan() {
for i in {1..255};do
     { if ping -c2 -W1  $NET$i &> /dev/null ;then
       echo "$NET$i is up"  
    else
      echo "$NET$i is down" &> /dev/null 
     fi
      }&
    done
}

netscan

wait

19. 使用while read line和/etc/passwd,计算用户id总和。

[root@rocky-8 jiaoben]# bash sum+id.sh
184890
#!/bin/bash
# 
#********************************************************************
#Author:            MR.lee
#QQ:                245388878
#Date:              2023-10-15
#FileName:         sum+id.sh
#mail:              13924531637@139.com
#Description:      The test script
#Copyright (C):     2023 All rights reserved
#********************************************************************
sum=0

while read line;do

   linenu=`echo $line | cut -d : -f3`

    let sum+=linenu

done < /etc/passwd

echo $sum

[root@rocky-8 ~]# cat /etc/passwd  |cut -d:  -f3  | paste -s
0	1	2	3	4	5	6	7	8	11	12	14	65534	81999	193	59	998	997	996	74	1000	1001	1002	1003	1004	1005	1006	1007	1008	1009	1010	1011	1012	1013	1014	1015	1016	1017	1018	1019	1020	1021	1022	1023	1024	1025	1026	1027	1028	1029	1030	1031	1032	1033	1034	1035	1036	1037	1038	1039	1040	1041	1042	1043	1044	1045	1046	1047	1048	1049	1050	1051	1052	1053	1054	1055	1056	1057	1058	1059	1060	1061	1062	1063	1064	1065	1066	1067	1068	1069	1070	1071	1072	1073	1074	1075	1076	1077	1078	1079	1080	1081	1082	1083	1084	1085	1086	1087	1088	1089	1090	1091	1092	1093	1094	1095	1096	1097	1098	1099	1100	1101	1102	1103	1104	1105	1106	1107	1108
[root@rocky-8 ~]# cat /etc/passwd  |cut -d:  -f3  | paste -s -d+
0+1+2+3+4+5+6+7+8+11+12+14+65534+81+999+193+59+998+997+996+74+1000+1001+1002+1003+1004+1005+1006+1007+1008+1009+1010+1011+1012+1013+1014+1015+1016+1017+1018+1019+1020+1021+1022+1023+1024+1025+1026+1027+1028+1029+1030+1031+1032+1033+1034+1035+1036+1037+1038+1039+1040+1041+1042+1043+1044+1045+1046+1047+1048+1049+1050+1051+1052+1053+1054+1055+1056+1057+1058+1059+1060+1061+1062+1063+1064+1065+1066+1067+1068+1069+1070+1071+1072+1073+1074+1075+1076+1077+1078+1079+1080+1081+1082+1083+1084+1085+1086+1087+1088+1089+1090+1091+1092+1093+1094+1095+1096+1097+1098+1099+1100+1101+1102+1103+1104+1105+1106+1107+1108
[root@rocky-8 ~]# cat /etc/passwd  |cut -d:  -f3  | paste -s -d+ |bc
184890
[root@rocky-8 ~]# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值