Linux基础复习第七天

Linux基础复习第七天

1./dev/zero和/dev/null 是什么

在 Linux 中,/dev/zero/dev/null 是两个特殊的伪设备文件(也称为虚拟设备),它们的行为和用途截然不同,但在系统管理、脚本开发和数据操作中非常有用。

  • /dev/zero

    它的作用是,提供无限的空字符(NULL 字节,ASCII 值为 0)

    当从 /dev/zero 读取时,它会持续输出 0 字节(二进制的 0),直到你主动停止读取。写入 /dev/zero 的数据会被丢弃(与 /dev/null 类似)。

    • 典型用途:

      • 创建特定大小的空文件:

        # 使用 dd 命令将 /dev/zero 的内容写入文件,生成一个填充 0 的文件。
        
        # 示例:
        # 这会生成一个 10MB 的文件 zero_file.txt,其内容全部为 0。
        dd if=/dev/zero of=zero_file.txt bs=1M count=10
        
      • 初始化内存或设备

        在某些场景下(如测试磁盘性能),可以使用 /dev/zero 填充磁盘或内存。

      • 生成随机数据(与 /dev/urandom 结合)

        虽然 /dev/zero 本身不提供随机性,但可以与其他工具结合使用。

  • /dev/null

    它的作用是,丢弃一切写入其中的数据。从 /dev/null 读取时,会立即返回 EOF(文件结束符),没有任何数据。

    • 典型用途:

      • 丢弃不需要的输出

        将命令的标准输出(stdout)或标准错误(stderr)重定向到 /dev/null,以隐藏输出。

        示例:

        command > /dev/null       # 丢弃标准输出
        command 2> /dev/null      # 丢弃标准错误
        command > /dev/null 2>&1  # 同时丢弃标准输出和标准错误
        
      • 清空文件内容:

        /dev/null 的内容重定向到文件,可以清空文件内容。

        示例:

        cat /dev/null > filename.txt  # 清空文件内容
        
      • 屏蔽脚本中的调试信息

        在脚本中,如果某些命令的输出不需要显示,可以通过重定向到 /dev/null 隐藏。

    特性/dev/zero/dev/null
    读取行为返回无限的 0 字节立即返回 EOF
    写入行为数据被丢弃数据被丢弃
    主要用途创建填充 0 的文件丢弃不需要的输出
    典型命令dd if=/dev/zero of=...> /dev/null2> /dev/null
    比喻无限的 0 字节工厂黑洞(吞噬所有写入的数据)
  • 实际场景示例:
    • 屏蔽命令错误提示

      find / -name "nonexistent_file" 2> /dev/null
      

      这会隐藏 find 命令的错误输出(例如文件不存在的提示)。

    • 创建测试文件

      dd if=/dev/zero of=test.bin bs=512 count=100
      

      生成一个 51,200 字节(50KB)的二进制文件 test.bin,内容全为 0。

    • 清空日志文件

      cat /dev/null > /var/log/some.log
      

      清空日志文件内容,但保留文件本身。

2.如何查看硬盘的分区,以及当前系统磁盘使用大小

  • 查看硬盘的分区情况
    • fdisk 命令

      功能:查看磁盘分区表(支持 MBR 分区表)。

      sudo fdisk -l
      
      # 输出示例:
      Disk /dev/loop0: 63.95 MiB, 67051520 bytes, 130960 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      
      
      Disk /dev/loop1: 63.77 MiB, 66863104 bytes, 130592 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      
      
      Disk /dev/loop2: 87.04 MiB, 91267072 bytes, 178256 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      
      
      Disk /dev/loop3: 89.4 MiB, 93745152 bytes, 183096 sectors
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      
      ............
      
    • lsblk 命令

      功能:以树状结构列出所有块设备(包括磁盘和分区)。

      lsblk
      
      #输出示例:
      NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
      loop0    7:0    0 63.9M  1 loop /snap/core20/2318
      loop1    7:1    0 63.8M  1 loop /snap/core20/2599
      loop2    7:2    0   87M  1 loop /snap/lxd/29351
      loop3    7:3    0 89.4M  1 loop /snap/lxd/31333
      loop4    7:4    0 50.9M  1 loop /snap/snapd/24718
      loop5    7:5    0 49.3M  1 loop /snap/snapd/24792
      sda      8:0    0   40G  0 disk 
      ├─sda1   8:1    0    1M  0 part 
      └─sda2   8:2    0   40G  0 part /
      sr0     11:0    1    2G  0 rom  
      
    • parted 命令

      功能:查看磁盘分区表(支持 GPT 和 MBR)。

      sudo parted -l
      
      # 输出示例:
      Model: VMware, VMware Virtual S (scsi)
      Disk /dev/sda: 42.9GB
      Sector size (logical/physical): 512B/512B
      Partition Table: gpt
      Disk Flags: 
      
      Number  Start   End     Size    File system  Name  Flags
       1      1049kB  2097kB  1049kB                     bios_grub
       2      2097kB  42.9GB  42.9GB  ext4
      
    • blkid 命令

      功能:查看磁盘分区的 UUID 和文件系统类型。

      sudo blkid
      
      #输出示例:
      /dev/sr0: BLOCK_SIZE="2048" UUID="2024-09-11-18-46-48-00" LABEL="Ubuntu-Server 22.04.5 LTS amd64" TYPE="iso9660" PTTYPE="PMBR"
      /dev/sda2: UUID="165ca13d-1be0-434c-9458-fb7a4d1fceef" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4fa41d64-11ce-4ec3-8372-570d76fd1ebe"
      /dev/loop1: TYPE="squashfs"
      /dev/loop4: TYPE="squashfs"
      /dev/loop2: TYPE="squashfs"
      /dev/loop0: TYPE="squashfs"
      /dev/sda1: PARTUUID="a038401d-55cc-40fb-88e1-268c92963e74"
      /dev/loop5: TYPE="squashfs"
      /dev/loop3: TYPE="squashfs"
      
  • 查看磁盘使用大小
    • df 命令

      功能:查看文件系统的磁盘空间使用情况。

      常用选项:

      • -h:以人类可读的格式(如 GB、MB)显示。
      • -T:显示文件系统类型。
      • -i:查看 inode 使用情况。
      df -hT
      
      # 输出示例:
      Filesystem     Type   Size  Used Avail Use% Mounted on
      tmpfs          tmpfs  388M  1.6M  387M   1% /run
      /dev/sda2      ext4    40G  8.1G   30G  22% /
      tmpfs          tmpfs  1.9G     0  1.9G   0% /dev/shm
      tmpfs          tmpfs  5.0M     0  5.0M   0% /run/lock
      tmpfs          tmpfs  388M  4.0K  388M   1% /run/user/1000
      
    • du 命令

      功能:查看目录或文件的磁盘使用情况。

      常用选项:

      • -s:汇总目录总大小。
      • -h:以人类可读的格式显示。
      • --max-depth=N:限制递归深度。
      # 查看当前目录的总大小
      du -sh .
      
      # 查看 `/home/user` 目录的大小
      du -sh /home/user
      
      # 查看当前目录下所有子目录的大小(深度为 1)
      du -h --max-depth=1 .
      
    • smartctl 命令(查看磁盘健康状态)

      功能:查看硬盘的 SMART 信息(需要安装 smartmontools)。

      sudo smartctl -a /dev/sda
      
      # 输出示例:
      smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.0-143-generic] (local build)
      Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org
      
      === START OF INFORMATION SECTION ===
      Vendor:               VMware,
      Product:              VMware Virtual S
      Revision:             1.0
      User Capacity:        42,949,672,960 bytes [42.9 GB]
      Logical block size:   512 bytes
      Rotation Rate:        Solid State Device
      Device type:          disk
      Local Time is:        Mon Jul 14 09:48:52 2025 UTC
      SMART support is:     Unavailable - device lacks SMART capability.
      
      === START OF READ SMART DATA SECTION ===
      Current Drive Temperature:     0 C
      Drive Trip Temperature:        0 C
      
      Error Counter logging not supported
      
      Device does not support Self Test logging
      

