晓铧.

Do more of what makes you happy.

第三周作业

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)通过抽象层实现存储资源的动态管理,其核心组件与工作原理如下:

  1. 物理卷(PV)
    • 定义:原始磁盘或分区(需初始化为 LVM 格式),存储底层物理数据。
    • 特点:固定大小,作为卷组的构建基础。
  2. 卷组(VG)
    • 定义:由多个 PV 组成的存储池,提供逻辑上的统一存储空间。
    • 特点:支持动态添加/移除 PV,实现存储扩容或缩容。
  3. 逻辑卷(LV)
    • 定义:从 VG 中划分的虚拟存储单元,可格式化为文件系统并挂载使用。
    • 特点:支持在线扩容、缩容及快照功能。
  4. 物理区域(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)。

posted @ 2025-05-07 15:01  晓铧  阅读(105)  评论(0)    收藏  举报