第三周作业
1. 磁盘存储术语总结和理解.
存储设备类型
HDD(Hard Disk Drive)
传统机械硬盘,通过旋转磁盘和磁头读写数据,速度较慢但容量大、成本低。
特点与结构:由盘片、磁头、主轴电机等组成,通过磁记录存储数据;容量大(TB级)、成本低,但读写速度较慢(50-150MB/s),易受物理震动影响
SSD(Solid State Drive)
固态硬盘,基于闪存芯片,无机械部件,读写速度快、抗震性强,但价格较高。
特点与结构:基于NAND闪存芯片,无机械部件;读写速度快(500MB/s+)、抗震性强,但寿命受擦写次数限制(通常5-10年);
NVMe(Non-Volatile Memory Express)
一种高性能存储协议,专为 SSD 设计,通过 PCIe 接口实现超高速数据传输。
特点:通过PCIe接口直接与CPU通信,速度远超SATA SSD(可达数GB/s),延迟更低。
磁盘设备的设备文件命名
| 设备类型 | 设备文件命名 |
|---|---|
| SAS,SATA,SCSI,IDE,USB | /dev/sda; /dev/sdb; /dev/sdc; ..... |
| nvme协议硬盘 | /dev/nvme0n1; /dev/nvme0n2; /dev/nvme0n3; ..... |
| 虚拟磁盘(虚拟环境下) | /dev/vda; /dev/vdb; /dev/xvda; /dev/xvdb; .... |
存储介质单位
盘片(Platter):磁性存储介质,HDD中数据存储的物理载体。
磁道(Track):盘片上的同心圆,由磁头定位读写。
扇区(Sector):磁道的分段(通常512字节或4KB),数据存储的最小单位。
柱面(Cylinder):多个盘片同一半径的磁道集合,是分区的最小单位
2. 总结MBR,GPT结构区别。
MBR:主引导记录,最多4个主分区,单分区≤2TB,兼容旧系统
GPT:GUID分区表,支持128个分区,单分区≤9.4ZB,需UEFI启动
MBR 结构:
- 引导代码:负责加载操作系统(如 BIOS 启动流程)。
- 分区表:4 个 16 字节条目,记录分区类型、起始 / 结束扇区、状态(激活标志)等。
- 签名:2 字节(0x55AA),用于验证 MBR 有效性
GPT 结构
- GPT 头(PMBR):位于 LBA 1,包含分区表的位置、大小、校验和、分区条目数等元数据。
- 分区表条目:每个条目包含分区 GUID、起始 / 结束 LBA、属性(如只读、启动分区)、分区名称等。
- CRC 校验:对 GPT 头和分区表进行循环冗余校验(CRC32),检测数据损坏。
| 特性 | MBR | GPT |
|---|---|---|
| 分区数量限制 | 4 个主分区(或 3+1 扩展分区) | 理论无限制(如 Windows 支持 128 个) |
| 最大分区大小 | 2TB | 128EB+ |
| 引导方式 | BIOS/Legacy 引导 | UEFI 引导 |
| 分区表位置与备份 | 单扇区,无备份 | 前后双备份,含保护性 MBR |
| 校验机制 | 无 | CRC32 校验 |
| 64 位系统支持 | 有限(启动盘需传统 BIOS) | 完全支持(推荐 UEFI+GPT 组合) |
| 现代大容量磁盘支持 | 不支持(>2TB 需拆分) | 原生支持 |
| 数据可靠性 | 低(单扇区易损) | 高(冗余 + 校验) |
3. 总结学过的分区,文件系统管理。
分区的实现方式
- MBR
- 特点:支持最多 4 个主分区(或 3 个主分区 + 1 个扩展分区,扩展分区内可创建多个逻辑分区);最大支持 2TB 磁盘;包含启动引导程序和分区信息。
- 适用场景:传统 BIOS 启动;磁盘容量 ≤ 2TB。
- GPT
- 特点:支持最多 128 个主分区;无磁盘容量上限(理论支持 9.4ZB);无扩展分区概念;内置冗余分区表,可靠性更高。
- 适用场景:UEFI 启动;大容量磁盘(>2TB);需要更多分区的场景。
分区类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 主分区 | 最多4个,直接存储数据,可安装系统 | 系统盘、独立应用环境 |
| 扩展分区 | 特殊主分区,作为逻辑分区的容器 | 多系统引导、复杂存储 |
| 逻辑分区 | 存在于扩展分区内,无数量限制 | 数据分类存储 |
主流文件系统
| 文件系统 | 最大容量 | 单文件限制 | 特性 | 适用场景 |
|---|---|---|---|---|
| FAT32 | 2TB | 4GB | 兼容性强,无日志功能 | U盘、旧设备 |
| NTFS | 16EB | 16EB | 支持权限控制、加密、日志恢复 | Windows系统盘 |
| ext4 | 1EB | 16TB | 日志功能、支持大文件、延迟分配 | Linux通用存储 |
| XFS | 8EB | 8EB | 高性能、支持在线扩展、快速修复 | 企业级服务器 |
| Btrfs | 16EB | 16EB | 快照、数据校验、压缩、RAID内置 | 数据备份与容灾 |
| ZFS | 16EB | 16EB | 数据完整性校验、去重、卷管理 | 企业存储集群 |
分区工具
fdisk:适用于MBR分区,命令行工具,支持创建/删除主分区和扩展分区
fdisk /dev/sdb # 进入交互模式
n # 新建分区
p # 主分区
+10G # 分配10GB空间
w # 保存并退出
fdisk -l /dev/sdb # 查看分区详情
parted:支持GPT分区,功能更强大,支持LVM和文件系统格式化。
parted /dev/sdc
mklabel gpt # 创建GPT分区表
mkpart primary ext4 0% 50% # 创建50%空间的主分区
parted /dev/sda mkpart primary ext4 0% 100% # 创建全部分区
LVM:支持动态调整分区大小,跨越多块物理磁盘,适合复杂存储需求
pvcreate /dev/sdb1 # 创建物理卷
vgcreate vg_data /dev/sdb1 # 创建卷组
lvcreate -L 10G -n lv_data vg_data # 创建逻辑卷
mkfs.ext4 /dev/vg_data/lv_data # 格式化
格式化
mkfs命令
命令格式
mkfs [options] [-t <type>] [fs-options] <device> [<size>]
常用选项-t|--type=model
| 选项 | 作用 | 示例 |
|---|---|---|
-t |
指定文件系统类型(如ext4、xfs) | mkfs -t ext4 /dev/sdb1 |
-c |
坏块检测(需额外时间) | mkfs -c /dev/sdb1 |
-L |
设置卷标(最大16字符) | mkfs -L data /dev/sdb1 |
-b |
定义块大小(单位:字节) | mkfs -b 4096 /dev/sdb1 |
-m |
保留空间比例(默认5%) | mkfs -m 2 /dev/sdb1 |
例如
mkfs.ext4 /dev/sdb1 # ext4格式
mkfs.xfs /dev/sdb1 # XFS格式
查询工具
blkid
命令格式:
blkid [OPTION]...[DEVICE]
常用选项:
-U UUTD #根据指定的UUID来查找对应的设备
-L LABEL #根据指定的LABEL来查找对应的设备
例如:
blkid -o list # 列表格式显示所有设备信息
blkid -U 123e4567 # 查找指定 UUID 的设备路径
blkid -s LABEL -o value /dev/sdb1 # 仅输出标签值
findfs
命令格式:
findfs [options] {LABEL,UUID,PARTUUID,PARTLABEL}=<value>
常用选项-l #查看指定文件系统信息
其他选项
-L LABEL #修改卷标
-m N #修预留给管理员的空间百分比
-j #将ext2升级为ext3
-O #文件系统属性启用或禁用, -O
例如:
findfs -u 123e4567 # 返回 UUID 对应的设备路径
findfs -l DATA_DISK # 查找标签为 DATA_DISK 的设备
findfs -t xfs # 列出所有 XFS 文件系统的设备
挂载
mount命令
命令格式:
mount [-t 文件系统类型] [-o 特殊选项] 源文件系统 目标挂载点
常见选项
-a:挂载/etc/fstab文件中列出的所有文件系统。
-t:指定文件系统类型,如ext4、ntfs、iso9660等。
-o:指定挂载选项,如读写权限、访问控制等。-l:列出系统中当前挂载的所有文件系统
源文件系统:要挂载的设备文件的路径或设备标识符。
目标挂载点:将文件系统挂载到的目录。- 注意:挂载点目录必须事先存在,建议使用空目录
挂载文件
mount -o loop /simple.img /disk/file
loop设备的挂载查看 -- 前提是能够看到loop设备
losetup -a
例如
mkdir /mnt/data # 创建挂载点
mount /dev/sdb1 /mnt/data # 挂载
开机自动挂载
vim /etc/fstab
# 格式:设备标识 挂载点 文件系统类型 挂载选项 转储频率 启动检查顺序
UUID=1234abcd /data ext4 defaults,noatime 0 2
LABEL=MYDRIVE /mnt/usb vfat umask=0022 0 0
卸载命令
命令格式:
umount [-f] [-l] [-n] 挂载点
常见选项:-f:强制卸载。-l:延迟卸载,直到文件系统不再被使用。-n:不将卸载操作写入系统日志。
注意:
卸载时,可使用设备,也可以使用挂载点
指定设备名进行卸载
[root@rocky9 ~]# umount /dev/sdb1
检测效果
[root@rocky9 ~]# lsblk -f /dev/sdb1
NAME FSTYPE FSVER LABEL UUID
MOUNTPOINTS
sdb1 ext4 1.0
d6fb6069-4dfe-401a-b829-77f43eda32c6
指定挂载点进行卸载
[root@rocky9 ~]# umount /mount/xfs
检测效果
[root@rocky9 ~]# lsblk -f /dev/nvme0n1p2
NAME
FSTYPE FSVER LABEL UUID
MOUNTPOINTS
nvme0n1p2 xfs
FSAVAIL FSUSE%
FSAVAIL FSUSE%
c8dd6954-1b4b-4f9f-a187-a9a27452be84
查看文件系统挂载信息
查看磁盘格式化的文件系统信息
lsblk -f 磁盘设备名
例如:
lsblk -f /dev/sda
输出样式
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 1234-5678-9abc-def0 /boot
└─sda2 xfs 5678-1234-9abc-def0 /
查看所有已挂载的文件系统信息
df 或者 df -Th
例如:
df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 50G 20G 28G 42% /boot
/dev/sda2 xfs 200G 50G 150G 25% /
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
查看已挂载的所有文件系统
mount
例如:
mount | grep "^/dev"
输出样式:
/dev/sda1 on /boot type ext4 (rw,relatime)
/dev/sda2 on / type xfs (rw,relatime)
查看挂载点的状态
findmnt <磁盘设备名> <挂载点>
例如:
findmnt /mnt/data
输出样式
TARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/sdb1 xfs rw,relatime
4. 总结raid 0, 1, 5, 10, 01的工作原理。总结各自的利用率,冗余性,性能,至少几个硬盘实现。
RAID 0
- 工作原理 :采用条带化技术,将数据分割成若干小块,并均匀分布存储在多个磁盘上,多个磁盘并行工作,提升数据传输速度。
- 利用率 :100%,所有磁盘容量都可用于存储数据。
- 冗余性 :无冗余,任何一块硬盘故障,整个阵列数据都会丢失。
- 性能 :读写性能出色,特别是对于大文件的读写,能显著提高 I/O 吞吐量。
- 至少硬盘数 :2 块。
RAID 1
- 工作原理 :基于数据镜像,数据同时写入两块或更多硬盘,每块硬盘都有完整的数据副本。
- 利用率 :50%,因为数据被完全镜像备份,可用空间为总磁盘容量的一半。
- 冗余性 :冗余性高,若一块硬盘故障,可从另一块正常硬盘读取数据,确保数据安全。
- 性能 :读取速度较快,可从任意硬盘读取;写入速度较慢,因数据需同时写入多块硬盘。
- 至少硬盘数 :2 块。
RAID 5
- 工作原理 :结合条带化和分布式奇偶校验,数据和奇偶校验信息交错存储在所有磁盘上,硬盘至少 3 块。当一块硬盘故障时,可依奇偶校验信息重建数据。
- 利用率 :(n-1)/n,n 为磁盘总数,如 4 块盘时利用率为 75%。
- 冗余性 :具备一定冗余性,允许一块硬盘故障而不丢失数据,但若有两块硬盘故障,数据将丢失。
- 性能 :读性能优秀,可并行读取多盘;写性能因奇偶校验计算略受影响。
- 至少硬盘数 :3 块。
RAID 10
- 工作原理 :先镜像后条带化,将硬盘分成两组做 RAID 1 镜像,再在镜像组间做 RAID 0 条带化。
- 利用率 :50%,因数据需镜像存储于两组硬盘。
- 冗余性 :冗余性高,允许同一组内一块硬盘故障,数据仍可从镜像盘读取。
- 性能 :读写性能优异,结合了 RAID 0 的高性能和 RAID 1 的高可靠性。
- 至少硬盘数 :4 块。
RAID 01
- 工作原理 :先条带化后镜像,先创建多个 RAID 0 条带卷,再对这些条带卷做 RAID 1 镜像。
- 利用率 :50%。
- 冗余性 :冗余性较好,一个镜像盘损坏,数据不丢失。
- 性能 :读写性能良好,但相比 RAID 10,其容错能力略逊一筹,若两个条带中的硬盘同时出现故障,可能会丢失数据。
- 至少硬盘数 :4 块。
5. 总结LVM的基本原理,完成实验对LVM的创建和磁盘扩容。
LVM 基本原理与实验操作总结
一、LVM 核心原理
LVM(Logical Volume Manager)通过抽象层实现存储资源的动态管理,其核心组件与工作原理如下:
- 物理卷(PV)
- 定义:原始磁盘或分区(需初始化为 LVM 格式),存储底层物理数据。
- 特点:固定大小,作为卷组的构建基础。
- 卷组(VG)
- 定义:由多个 PV 组成的存储池,提供逻辑上的统一存储空间。
- 特点:支持动态添加/移除 PV,实现存储扩容或缩容。
- 逻辑卷(LV)
- 定义:从 VG 中划分的虚拟存储单元,可格式化为文件系统并挂载使用。
- 特点:支持在线扩容、缩容及快照功能。
- 物理区域(PE)与逻辑区域(LE)
- PE:PV 中的最小分配单元(默认 4MB),VG 的存储容量由 PE 总数决定。
- LE:LV 中的最小分配单元,与 PE 大小一致,实现 PV 到 LV 的动态映射。
二、LVM实验操作
实验环境:3 块新磁盘分区:`/dev/sdb1`、`/dev/sdc1`、`/dev/sdd1`
1.创建物理卷(PV)
[root@rocky-12 ~]#pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1 # 初始化物理卷
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
[root@rocky-12 ~]#pvdisplay # 查看 PV 信息(确认 PE 大小和总容量)
2.创建卷组(VG)
[root@rocky-12 ~]#vgcreate myvg /dev/sdb1 /dev/sdc1 /dev/sdd1 # 聚合 PV 为卷组
Volume group "myvg" successfully created
[root@rocky-12 ~]#vgdisplay myvg # 查看 VG 信息(Free PE/Size)
3.创建逻辑卷(LV)
[root@rocky-12 ~]#lvcreate -L 20G -n mylv myvg # 从 VG 中划分 20GB 逻辑卷
Logical volume "mylv" created.
[root@rocky-12 ~]#lvdisplay /dev/myvg/mylv # 查看 LV 信息(LV Size 和 UUID)
4.格式化与挂载
[root@rocky-12 ~]#mkfs.xfs /dev/myvg/mylv # 格式化为 XFS 文件系统
meta-data=/dev/myvg/mylv isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@rocky-12 ~]#mkdir /mnt/mylv # 创建挂载点
[root@rocky-12 ~]#mount /dev/myvg/mylv /mnt/mylv # 临时挂载
echo "/dev/myvg/mylv /mnt/mylv xfs defaults 0 0" >> /etc/fstab # 开机自动挂载
5.磁盘扩容
# 步骤 1: 添加新磁盘分区(假设新磁盘为 /dev/sde)
[root@rocky-12 ~]#fdisk /dev/sde # 创建新分区(类型 8e)
[root@rocky-12 ~]#pvcreate /dev/sde # 初始化为 PV
# 步骤 2: 扩展卷组
[root@rocky-12 ~]#vgextend myvg /dev/sde # 将新 PV 加入卷组
# 步骤 3: 扩展逻辑卷
[root@rocky-12 ~]#lvextend -L +10G /dev/myvg/mylv # 增加 10GB 空间
[root@rocky-12 ~]#xfs_growfs /mnt/mylv # 调整 XFS 文件系统(ext4 使用 resize2fs)
# 步骤 4: 验证扩容
[root@rocky-12 ~]#df -h /mnt/mylv # 查看容量变化
6. 总结变量命名规则,不同类型变量(环境变量,位置变量,只读变量,局部变量,状态变量)如何使用。
一、变量命名规则
基本规则
1.由字母(a-z/A-Z)、数字(0-9)和下划线(_)组成,不能以数字开头。
2.区分大小写(如 Var 和 var 是不同变量)。
3.避免使用系统保留字(如 if, else, for 等关键字)。
4.名称只能包含字母、数字和下划线,禁止空格或特殊字符
命名规范
1.见名知义:如 USER_NAME、FILE_PATH,便于理解变量用途。
2.环境变量、系统变量:通常用 全大写字母 + 下划线(如 PATH、HOME)。
3.自定义变量:建议用有意义的小写或驼峰命名(如 file_name、userAge,Shell 中无强制要求,但遵循惯例)。
4.驼峰命名法:如studentName(局部变量、方法参数)。
5.帕斯卡命名法:如StudentInfo(类名、全局变量)。
6.全大写加下划线:如MAX_COUNT(常量)。
7.匈牙利命名法:类型前缀+描述(如strUserName,适用于Windows环境)
环境变量
定义:用于跨进程传递信息,可被子进程继承。
命名规则:全大写字母 + 下划线(如 MY_ENV_VAR),避免与系统变量冲突(如 PATH、LANG)
常见的环境变量有:
PATH:决定了 Shell 将到哪些目录中寻找命令或程序。
HOME:当前用户的主目录。
HISTSIZE:历史记录数。
LOGNAME:当前用户的登录名。
HOSTNAME:主机的名称。
SHELL:当前用户的 Shell 类型。
LANG:语言相关的环境变量。
MAIL:当前用户的邮件存放目录。
PWD:当前目录
# 声明并赋值
export MY_ENV_VAR="value" # 或直接 MY_ENV_VAR="value"; export MY_ENV_VAR
# 仅声明(后续赋值)
export MY_ENV_VAR
MY_ENV_VAR="value"
echo $MY_ENV_VAR # 输出:value
位置变量
位置参数变量使用$n的形式,其中n为数字。以下是一些常见的位置参数变量:
$0:表示脚本本身的名称。
$1到$9:表示第1到第9个参数。
${10}及以上:表示第10个及以上的参数,需要用大括号括起来。
$@:表示命令行中的所有参数,每个参数被区别对待。
$*:表示命令行中的所有参数,所有参数视为一个整体。
$#:表示参数的总个数。
$$:表示脚本运行的当前进程ID号。
例如
# 脚本 test.sh
echo "脚本名:$0"
echo "第一个参数:$1"
echo "参数个数:$#"
# 执行脚本
./test.sh hello world # 输出:脚本名:./test.sh,第一个参数:hello,参数个数:2
只读变量
定义方式
Shell:readonly MY_CONSTANT="value"或declare -r MY_CONSTANT="value"。
其他语言:如Java用final、Python用全大写命名约定。
限制:不可修改,否则报错(如readonly variable cannot be assigned)
局部变量
定义:仅在当前作用域(如函数内部)有效,外部不可访问。
声明:在函数内部用 local 关键字(Shell 脚本中,未声明的变量默认全局有效,需显式用 local 限制作用域)。
my_function() {
local LOCAL_VAR="inside function" # 局部变量
echo $LOCAL_VAR # 输出:inside function
}
my_function
echo $LOCAL_VAR # 输出:空(外部不可访问)
状态变量
四大特殊状态变量:$?、 $$、 $!、 $_
$?的作用是:获取执行上一个指令的执行状态返回值,返回0表示上一个命令或者程序执行成功,返回的值为非0则表示上一个命令执行失败。
$$的作用是:获取当前执行的shell脚本的进程号PID。
$!的作用是:获取上一个后台工作的进程的进程号PID。
$_的作用是:获取在此之前执行的命令或脚本的最后一个参数。
7. 编写一个脚本猜数字,使用判断提示用户比目标数字是大还是小
#!/bin/bash
guess=0
attem=0
max_attem=10
number=$((RANDOM % 100 + 1 ))
while((attem < max_attem));do
read -p "请输入你猜的数字:" guess
((attem++))
if ((guess < number));then
echo "太小了"
elif ((guess > number));then
echo "太大了"
elif ((guess == number));then
echo "回答正确"
echo "共回答 $attem 次"
exit 0
else
echo "格式错误"
fi
done
echo "共回答 $attem 次"
root@ubuntu-13:~# ./test.sh
请输入你猜的数字:50
太大了
请输入你猜的数字:25
太小了
请输入你猜的数字:30
太小了
请输入你猜的数字:35
太大了
请输入你猜的数字:32
太小了
请输入你猜的数字:33
回答正确
共回答 6 次
8. 总结TCP包头结构,TCP三次握手,4次挥手。
TCP包头结构