3.创建一块新硬盘,1G大小,挂载到/opt/mydir目录,并设置为开机启动挂载

  • 在VMware中添加新的虚拟硬盘

    首先要确保虚拟机关闭,接着编辑虚拟机设置:

在这里插入图片描述

在这里插入图片描述

设置硬盘大小为1GB

在这里插入图片描述

最后,保存确认启动虚拟机

  • 在Ubuntu 中配置新硬盘
    • 步骤1:查看新硬盘
      sudo fdisk -l
      
      新硬盘通常为 /dev/sdb(原有硬盘为 /dev/sda)。
      如果未显示 /dev/sdb,请重启虚拟机后再次运行命令。
      
    • 步骤 2:分区新硬盘
      # 使用 fdisk 创建分区:
      
      sudo fdisk /dev/sdb
      
      • 按以下步骤操作

        • 输入 n → 选择 p(主分区)→ 分区号选择 1 → 起始扇区默认(回车)→ 输入 +1G 设置大小为 1GB,或者+1020M的范围内确保数值不超出。
        • 输入 w 保存分区表并退出。
        # 更新内核分区表:
        
        sudo partprobe /dev/sdb
        
    • 步骤3:格式化分区
      # 将分区格式化为 ext4 文件系统:
      
      sudo mkfs.ext4 /dev/sdb1
      
    • 步骤4:创建挂载点
      # 创建目标目录:
      
      sudo mkdir -p /opt/mydir
      
      # 设置目录权限(可选):
      
      sudo chmod 755 /opt/mydir
      
    • 步骤5:临时挂载分区
      # 挂载分区到目标目录:
      
      sudo mount /dev/sdb1 /opt/mydir
      
      # 验证挂载:
      
      df -h
      
      # 输出为:
      Filesystem      Size  Used Avail Use% Mounted on
      tmpfs           388M  1.6M  387M   1% /run
      /dev/sda2        40G  7.1G   31G  19% /
      tmpfs           1.9G     0  1.9G   0% /dev/shm
      tmpfs           5.0M     0  5.0M   0% /run/lock
      tmpfs           388M  4.0K  388M   1% /run/user/1000
      /dev/sdb1       965M   24K  899M   1% /opt/mydir
      

      输出包含 /dev/sdb1 挂载到 /opt/mydir,且大小约为 1GB。

  • 设置开机自动挂载
    • 步骤1:获取分区的UUID:
      # 查看分区的 UUID:
      
      sudo blkid /dev/sdb1
      
      # 输出为
      /dev/sdb1: UUID="8ab84e60-c97a-4e2e-8984-abe387b6936d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5a385b9-01"
      
    • 步骤2:编辑 /etc/fstab 文件
      # 打开 /etc/fstab:
      
      sudo vim /etc/fstab
      
      # 添加以下内容(UUID=后面需要替换为实际值):
      
      UUID=8ab84e60-c97a-4e2e-8984-abe387b6936d /opt/mydir ext4 defaults 0 2
      

在这里插入图片描述

保存然后退出
  • 步骤 3:测试 fstab 配置
    # 手动挂载所有配置:
    
    sudo mount -a
    

    如果无报错,说明配置正确。

  • 验证开机自动挂载
    # 重启系统:
    
    sudo reboot
    
    # 检查挂载状态:
    
    df -h
    

    确认 /opt/mydir 已自动挂载。

在这里插入图片描述

4.使用dd命令,在/opt/mydir目录中写入一个200M大小的文件

  • 命令
sudo dd if=/dev/zero of=/opt/mydir/200MB_file bs=1M count=200

参数说明:
if=/dev/zero:从 /dev/zero 读取数据(生成全零内容)。
of=/opt/mydir/200MB_file:将文件写入到 /opt/mydir/200MB_file。
bs=1M:设置块大小为 1MB。
count=200:复制 200 个块,总大小为 200MB。
  • 验证文件大小
    ls -lh /opt/mydir/200MB_file
    
    #输出示例:
    -rw-r--r-- 1 root root 200M Jul 14 22:12 /opt/mydir/200MB_file
    
  • dd 命令的常用选项
    选项作用
    if=FILE指定输入文件(默认为 /dev/null)。
    of=FILE指定输出文件(默认为 /dev/null)。
    bs=BYTES设置块大小(读写单位),默认为 512 字节。
    count=N指定复制的块数。
    skip=N跳过输入文件的前 N 个块。
    seek=N在输出文件中跳过前 N 个块(常用于填充空洞)。
    conv=CONV数据转换选项(如 notruncsyncnoerror 等)。
    status=LEVEL控制状态输出(如 progress 显示进度)。
  • dd 命令的常见使用场景
    • 创建测试文件
      • 生成 200MB 的全零文件:

        dd if=/dev/zero of=/opt/mydir/testfile bs=1M count=200
        
      • 生成随机数据文件:

        dd if=/dev/urandom of=/opt/mydir/randomfile bs=1M count=200
        
    • 备份与恢复
      • 备份整个磁盘:

        dd if=/dev/sda of=~/backup.img bs=4M status=progress
        
      • 恢复磁盘备份:

        dd if=~/backup.img of=/dev/sda bs=4M status=progress
        
  • 磁盘克隆
    • /dev/sda 克隆到 /dev/sdb

      dd if=/dev/sda of=/dev/sdb bs=4M conv=sync,noerror status=progress
      
  • 数据擦除
    • 安全清除硬盘数据:

      dd if=/dev/zero of=/dev/sda bs=4M status=progress
      

      注意:此操作会永久删除 /dev/sda 上的所有数据!

  • 文件转换
    • 将文件转换为大写:

      dd if=input.txt of=output.txt conv=ucase
      
    • 交换字节顺序:

      dd if=data.bin of=data_swapped.bin conv=swab
      

5.如何查看当前系统内存使用大小

  • 方法 1:使用 free 命令

    free -h
    

    输出示例:

                   total        used        free      shared  buff/cache   available
    Mem:           3.8Gi       309Mi       3.0Gi       1.0Mi       539Mi       3.3Gi
    Swap:          3.8Gi          0B       3.8Gi
    
    • 关键指标:
      • total: 总内存大小。
      • used: 已使用内存(包括缓存和缓冲区)。
      • free: 完全未使用的内存。
      • available: 可用内存(更准确的可用内存估算)。
  • 方法 2:使用 tophtop 命令

    • 运行 top

      top
      
      # 输出示例:
      top - 17:20:49 up  3:14,  1 user,  load average: 0.00, 0.00, 0.00
      Tasks: 223 total,   1 running, 222 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      MiB Mem :   3875.9 total,   3026.7 free,    309.3 used,    539.9 buff/cache
      MiB Swap:   3875.0 total,   3875.0 free,      0.0 used.   3330.7 avail Mem 
      
          PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                  
          740 root      20   0  167316   8524   7212 S   0.3   0.2   0:14.24 vmtoolsd                                                                                                 
         1414 longlij+  20   0   10624   4072   3232 R   0.3   0.1   0:00.02 top                                                                                                      
            1 root      20   0  100732  11504   8184 S   0.0   0.3   0:02.29 systemd                                                                                                  
            2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd                                                                                                 
            3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                                                                   
            4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                                                               
            5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_flushwq                                                                                             
            6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns                        
      
    • 查看内存使用:

      • Mem 行中查看 内存总量、已使用、空闲
      • Swap 行中查看 交换分区使用情况
    • 使用 htop(需安装):

      htop
      
      • 提供更直观的内存和进程监控界面。

在这里插入图片描述

  • 方法 3:查看 /proc/meminfo

    cat /proc/meminfo
    
    # 输出示例:
    MemTotal:        3968924 kB
    MemFree:         3098660 kB
    MemAvailable:    3410956 kB
    Buffers:           20240 kB
    Cached:           479988 kB
    SwapCached:            0 kB
    Active:            97096 kB
    Inactive:         460684 kB
    Active(anon):       1512 kB
    Inactive(anon):    66712 kB
    Active(file):      95584 kB
    ...........
    
    • 关键字段:
      • MemTotal: 总内存大小(单位 KB)。
      • MemFree: 未使用内存。
      • Buffers/Cached: 缓存和缓冲区占用的内存。
  • 方法 4:使用 vmstat 命令

    vmstat -s
    
    # 输出示例:
          3968924 K total memory
           316100 K used memory
            97096 K active memory
           460788 K inactive memory
          3098660 K free memory
            20240 K buffer memory
           533924 K swap cache
          3967996 K total swap
                0 K used swap
          3967996 K free swap
              736 non-nice user cpu ticks
                0 nice user cpu ticks
             2348 system cpu ticks
          4740213 idle cpu ticks
              230 IO-wait cpu ticks
                0 IRQ cpu ticks
              102 softirq cpu ticks
                0 stolen cpu ticks
           281457 pages paged in
           222528 pages paged out
                0 pages swapped in
                0 pages swapped out
          1069732 interrupts
          1556534 CPU context switches
       1752501991 boot time
             1545 forks
    
    • 显示内存、进程、分页等详细统计信息。

6.如何查看系统负载,系统负载为10,表示什么含义,是高还是低。

  • 在 Linux 系统中,可以通过以下命令查看系统负载:
    • uptime 命令
      uptime
      
      # 输出示例:
      10:19:56 up 5 days, 3 users, load average: 10.00, 8.50, 7.20
      

      含义:
      load average: 10.00, 8.50, 7.20 分别表示过去 1分钟、5分钟、15分钟 的平均负载。

    • tophtop 命令
      top
      
      #输出示例:
      top - 02:26:43 up 2 min,  1 user,  load average: 0.29, 0.24, 0.10
      Tasks: 262 total,   1 running, 261 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
      MiB Mem :   3875.9 total,   3223.1 free,    311.7 used,    341.1 buff/cache
      MiB Swap:   3875.0 total,   3875.0 free,      0.0 used.   3330.7 avail Mem 
      
      htop
      
      # 第一行也能看到相关的系统负载信息
      
    • w 命令
      w
      
      # 输出示例:
      02:28:29 up 4 min,  1 user,  load average: 0.24, 0.22, 0.10
      USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
      longliji pts/0    192.168.163.1    02:24    0.00s  0.03s  0.00s w
      
    • 直接查看 /proc/loadavg 文件
      cat /proc/loadavg
      
      # 输出示例:
      10.00 8.50 7.20 1/200 12345
      

      含义:前三个数字分别对应 1 分钟、5 分钟、15 分钟的平均负载。

  • 系统负载为 10 的含义
    • 负载的定义
      • 系统负载(Load)是指当前处于可运行状态(R)不可中断状态(D)的进程数总和
        • 可运行状态(R):正在运行或等待 CPU 的进程。
        • 不可中断状态(D):进程因等待 I/O(如磁盘、网络)而无法被中断,通常与 I/O 瓶颈相关。
    • 负载值的参考标准
      • 负载值与 CPU 核心数的关系:
        • 如果系统有 N 个 CPU 核心,负载值 ≤ N 表示系统负载正常。
        • 如果负载值 > N,表示系统资源(CPU 或 I/O)可能不足,存在性能瓶颈。
      • 示例:
        • 单核 CPU:负载 10 表示 CPU 完全被 10 个进程竞争,系统严重过载。
        • 4 核 CPU:负载 10 表示每个核心平均有 2.5 个进程竞争,系统负载较高。
        • 16 核 CPU:负载 10 表示系统负载较低(负载值远小于核心数)。
    • 负载为 10 的具体含义
      • 负载 10 表示当前系统中有 10 个进程处于运行或等待状态
      • 是否高或低取决于系统的核心数:
        • 如果系统是单核或双核:负载 10 明显过高,CPU 可能无法及时处理所有任务,导致响应延迟。
        • 如果系统是 8 核或更高:负载 10 相对较低,系统仍有余力处理更多任务。
  • 如何判断负载是否过高?
    • 结合 CPU 核心数判断

      使用以下命令查看 CPU 核心数:

      nproc
      # 或
      cat /proc/cpuinfo | grep "processor" | wc -l
      
    • 公式

      负载是否过高 = 负载值 > CPU 核心数 × 1.5
      
    • 结合负载趋势分析

      • 短期负载(1 分钟):反映即时性能问题,适合快速定位突发瓶颈。
      • 长期负载(5/15 分钟):反映系统整体负载趋势,适合分析持续性问题。
    • 进一步排查负载来源

      • 使用 vmstat 命令:

        vmstat 1
        

        关注字段:

        • r:运行队列中的进程数(若长期大于 CPU 核心数,说明 CPU 不足)。
        • b:不可中断状态的进程数(若较大,可能有 I/O 瓶颈)。
      • 使用 iostat 命令:

        iostat -x 1
        

        关注字段:

        • %util:磁盘使用率(若接近 100%,说明磁盘 I/O 瓶颈)。

7.系统负载与CPU使用率有什么关联

  • 直接关联
    • 负载增加 → CPU 使用率可能增加

      如果负载高且主要是 CPU 密集型任务(如大量进程竞争 CPU),CPU 使用率会随之上升。

      示例
      一个 4 核 CPU 的系统,负载为 4.0 且 CPU 使用率为 100%,说明每个核心都在满负荷运行。

  • 复杂关联
    • 负载高 ≠ CPU 使用率高
      • I/O 瓶颈:

        如果负载高但 CPU 使用率低,说明进程可能因等待磁盘或网络 I/O 而阻塞(不可中断状态)。

        示例
        一个数据库服务器频繁读写磁盘,导致大量进程处于等待 I/O 的状态(不可中断),负载高但 CPU 使用率低。

      • 锁竞争
        多个进程因竞争资源(如文件锁、内存锁)而阻塞,负载高但 CPU 使用率低。

    • CPU 使用率高 ≠ 负载高
      • 计算密集型任务:

        一个进程长时间占用 CPU(如死循环),CPU 使用率高但负载低(仅一个进程在运行)。

        示例
        一个单线程的科学计算程序占用 100% CPU,但负载接近 1.0(单核满载)。

  • 联合分析场景
    • 场景 1:CPU 饱和(高使用率 + 高负载)

      特征:CPU 使用率接近 100%、负载值远高于 CPU 核心数。

      原因:CPU 密集型任务(如编译代码、视频渲染)。

      解决方案:优化代码逻辑(减少计算量)、增加 CPU 核心数或升级硬件。

    • 场景2:I/O 瓶颈(低 CPU 使用率 + 高负载)

      特征:CPU 使用率低(如 20%)、负载值高(如 8.0)。

      原因:进程因等待磁盘或网络 I/O 而阻塞。

      解决方案:检查磁盘性能(使用 iostat 查看磁盘 I/O 延迟)、使用 SSD 替代 HDD,或优化 I/O 操作(如批量读写)。

    • 场景3:CPU 利用不足(低 CPU 使用率 + 低负载)

      特征:CPU 使用率低(如 10%)、负载值低(如 0.5)。

      原因:系统处于空闲状态。

      解决方案:无需优化,系统运行正常。

    • 场景 4:锁竞争(低 CPU 使用率 + 高负载)

      特征:CPU 使用率低(如 15%)、负载值高(如 6.0)。

      原因:多个进程因竞争资源(如文件锁、内存锁)而阻塞。

      解决方案:优化资源分配逻辑(减少锁争用)、使用更高效的并发模型(如无锁数据结构)。