TCP包头结构(固定部分20字节 + 选项)
1.源端口(Source Port)
长度:16位(2字节)
作用:标识发送方的应用程序端口号。
示例:HTTP服务通常使用80端口。
2.目的端口(Destination Port)
长度:16位(2字节)
作用:标识接收方的应用程序端口号。
3.序列号(Sequence Number)
长度:32位(4字节)
作用:标识数据段的第一个字节的序号,用于数据重组和确认机制。
示例:建立连接时,初始序列号(ISN)随机生成。
4.确认号(Acknowledgment Number)
长度:32位(4字节)
作用:当ACK标志置1时有效,表示接收方期望收到的下一个字节的序号。
规则:确认号 = 收到的序列号 + 数据长度 + 1。
5.数据偏移(Data Offset)
长度:4位
作用:指示TCP头部长度(以4字节为单位),最小值为5(20字节),最大值为15(60字节)。
6.保留(Reserved)
长度:4位(原RFC 793为6位,部分位被后续扩展占用)
作用:保留未使用,通常置0。部分位被用于扩展功能(如ECN)。
7.控制标志(Control Flags)
长度:8位(原RFC 793为6位,扩展后新增CWR和ECE)
作用:控制连接状态和数据传输行为。各标志位如下:
URG(紧急指针有效):指示紧急数据需优先处理。
ACK(确认号有效):表示确认号字段有效。
PSH(推送数据):要求接收方立即将数据提交应用层。
RST(重置连接):强制终止异常连接。
SYN(同步序列号):发起连接请求。
FIN(结束连接):正常关闭连接。
CWR(拥塞窗口减少):发送方降低发送速率(ECN相关)。
ECE(ECN回显):指示网络拥塞(ECN相关)。
8..窗口大小(Window Size)
长度:16位(2字节)
作用:接收方通告的可用缓冲区大小,用于流量控制。单位是字节。
9.校验和(Checksum)
长度:16位(2字节)
作用:检测头部和数据在传输中的错误,覆盖伪头部、TCP头部和数据。
10.紧急指针(Urgent Pointer)
长度:16位(2字节)
作用:当URG标志置1时有效,指向紧急数据末尾的偏移量。
11.选项(Options)
长度:可变(最多40字节)
作用:扩展功能,常见选项包括:
MSS(最大报文段长度):协商数据传输的最大长度。
SACK(选择性确认):允许确认不连续的数据块。
时间戳:计算往返时间(RTT)和防止序列号回绕。
12.填充(Padding)
作用:确保TCP头部长度为4字节的整数倍,填充值为0。
关键字段详解
序列号与确认号
序列号确保数据有序传输,确认号实现可靠交付(通过ACK机制)。
示例:若发送方发送序列号为100、长度为20的数据,接收方回复的确认号为121。
控制标志
SYN和FIN:三次握手(SYN, SYN-ACK, ACK)和四次挥手(FIN-ACK)。
RST:强制终止连接(如端口未开放或异常断开)。
窗口大小
动态调整发送速率,避免接收方缓冲区溢出(滑动窗口机制)。
选项字段
MSS协商:通常在三次握手时交换,避免分片
时间戳:用于高带宽网络中的序列号回绕保护和精确RTT计算
三次握手:

初始阶段,客户端是CLOSE状态,服务端需要监听服务所在端口,因此处于LISTEN状态
客户端发来SYN分组,到达了服务器,此时客户端会从CLOSE状态立即变为SYN-SENT状态
SYN到达服务端,在服务器内核中,会将"根据SYN分组内容创建的内核数据结构实例"放入SYN队列中,同时会
发送一个SYN+ACK数据分组给客户端,此时服务端从LISTEN状态变为SYN-RECEIVED状态
客户端收到SYN+ACK分组,会给服务端发送ACK分组,并从SYN-SENT状态变为ESTABLISTED状态
服务端收到ACK分组后会从SYN-RECEIVED状态转换为ESTABLISHED状态,但实际在内核中,会把之前放入
SYN队列中的数据结构实例移出,放入ACCEPT队列中,然后由应用程序调用accept方法从ACCEPT队列中将该
数据结构实例取出,并返回一个新的文件描述符,供应用程序进行后续数据处理和通信。该文件描述符对应的是
一个新的 socket,通过它,应用程序可以继续与客户端进行数据收发。
四次挥手:

当客户端决定关闭连接时,它会发送一个 FIN(Finish)包给服务器,表示它不再有数据要发送。发送 FIN
包后,客户端的连接状态从 ESTABLISHED 变为 FIN-WAIT-1,等待服务器的确认。
服务器收到客户端的 FIN 包后,向客户端发送一个 ACK 包,确认收到 FIN。发送 ACK 后,服务器的状态
从 ESTABLISHED 变为 CLOSE-WAIT,表示它知道客户端已停止发送数据,但服务器可能还有数据要发送。
当服务器确认不再有数据需要发送时,它会向客户端发送一个 FIN 包,请求关闭连接。发送 FIN 后,服务器
的状态从 CLOSE-WAIT 变为 LAST-ACK,等待客户端的最后确认。
客户端收到服务器的 FIN 包后,向服务器发送一个 ACK 包 进行确认
发送完 ACK 包后,客户端的状态变为 TIME-WAIT,并进入一个计时等待阶段(2*MSL),以确保服务器能够
收到这个 ACK。
如果在 TIME-WAIT 定时器超时后未收到服务器的重传请求,客户端最终进入 CLOSED 状态,正式关闭连
接
9.总结主机到主机的包传递过程
应用层
数据生成:应用程序(如浏览器、邮件客户端)生成原始数据(如HTTP请求、文件内容)。
协议封装:应用层数据通过传输层接口(如Socket API)传递,触发TCP连接建立或直接发送UDP数据
传输层
应用层数据传递给传输层,传输层协议(如 TCP 或 UDP)会为数据添加传输层头部。TCP 会为数据建立可靠的连接,进行分段、排序和确认等操作;UDP 则提供无连接的简单数据传输服务,主要用于对实时性要求高但对数据准确性要求相对较低的应用,如音频视频流。添加头部后的数据包称为段(TCP)或用户数据报(UDP)。
网络层
IP封装:TCP段被封装为IP数据包,添加IP头部(源/目标IP、TTL、校验和等)。
路由选择:
同网段:直接通过ARP解析目标MAC地址,通过交换机传输。
跨网段:主机将数据包发送至默认网关(路由器),路由器根据路由表选择下一跳地址
数据链路层
帧封装:IP数据包被封装为数据帧,添加源/目标MAC地址。
ARP解析:若目标MAC未知,主机发送ARP广播请求,目标主机回复ARP应答。
物理层
比特流传输:数据帧转换为电信号或光信号,通过物理介质(网线、光纤)传输到主机
中间设备转发:
如果数据包需要经过多个网络节点(如路由器、交换机),这些中间设备会根据其自身的功能和配置对数据包进行处理。路由器在网络层根据 IP 地址进行路由选择和转发,交换机在数据链路层根据 MAC 地址进行帧的转发。
目的主机接收处理:
当数据包到达目的主机时,会从物理层开始逐层解封装。物理层将物理信号转换为数据帧,数据链路层检查帧的完整性并去除帧头部和尾部,将 IP 数据报传递给网络层。网络层检查 IP 头部,根据目的 IP 地址将数据报传递给传输层。传输层检查段或用户数据报的头部,根据端口号将数据传递给相应的应用层程序。应用层程序接收到数据后,进行相应的处理,如显示网页内容、保存文件等。
10. 201.222.200.111/18计算主机数?子网掩码?说明计算方法。
根据IP地址的子网掩码,可以确定网络地址和主机地址的范围。子网掩码是一个32位的二进制数,其中前面的连续位是网络地址,后面的连续位是主机地址。
子网掩码
给定IP地址:11.0.201.222.200.111/18
将子网掩码转换为二进制:
18个1,后面是14个0:11111111.11111111.11000000.00000000
将其转换为十进制形式,子网掩码为255.255.192.0。
主机数
根据子网掩码的二进制,可以确定网络地址和主机地址的范围:
主机数的计算方法是根据子网掩码中 0 的位数来确定的。在这个例子中,子网掩码后 14 位为 0,所以主机数为214-2=16382
所以,该子网的主机数是16382个
子网掩码:255.255.192.0
11.当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
A 判断是否在同一网段的方法
要判断两个 IP 地址是否在同一网段,需要将 IP 地址和子网掩码进行逻辑与运算,得到网络地址,然后比较两个网络地址是否相同。若相同,则在同一网段;若不同,则不在同一网段。具体步骤如下
A和B是否在同一个网段可以通过比较它们的网络地址和子网掩码来判断。
A的IP地址是10.0.1.1/16,子网掩码是255.255.0.0,转换为十进制为:
10.0.1.1 00001010.00000000.00000001.00000001。
255.255.0.0 11111111.11111111.00000000.00000000
B的IP地址是10.0.2.2/24,子网掩码是255.255.255.0,转换为点分十进制形式为
10.0.2.2 00001010.00000000.00000010.00000010。
255.255.255.0 11111111.11111111.11111111.00000000
进行逻辑与运算得到网络地址:
A 的网络地址:00001010.00000000.00000001.00000001与11111111.11111111.00000000.00000000进行与运算,结果是00001010.00000000.00000000.00000000,即10.0.0.0。
B 的网络地址:00001010.00000000.00000010.00000010与11111111.11111111.11111111.00000000进行与运算,结果是00001010.00000000.00000010.00000000,即10.0.2.0。
比较网络地址:
由于10.0.0.0不等于10.0.2.0,所以 A 认为 B 与自己不在同一网段。
A 和 B 能否通信
A 和 B 是可以通信的,不过需要借助路由器。当 A 判断出 B 与自己不在同一网段时,A 会把数据包发送给默认网关(路由器)。路由器依据自身的路由表,把数据包转发到 B 所在的网络,最终 B 就能接收到数据包。同理,B 向 A 发送数据包时也会经过路由器的转发。
12.如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。
子网掩码
已知原始网络前缀为/8,要划分成 32 个子网。因为25<\sup>=32,所以需要从主机位中借用 5 位来表示子网。
那么新的子网掩码就是在原来/8的基础上,再加上 5 位,即/13。
转换为十进制形式为255.248.0.0。
计算每个子网的主机数
子网掩码为/13,则主机位有
32−13=19位。
每个子网的主机数为219<\sup>-2=524286。这里减去 2 是因为要去掉网络地址(全 0)和广播地址(全 1)。

浙公网安备 33010602011771号