8.如何查看本机启动了哪些端口,如何使用telnet测试端口是否连通

  • 查看本机启动的端口
    • 使用 netstat 命令
      sudo netstat -tuln
      
      # 输出示例:
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State      
      tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
      tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
      tcp6       0      0 :::22                   :::*                    LISTEN     
      udp        0      0 127.0.0.53:53           0.0.0.0:*                          
      udp        0      0 192.168.163.140:68      0.0.0.0:*                        
      

      参数说明:

      • -t:显示 TCP 端口。
      • -u:显示 UDP 端口。
      • -l:仅显示监听(LISTEN)状态的端口。
      • -n:以数字形式显示地址和端口(不进行 DNS 解析)。
    • 使用 ss 命令
      sudo ss -tuln
      

      在这里插入图片描述

      参数说明:

      • 参数含义与 netstat 类似,ssnetstat 的现代替代工具,速度更快。
    • 使用 lsof 命令
      sudo lsof -i -P -n
      

      在这里插入图片描述

      参数说明:

      • -i:显示与网络相关的进程。
      • -P:以端口号而非服务名显示。
      • -n:不解析主机名。
    • 使用 fuser 命令
      sudo fuser -n tcp 80
      
      # 输出示例:
      80/tcp:             5678
      

      参数说明:

      • -n tcp:指定协议为 TCP。
      • 80:查看占用 80 端口的进程。
  • 使用 telnet 测试端口是否连通
    • 安装 telnet 客户端

      如果未安装 telnet,需先安装:

      sudo apt install telnet
      
    • 测试本机端口
      telnet 127.0.0.1 <端口号>
      

      示例:

      telnet 127.0.0.1 80
      

      结果解读:

      • 连接成功:

        Trying 127.0.0.1...
        Connected to 127.0.0.1.
        Escape character is '^]'.
        
        • 说明:本机 80 端口开放且服务正常。
      • 连接失败:

        Trying 127.0.0.1...
        telnet: connect to address 127.0.0.1: Connection refused
        
        • 说明:本机未监听该端口或服务未启动。
    • 测试远程主机端口
      telnet <目标IP地址> <端口号>
      

      示例:

      telnet 192.168.163.140 22
      

      结果解读:

      • 连接成功:

        Trying 192.168.163.140...
        Connected to 192.168.163.140.
        Escape character is '^]'.
        SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
        
        • 说明:目标主机的 22 端口开放且 SSH 服务正常。
      • 连接失败:

        Trying 192.168.163.140...
        telnet: connect to address 192.168.1.1: Connection refused
        
        • 说明:目标端口未开放或防火墙阻止连接。

9.什么是域名,什么是dns,什么是hosts

  • 域名(Domain Name)

    域名是互联网上用于标识网站或服务的名称,例如 www.example.com。它通过字符形式替代复杂的 IP 地址(如 192.168.1.1),方便用户记忆和访问。

    特点

    • 层级结构:
      • 顶级域(TLD):如 .com.net.cn
      • 二级域:用户注册的主域名,如 example.com
      • 子域:可自定义的子域名,如 www.example.comblog.example.com
    • 唯一性:每个域名全球唯一,需通过域名注册商(如阿里云、GoDaddy)注册。
    • 品牌标识:域名是网站的品牌标志,直接影响用户信任度和访问体验。
  • DNS(Domain Name System,域名系统)

    DNS 是互联网的核心服务,负责将域名(如 www.example.com)解析为对应的 IP 地址(如 93.184.216.34),类似于电话簿的作用。

    工作原理

    • 递归查询:

      • 用户输入域名后,操作系统首先检查本地 Hosts 文件 是否有记录。

      • 若无记录,则向配置的 DNS 服务器 发起请求。

    • 分布式数据库:

      • DNS 服务器通过递归查询根域名服务器、顶级域服务器(如 .com)、权威域名服务器,最终获取目标 IP 地址。
    • 缓存机制:

      • DNS 查询结果会缓存一段时间(TTL),减少重复查询的开销。

    关键功能

    • 域名解析:将域名转换为 IP 地址。
    • 反向解析:将 IP 地址转换为域名(用于日志分析、安全审计)。
    • 智能调度:根据用户地理位置或网络运营商返回最优 IP 地址。
    • 负载均衡:将流量分配到多个服务器,提升可用性和性能。

    常见问题

    • DNS 污染/劫持:域名被错误解析到恶意 IP(如广告页面)。
    • DNS 缓存失效:网站更换服务器后,旧 IP 仍被缓存导致访问失败。
  • Hosts 文件

    Hosts 文件是操作系统本地的一个静态文本文件,用于手动配置域名与 IP 地址的映射关系。它优先于 DNS 解析,常用于测试、屏蔽网站或加速特定域名访问。

    工作原理

    • 当用户访问某个域名时,系统会优先检查 Hosts 文件是否有对应记录。
    • 如果有,直接使用该 IP 地址;如果没有,才会向 DNS 服务器发起解析请求。

    典型用途

    • 测试网站:

      修改 Hosts 文件,将域名指向本地或测试服务器的 IP。

      示例:

      127.0.0.1 www.testsite.com
      
    • 屏蔽广告或恶意网站:

      将广告域名映射到本地回环地址(127.0.0.1)。

      示例:

      127.0.0.1 ad.example.com
      
    • 绕过 DNS 问题:

      在 DNS 服务器故障时,通过 Hosts 文件临时访问目标网站。

    注意事项

    • Hosts 文件是静态的,需要手动维护。
    • 修改后需刷新 DNS 缓存(Windows 使用 ipconfig /flushdns,Linux 使用 sudo systemd-resolve --flush-caches)。
  • 三者的关系
    角色作用特点
    域名用户输入的网站名称(如 www.example.com易记、品牌标识、需注册
    DNS将域名解析为 IP 地址(如 93.184.216.34分布式数据库、动态更新、支持智能调度和负载均衡
    Hosts 文件本地静态配置,手动映射域名与 IP 地址优先级高于 DNS、无需联网、适合测试和临时屏蔽

    访问流程示意图

    用户输入域名 → 检查 Hosts 文件 → 有记录 → 直接访问  
                                 ↓  
                          无记录 → 向 DNS 服务器发起解析 → 获取 IP 地址 → 访问目标服务器
    
  • 总结
    • 域名 是互联网的“门牌号”,方便用户记忆和访问网站。
    • DNS 是“翻译官”,将域名转换为 IP 地址,是互联网通信的基础。
    • Hosts 文件 是本地的“通讯录”,提供静态域名与 IP 的映射,适用于测试和特殊场景。

10.一个域名是如何进行解析的

一个域名的解析过程是通过 DNS(Domain Name System) 完成的,其核心目标是将用户输入的域名(如 www.example.com)转换为对应的 IP 地址(如 192.0.2.1),从而让设备能够连接到目标服务器。

以下是详细的解析流程:

  1. 本地缓存检查

    当用户在浏览器中输入域名后,系统会首先检查以下缓存:

    • 浏览器缓存:浏览器可能已缓存该域名的解析结果。
    • 操作系统缓存(如 Windows 的 DNS 缓存或 Linux 的 systemd-resolve 缓存)。
    • 路由器或本地 DNS 服务器缓存(如家庭宽带运营商的 DNS 缓存)。

    如果缓存中存在有效的解析记录(未过期),则直接返回对应的 IP 地址,跳过后续步骤。

  2. Hosts 文件检查

    如果本地缓存未命中,系统会检查 Hosts 文件(如 Windows 的 C:\Windows\System32\drivers\etc\hosts 或 Linux 的 /etc/hosts)。

    • 如果 Hosts 文件中定义了该域名与 IP 的映射关系,则直接使用该 IP 地址。
    • 如果未定义,则进入 DNS 查询流程。
  3. 递归 DNS 查询

    如果本地缓存和 Hosts 文件均未命中,系统会向 递归 DNS 服务器(如运营商提供的 DNS 或公共 DNS 服务,如 8.8.8.8)发起请求。递归 DNS 服务器会代替用户完成后续的查询过程。

  4. 根域名服务器查询

    递归 DNS 服务器首先向 根域名服务器(全球共 13 组,地址如 198.41.0.4)发起查询。

    根域名服务器的作用是:

    • 根据域名的顶级域(TLD,如 .com.net)返回对应的 顶级域名服务器(TLD 服务器) 地址。
    • 例如,对于 www.example.com,根域名服务器会返回 .com 顶级域名服务器的地址。
  5. 权威 DNS 服务器查询

    递归 DNS 服务器向 权威 DNS 服务器 发起查询。

    权威 DNS 服务器的作用是:

    • 存储该域名的解析记录(如 A 记录、CNAME 记录等),并返回对应的 IP 地址。
    • 例如,example.com 的权威 DNS 服务器会返回 www.example.com 的 IP 地址(如 192.0.2.1)。
  6. 缓存与返回结果
    • 递归 DNS 服务器将获取到的 IP 地址缓存一段时间(由域名的 TTL 值决定,通常为数小时到几天)。
    • 最终将解析结果返回给用户的设备,用户通过该 IP 地址访问目标服务器。
  7. 通信建立

    用户的设备通过解析得到的 IP 地址与目标服务器建立 TCP 连接(如 HTTP 请求),获取网站内容。

  • 关键概念
    • 递归查询 vs. 迭代查询

      • 递归查询:递归 DNS 服务器负责完成整个查询过程,直到返回最终结果。

      • 迭代查询:上级 DNS 服务器只返回下一级 DNS 服务器的地址,由客户端或递归 DNS 服务器逐级查询。

    • DNS 记录类型

      • A 记录:域名到 IPv4 地址的映射。

      • AAAA 记录:域名到 IPv6 地址的映射。

      • CNAME 记录:域名到另一个域名的别名(如 www 别名为 example.com)。

      • MX 记录:用于邮件服务器的解析。

      • NS 记录:指定域名的权威 DNS 服务器。

    • TTL(Time to Live)

      • 每条 DNS 记录都有一个 TTL 值,表示缓存时间。TTL 越短,解析结果更新越快,但会增加 DNS 查询负担。
  • 常见问题与解决方案
    • DNS 污染/劫持:域名被错误解析到恶意 IP。

      • 解决方法:更换 DNS 服务器(如使用 1.1.1.18.8.8.8)。
    • DNS 缓存失效:网站更换服务器后,旧 IP 仍被缓存。

      • 解决方法:等待 TTL 过期,或手动刷新 DNS 缓存(Windows 使用 ipconfig /flushdns,Linux 使用 systemd-resolve --flush-caches)。
    • 解析速度慢:DNS 查询路径过长或服务器响应慢。

      • 解决方法:使用公共 DNS 服务(如 Google DNS、Cloudflare DNS)。

12.dig与nslookup有什么区别,什么场景下使用

dignslookup 都是用于 DNS 查询的命令行工具,但它们的设计目标、功能复杂度和使用场景存在显著差异。

以下是它们的详细对比及适用场景总结:

  • 核心区别
特性dignslookup
设计目标现代、功能强大,适合复杂查询和故障诊断(默认用于 DNS 管理员)。传统工具,简单易用,适合基础查询(已逐步被 dig 取代)。
输出格式详细且结构化,包含技术细节(如响应时间、DNS 服务器地址、TTL 等)。简单直观,但信息较少(默认不显示完整技术细节)。
灵活性支持多种选项(如 +trace 跟踪解析过程、+short 简化输出、批量查询等)。功能较少,仅支持基本查询类型(如 A 记录、MX 记录)。
交互模式无交互模式,需一次性输入命令。支持交互模式(输入 nslookup 后进入命令行),适合多轮查询。
默认行为不查询本地 /etc/hosts 文件(仅依赖 DNS 服务器)。会查询本地 hosts 文件和 DNS 服务器。
跨平台兼容性在 Linux/macOS 中默认集成;Windows 需手动安装(如通过 BIND 工具包)。Windows 自带(默认安装),Linux/macOS 中需安装 bind-utils
推荐使用场景DNS 故障排查、详细记录分析、批量查询、调试复杂 DNS 配置。快速获取基础 DNS 信息(如 IP 地址、邮件服务器地址)。

  • 功能对比
    • 查询能力
      • dig
        • 支持 任意 DNS 记录类型(A、AAAA、CNAME、MX、TXT、PTR 等)。
        • 支持 反向解析dig -x IP)。
        • 支持 指定 DNS 服务器@DNS_IP)。
        • 支持 追踪解析路径+trace)。
        • 支持 批量查询(通过 -f 指定文件)。
      • nslookup
        • 支持基本记录类型(A、MX、CNAME、NS 等)。
        • 支持反向解析(直接输入 IP)。
        • 支持指定 DNS 服务器(nslookup domain DNS_IP)。
        • 交互模式下可切换查询类型(如 set type=MX)。
    • 典型场景
      • dig 的优势场景
        • 需要 跟踪域名解析全过程+trace)。
        • 需要 批量查询多个域名或记录类型
        • 需要 排除本地 hosts 文件干扰(仅依赖 DNS 服务器)。
        • 需要 调试 DNS 服务器配置问题(如 TTL、响应时间等)。
      • nslookup 的优势场景
        • 快速获取 单条 DNS 记录(如 A 记录、MX 记录)。
        • Windows 用户无需安装额外工具
        • 简单的 反向解析(IP → 域名)。
  • 使用建议
    需求推荐工具原因
    快速获取某个域名的 IP 地址nslookup简单直接,无需复杂参数。
    调试 DNS 解析链路(如 TTL、路径)dig支持 +trace 追踪解析过程,输出详细技术信息。
    查询邮件服务器(MX 记录)dignslookup均支持,但 dig 输出更清晰(如 dig google.com MX)。
    批量查询多个域名dig支持 -f 参数读取文件批量查询。
    Windows 系统下临时查询nslookup默认集成,无需额外安装。
    需要排除 hosts 文件影响digdig 不查询 hosts 文件,结果更纯粹。
  • 常见命令示例

    • 查询 A 记录
      • dig

        dig example.com A
        # 或简化输出
        dig +short example.com
        
      • nslookup

        nslookup example.com
        
    • 查询 MX 记录
      • dig

        dig example.com MX
        
      • nslookup

        nslookup -query=MX example.com
        
    • 反向解析(IP → 域名)
      • dig

        dig -x 142.250.179.174
        
      • nslookup

        nslookup 142.250.179.174
        
    • 指定 DNS 服务器
      • dig

        dig @8.8.8.8 example.com
        
      • nslookup

        nslookup example.com 8.8.8.8
        
    • 追踪解析路径
      • dig
      dig example.com +trace
      

13.什么是三次握手和四次挥手,什么场景下使用

  • 三次握手(建立连接)

    TCP 是面向连接的协议,三次握手是客户端和服务器之间建立可靠通信的初始化过程,确保双方具备发送和接收数据的能力,并同步初始序列号(ISN)。

    三次握手流程
    • 第一次握手(SYN)
      • 客户端发送 SYN=1(同步标志位),携带随机初始序列号 seq=x,进入 SYN_SENT 状态。
      • 目的:请求建立连接,表明客户端准备好发送数据。
    • 第二次握手(SYN-ACK)
      • 服务器收到 SYN 后,发送 SYN=1ACK=1(确认标志位),携带自己的初始序列号 seq=y,并确认客户端的序号 ack=x+1,进入 SYN_RCVD 状态。
      • 目的:同意连接请求,并同步服务器的初始序列号。
    • 第三次握手(ACK)
      • 客户端收到 SYN-ACK 后,发送 ACK=1,确认服务器的序号 ack=y+1,进入 ESTABLISHED 状态。
      • 服务器收到 ACK 后,也进入 ESTABLISHED 状态。
      • 目的:确认连接建立成功,双方可以开始数据传输。
    为什么需要三次握手?
    • 防止资源浪费
      如果只有两次握手(客户端发 SYN,服务器回复 SYN-ACK),服务器可能会因客户端未响应而一直处于等待状态。三次握手通过客户端的最终确认(第三次握手),确保服务器不会为无效连接分配资源。
    • 防止已失效的连接请求
      若客户端的 SYN 报文因网络延迟被重复发送,服务器收到后可能误认为是新请求。三次握手通过客户端的确认(第三次握手)可避免此类问题。
  • 四次挥手(断开连接)

    四次挥手是 TCP 连接终止的过程,确保双方都能安全关闭连接,避免数据丢失或资源浪费。

    四次挥手流程
    • 第一次挥手(FIN)
      • 客户端发送 FIN=1(结束标志位),表示数据发送完毕,进入 FIN_WAIT_1 状态。
    • 第二次挥手(ACK)
      • 服务器收到 FIN 后,发送 ACK=1,确认序号 ack=u+1u 是客户端的 FIN 序号),进入 CLOSE_WAIT 状态。
      • 客户端收到 ACK 后,进入 FIN_WAIT_2 状态。
    • 第三次挥手(FIN)
      • 服务器发送 FIN=1,表示自己数据也发送完毕,进入 LAST_ACK 状态。
    • 第四次挥手(ACK)
      • 客户端发送 ACK=1,确认序号 ack=w+1w 是服务器的 FIN 序号),进入 TIME_WAIT 状态,等待 2MSL(最大报文段生存时间)后关闭连接。
      • 服务器收到 ACK 后,立即关闭连接。
    为什么需要四次挥手?
    • 全双工通信的特性
      TCP 是全双工的,双方独立关闭发送通道。客户端先发送 FIN 关闭自己的发送通道,但服务器可能仍有数据要发送,需等待服务器主动关闭连接。
    • 确保数据可靠传输
      通过四次挥手,双方都能确认对方已收到关闭请求,避免数据丢失或连接残留。
  • 使用场景
    • 1. 三次握手的典型场景
      • 网页访问
        浏览器与服务器建立 TCP 连接,加载网页内容(如 HTML、图片、视频)。

      • 即时通讯
        QQ、微信等客户端与服务器建立连接,发送消息或文件。

      • 远程登录
        SSH 协议通过三次握手建立安全连接,实现远程操作。

      • 数据库连接
        Java 程序通过 JDBC 连接 MySQL 数据库,执行查询或更新操作。

    • 2. 四次挥手的典型场景
      • 网页关闭
        用户关闭浏览器后,客户端与服务器断开连接。

      • 聊天结束
        用户退出聊天软件,客户端与服务器释放连接资源。

      • 文件传输完成
        FTP 客户端完成文件上传/下载后,主动关闭连接。

      • 服务端主动断开
        服务器检测到客户端异常(如超时),主动发送 FIN 终止连接。

  • 关键补充
    • TIME_WAIT 状态
      • 客户端在四次挥手后进入 TIME_WAIT 状态,持续 2MSL(默认 2 分钟),确保网络中残留的报文段失效,避免干扰新连接。
      • 作用:防止旧连接的 FIN 报文段被延迟后误认为是新连接的请求。
    • SYN Flood 攻击
      • 攻击者发送大量伪造的 SYN 请求,导致服务器资源耗尽。
      • 防御措施:限制 SYN 重传次数(tcp_synack_retries)、使用防火墙过滤异常流量。
    • 半关闭状态
      • 在四次挥手过程中,客户端发送 FIN 后,服务器仍可发送数据,此时连接处于 半关闭 状态(CLOSE_WAIT)。

14.TCP与UDP有什么区别

  • 核心区别
    特性TCPUDP
    连接方式面向连接(需三次握手建立连接)无连接(直接发送数据包)
    可靠性可靠传输(确认、重传、排序、去重)不可靠传输(可能丢包、乱序、重复)
    流量控制支持(滑动窗口机制,避免接收方过载)无流量控制
    拥塞控制支持(动态调整发送速率避免网络拥塞)无拥塞控制(可能加剧网络拥塞)
    数据边界字节流模式(无明确数据包边界)数据报模式(保留发送时的数据包边界)
    头部开销较大(20-60字节,包含序列号、确认号等字段)极小(固定8字节,仅基础信息)
    传输效率较低(因握手、确认、重传等机制)较高(无额外控制机制,延迟更低)
    多播/广播支持仅支持单播支持单播、多播、广播
    资源消耗较多(维护连接状态、控制机制复杂)较少(无需维护连接状态)
  • 工作机制对比
    • TCP 的可靠性机制
      • 三次握手:建立连接时通过三次交互(SYN、SYN-ACK、ACK)确保双方同步。

      • 确认与重传:接收方通过 ACK 确认数据包,发送方未收到确认时会重传。

      • 排序与去重:通过序列号确保数据按顺序到达,并过滤重复数据。

      • 滑动窗口:动态调整发送窗口大小,控制流量以避免接收方过载。

      • 拥塞控制:根据网络状况调整发送速率(慢启动、拥塞避免等算法)。

    • UDP 的特点
      • 无连接:直接发送数据,无需建立连接。

      • 不可靠交付:不保证数据到达,无确认、重传机制。

      • 低延迟:无握手、确认、重传等开销,传输速度快。

      • 保留数据边界:发送方发送的数据包边界在接收方保留,适合特定应用需求。

  • 典型应用场景
    • TCP 的适用场景

      需要高可靠性的场景:

      • Web 浏览(HTTP/HTTPS):确保网页内容完整加载。
      • 文件传输(FTP/SFTP):保证文件数据不丢失或损坏。
      • 电子邮件(SMTP/IMAP):邮件内容必须准确传递。
      • 数据库操作:事务性操作需严格保证数据一致性。

      长连接通信:

      • 远程终端(SSH/Telnet):用户输入需按序到达服务器。
      • API 调用(REST/gRPC):依赖可靠的双向通信。
    • UDP 的适用场景

      实时性优先于可靠性的场景:

      • 音视频流媒体(Zoom、直播):容忍少量丢包,但要求低延迟。
      • 在线游戏(MOBA、FPS):快速传输玩家操作,通过应用层补偿丢包。
      • VoIP(如 Skype):语音通话中延迟比偶尔杂音更影响体验。

      轻量级或广播通信:

      • DNS 查询:快速解析域名,单个请求-响应无需复杂连接。
      • 物联网传感器数据:周期性发送小数据包(如温度传感器)。
      • DHCP:局域网内动态分配 IP 地址。

15.UDP会进行握手吗

UDP(用户数据报协议不会进行握手。与TCP不同,UDP是一种无连接的协议,这意味着在发送数据之前,发送方和接收方之间不需要建立连接,也不需要通过握手(如TCP的三次握手)来同步通信状态。

  • 为什么UDP不需要握手?
    • 无连接特性

      • UDP在发送数据时,只需要知道接收方的IP地址和端口号,直接发送数据报即可,无需预先建立连接。
      • 例如:就像寄送快递时直接把包裹投递到对方门口,不需要先打电话确认对方是否在家。
    • 低延迟和高效性

      • 握手过程(如TCP的三次握手)会增加通信开销和延迟。对于实时性要求高的场景(如视频通话、在线游戏),UDP的直接传输能显著降低延迟。
      • UDP的头部仅有8字节(相比TCP的20-60字节),进一步减少了开销。
    • 不可靠传输

      • UDP不保证数据的可靠性、顺序性和完整性,因此无需通过握手协商连接参数(如初始序列号、窗口大小等)。
      • 如果数据丢失或乱序,UDP不会重传或排序,由上层应用自行处理。

16.什么服务默认使用UDP协议

  • DNS(域名系统)
    • 用途:将域名转换为IP地址(如 www.example.com93.184.216.34)。

      例外情况:当DNS响应数据超过512字节时(如较大的DNSSEC记录),会切换到TCP。

  • DHCP(动态主机配置协议)
    • 用途:为网络设备自动分配IP地址、子网掩码、网关等配置。
  • TFTP(简单文件传输协议)
    • 用途:传输小型文件(如路由器固件升级、引导文件)。
  • NTP(网络时间协议)
    • 用途:同步计算机和网络设备的时间。
  • SNMP(简单网络管理协议)
    • 用途:监控和管理网络设备(如路由器、交换机)。
  • RIP(路由信息协议)
    • 用途:在小型网络中动态更新路由表。
  • 组播服务(Multicast)
    • 用途:向一组特定设备同时发送数据(如流媒体、在线游戏广播)。
  • 实时音视频服务
    • 典型场景:VoIP(如Zoom、Skype)、在线游戏(如《英雄联盟》)、直播平台。
服务协议默认端口核心优势
DNSUDP53快速响应,适合小数据包
DHCPUDP67/68支持广播,简化配置
TFTPUDP69适合嵌入式设备,无连接开销
NTPUDP123低延迟,高精度时间同步
SNMPUDP161/162高效监控,适合小数据传输
RIPUDP520简化路由协议实现
组播UDP动态分配高效一对多通信
实时音视频UDP动态分配低延迟,容忍少量丢包

17.视频通话会使用TCP还是UDP,文字消息呢?

  • 视频通话:通常使用 UDP

    原因

    • 实时性要求高:视频通话(如语音、视频流)需要低延迟,丢包比延迟更可接受。
      • UDP 无连接、无需握手,直接发送数据包,减少延迟。
      • TCP 的三次握手和确认重传机制会显著增加延迟,不适合实时通信。
    • 容忍少量丢包:
      • 视频通话中,偶尔丢失一两个数据包(如帧)对用户体验影响较小,而 TCP 的重传会导致更大延迟。
      • 例如,WebRTC(用于实时音视频通信的框架)默认使用 UDP。
    • 支持组播/多点通信:
      • UDP 支持一对多(组播)通信,适合多人视频会议场景。

    典型技术

    • WebRTC:基于 UDP 实现 P2P 音视频传输(如 Zoom、微信视频通话)。
    • VoIP(网络电话):如 Skype、QQ 语音通话,使用 UDP 传输语音数据。
  • 文字消息:通常使用 TCP

    原因

    • 可靠性要求高:
      • 文字消息(如聊天记录)必须完整、有序地送达,不允许丢包或乱序。
      • TCP 的确认机制、重传机制和有序交付特性可以保证消息不丢失。
    • 无实时性压力:
      • 文字消息的传输延迟对用户体验影响较小,TCP 的延迟可以接受。
      • 例如,微信文字聊天基于 TCP,确保每条消息都能正确送达。

    例外情况

    • QQ 文字聊天:根据抓包分析,QQ 使用 UDP 传输文字消息。
      • 可能原因:QQ 可能通过自定义协议在 UDP 上实现可靠性(如手动重传、确认机制),以降低延迟。
      • 加密保护:消息内容加密,即使丢包或乱序,也能通过协议层修复。

18.解释ps -aux所有字段的含义

字段含义典型用途
USER进程所属用户识别资源占用者
PID进程唯一标识符终止或管理进程
%CPUCPU 占用百分比查找 CPU 密集型进程
%MEM内存占用百分比查找内存泄漏或内存占用高进程
VSZ虚拟内存大小评估进程总内存需求
RSS实际物理内存大小直接反映内存消耗
TTY关联的终端设备判断进程是否与终端相关
STAT进程状态诊断进程是否卡死或异常
START进程启动时间跟踪进程运行时长
TIME累计 CPU 时间统计进程的 CPU 使用量
COMMAND启动进程的命令或程序名识别进程功能或来源
  • 实际应用场景
    • 性能监控

      • 使用 ps aux --sort=-%cpu 按 CPU 占用率降序排列,快速定位资源占用高的进程。
      • 使用 ps aux --sort=-%mem 按内存占用率排序,排查内存泄漏。
    • 故障排查

      • 检查是否存在 D 状态(不可中断睡眠)的进程,可能是 I/O 阻塞导致。
      • 查找 Z 僵尸进程,需终止父进程或重启服务。
    • 进程管理

      • 通过 kill PID 终止异常进程。
      • 使用 ps aux | grep nginx 过滤特定进程(如 Nginx)。

19.Linux中如何判断上一条命令是否执行成功

  • 使用 $? 变量(最常用)
    # 执行命令
    command
    
    # 立即查看退出状态码
    echo $?
    

    原理:每个命令执行后会返回一个退出状态码(Exit Code),存储在特殊变量$?中:

    • 0:命令执行成功。
    • 0:命令执行失败(具体数值可能表示不同错误)。
  • 使用日志文件

    原理:将命令的输出或错误信息重定向到日志文件,后续检查日志内容。

    示例:

    # 将标准输出和错误输出写入日志文件
    command > output.log 2>&1
    # 查看日志文件
    cat output.log
    

    解释:

    • >:重定向标准输出(STDOUT)。
    • 2>&1:将标准错误(STDERR)重定向到标准输出。

20.如何修改系统默认时区,并同步网络时间

  • 修改系统默认时区
    • 使用 timedatectl 命令
      • 查看当前时区和可用时区

        timedatectl
        
        # 输出:
                       Local time: Tue 2025-07-15 07:06:39 UTC
                   Universal time: Tue 2025-07-15 07:06:39 UTC
                         RTC time: Tue 2025-07-15 07:06:39
                        Time zone: Etc/UTC (UTC, +0000)
        System clock synchronized: yes
                      NTP service: active
                  RTC in local TZ: no
        
      • 列出所有可用时区

        timedatectl list-timezones
        
        # 示例(搜索亚洲时区):
        timedatectl list-timezones | grep Asia
        
      • 设置新时区(以中国标准时间 Asia/Shanghai 为例):

        sudo timedatectl set-timezone Asia/Shanghai
        
      • 验证修改

        timedatectl
        
        # 输出:
                       Local time: Tue 2025-07-15 15:09:07 CST
                   Universal time: Tue 2025-07-15 07:09:07 UTC
                         RTC time: Tue 2025-07-15 07:09:07
                        Time zone: Asia/Shanghai (CST, +0800)
        System clock synchronized: yes
                      NTP service: active
                  RTC in local TZ: no
        
  • 同步网络时间
    • 使用 timedatectl 配置 NTP 自动同步
      • 启用并启动 NTP 服务(以 systemd-timesyncd 为例):

        sudo timedatectl set-ntp true
        
      • 验证 NTP 状态

        timedatectl
        

        输出中的 NTP service: active 表示已启用。

  • 验证配置
    • 检查系统时间和时区

      date
      timedatectl
      
    • 检查硬件时钟(RTC)是否同步

      sudo hwclock --show
      

21.如何使用curl访问页面

  • 最基础的 GET 请求
    curl https://www.baidu.com
    

    作用:向 https://www.baidu.com 发送一个默认的 GET 请求,并输出服务器返回的内容。

  • 查看响应头信息
    curl -I https://www.baidu.com
    

    作用:仅获取服务器的响应头信息(如 HTTP 状态码、Content-Type 等)。

  • 保存网页内容到文件
    curl -o baidu.html https://www.baidu.com
    

    作用:将 https://www.baidu.com 的内容保存到本地文件 baidu.html 中。

  • 发送 POST 请求
    • 提交表单数据
      # 登录一个表单接口
      curl -X POST https://api.example.com/login \
           -d "username=test&password=123"
      

      作用:向服务器提交表单数据(默认格式为 application/x-www-form-urlencoded)。

    • 提交 JSON 数据
      curl -X POST https://api.example.com/create \
           -H "Content-Type: application/json" \
           -d '{"name":"Alice", "age":30}'
      

      作用:提交 JSON 格式的数据(需手动指定 Content-Type)。

  • 添加自定义请求头
    curl -H "User-Agent: MyApp/1.0" https://example.com
    

    作用:修改请求头中的 User-Agent 字段(模拟浏览器或其他客户端)。

  • 使用 Cookie
    curl -b "session_id=12345" https://example.com
    

    作用:向服务器发送 Cookie(用于保持登录状态)。

  • 处理 HTTPS 认证
    • 忽略 SSL 证书验证
      curl -k https://192.168.1.1
      

      作用:跳过 SSL 证书验证(适用于自签名证书或测试环境)。

    • 使用客户端证书

      curl -v --cert client.crt --key client.key https://secure.example.com
      

      作用:通过客户端证书进行 HTTPS 认证(需提供 .crt.key 文件)。

  • 跟随重定向
    curl -L https://short.url
    

作用:自动跟随 HTTP 重定向(如 301/302 状态码)。

  • 上传文件

    • 通过 FTP 上传
      curl -T localfile.txt ftp://example.com/upload/
      

      作用:将本地文件 localfile.txt 上传到 FTP 服务器。

    • 通过 API 上传
      curl -X POST https://api.example.com/images \
           -H "Content-Type: multipart/form-data" \
           -F "image=@/home/user/photo.jpg"
      

      作用:通过 multipart/form-data 格式上传文件。

  1. 常见问题
    Q1: 如何查看 curl 的版本?
    curl --version
    
    Q2: 如何调试请求?

    使用 -v 参数查看详细请求和响应过程:

    curl -v https://example.com
    
    Q3: 如何发送 DELETE 请求?
    curl -X DELETE https://api.example.com/resource/123
    

22.如何使用curl和wget来下载文件到本地。

  • 使用 curl 下载文件
    • 基本用法
      • 下载并保留原文件名

        curl -O https://example.com/file.txt
        

        -O:自动使用 URL 中的文件名(如 file.txt)保存到当前目录。

      • 自定义保存路径和文件名

        curl -o /path/to/save/newfile.txt https://example.com/file.txt
        

        -o:指定本地保存的路径和文件名(小写 o)。

    • 处理重定向
      • 跟随重定向(如短链接跳转):

        curl -L -O https://short.url/file.txt
        

        -L:自动跟随 HTTP 重定向(301/302 状态码)。

    • 断点续传
      • 恢复中断的下载:

        curl -C - -O https://example.com/largefile.zip
        

        -C -:从上次中断的位置继续下载(适用于大文件)。

    • 验证 SSL 证书
      • 跳过 SSL 证书验证(仅限测试环境):

        curl -k -O https://self-signed-certificate.com/file.txt
        

        -k:忽略 SSL 证书错误(不推荐生产环境使用)。

    • 带认证的下载
      • 使用用户名和密码认证:

        curl -u username:password -O https://secure.example.com/protected_file.txt
        

        -u:指定认证凭据(格式为 username:password)。

    • 显示进度条
      • 实时显示下载进度:

        curl -# -O https://example.com/largefile.zip
        

        -#:显示进度条(适用于终端环境)。

  • 使用 wget 下载文件
    • 基本用法
      • 下载并保留原文件名

        wget https://example.com/file.txt
        
      • 自定义保存路径和文件名

        wget -O /path/to/save/newfile.txt https://example.com/file.txt
        

        -O:指定本地保存的路径和文件名(大写 O)。

    • 断点续传

      恢复中断的下载:

      wget -c https://example.com/largefile.zip
      

      -c:从上次中断的位置继续下载。

    • 静默下载

      不显示进度信息(适合脚本):

      wget -q https://example.com/file.txt
      

      -q:静默模式(无输出)。

    • 显示进度条

      显示下载进度:

      wget --show-progress https://example.com/largefile.zip
      
    • 带认证的下载

      使用用户名和密码认证:

      wget --user=username --password=password https://secure.example.com/protected_file.txt
      
    • 批量下载

      从文件读取多个 URL 下载:

      wget -i urls.txt
      

      urls.txt:每行包含一个文件的 URL(如 https://example.com/file1.txt)。

  • 常见问题与解决方案
    • 文件名乱码或路径错误
      • 问题:下载的文件名乱码或路径无效。

      • 解决:确保 URL 正确,手动指定 -o-O 参数。

        示例:

        curl -o /home/user/downloads/report.pdf "https://site.com/monthly/report.pdf"
        
    • 路径包含空格或特殊字符
      • 问题:路径中包含空格导致命令解析错误。

      • 解决:使用双引号包裹路径。

        示例(Windows):

        curl -o "C:\Temp Folder\file.zip" "https://host/special.zip"
        
    • 权限不足
      • 问题:无法写入目标目录。

      • 解决:使用sudo提升权限(Linux/macOS):

        sudo wget -O /usr/local/bin/ollama-linux-amd64.tgz https://ollama.com/download/ollama-linux-amd64.tgz
        
    • 代理设置
      • 问题:网络需要通过代理访问。

      • 解决:

        • curl

          curl -x http://proxy.example.com:8080 -O https://example.com/file.txt
          
        • wget

          wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com/file.txt
          
    • 验证文件完整性
      • 问题:下载后需确认文件未被篡改。

      • 解决:使用sha256sum 校验文件哈希值(需官方提供校验值):

        sha256sum ollama-linux-amd64.tgz
        
  • curl和wget的区别
    • 核心功能与设计理念
      特性curlwget
      核心定位多功能的数据传输工具,支持多种网络协议和复杂操作。专注于文件下载,功能简单直接,适合批量下载和递归下载。
      主要用途调试 API、发送请求(GET/POST/PUT 等)、上传/下载文件、处理复杂网络任务。下载文件、镜像网站、递归下载、断点续传等自动化下载任务。
      输出方式默认将响应内容输出到终端(标准输出),需通过参数保存到文件。直接将文件保存到本地磁盘,无需额外参数。
    • 协议支持
      协议curlwget
      HTTP/HTTPS
      FTP/FTPS
      SFTP
      SMTP/IMAP/POP3
      LDAP
      RTSP/Gopher
      • curl 支持更广泛的协议(如 SFTP、SMTP、LDAP 等),适合处理复杂网络请求。
        /site.com/monthly/report.pdf"
        
        
    • 路径包含空格或特殊字符
      • 问题:路径中包含空格导致命令解析错误。

      • 解决:使用双引号包裹路径。

        示例(Windows):

        curl -o "C:\Temp Folder\file.zip" "https://host/special.zip"
        
    • 权限不足
      • 问题:无法写入目标目录。

      • 解决:使用sudo提升权限(Linux/macOS):

        sudo wget -O /usr/local/bin/ollama-linux-amd64.tgz https://ollama.com/download/ollama-linux-amd64.tgz
        
    • 代理设置
      • 问题:网络需要通过代理访问。

      • 解决:

        • curl

          curl -x http://proxy.example.com:8080 -O https://example.com/file.txt
          
        • wget

          wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com/file.txt
          
    • 验证文件完整性
      • 问题:下载后需确认文件未被篡改。

      • 解决:使用sha256sum 校验文件哈希值(需官方提供校验值):

        sha256sum ollama-linux-amd64.tgz
        
  • curl和wget的区别
    • 核心功能与设计理念
      特性curlwget
      核心定位多功能的数据传输工具,支持多种网络协议和复杂操作。专注于文件下载,功能简单直接,适合批量下载和递归下载。
      主要用途调试 API、发送请求(GET/POST/PUT 等)、上传/下载文件、处理复杂网络任务。下载文件、镜像网站、递归下载、断点续传等自动化下载任务。
      输出方式默认将响应内容输出到终端(标准输出),需通过参数保存到文件。直接将文件保存到本地磁盘,无需额外参数。
    • 协议支持
      协议curlwget
      HTTP/HTTPS
      FTP/FTPS
      SFTP
      SMTP/IMAP/POP3
      LDAP
      RTSP/Gopher
      • curl 支持更广泛的协议(如 SFTP、SMTP、LDAP 等),适合处理复杂网络请求。
      • wget 主要支持 HTTP、HTTPS 和 FTP,适合常规下载任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值