运维面试题01

网络相关

tcp三次握手,四次挥手

三次握手(TCP 连接建立)

  1. SYN :客户端发送 SYN(seq=x)请求建立连接。

  2. SYN-ACK :服务器回复 SYN-ACK(seq=y,ack=x+1),表示同意连接。

  3. ACK :客户端发送 ACK(ack=y+1),连接建立。

目的:确保双方具备发送和接收能力,防止历史连接干扰。


四次挥手(TCP 连接断开)

  1. 客户端发送 FIN,请求断开连接,关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。

  2. 服务器回复 ACK,服务端进入 CLOSE_WAIT 状态。但仍可能有数据未发送完。

  3. 服务器发送 FIN,关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态,表示数据传输完毕。

  4. 客户端收到 FIN 后进入 TIME_WAIT 状态,发送 ACK 给服务端,服务端进入CLOSED 状态,至此完成四次握手。

TIME-WAIT 状态是为了确保客户端发送的 ACK 确实到达服务器,并且防止之前的连接数据包在网络中滞留,可能会影响未来的连接

服务器出现了大量TIME_WAIT状态如何检测和解决

1.检测其数量和信息:

复制代码
netstat -an | grep TIME_WAIT 

2.查看是否端口耗尽(短时间内连接数太多)

复制代码
ss -n | awk '/^tcp/ {++s[$1]} END {for(k in s) print k, s[k]}'

3.确认是否是客户端主动断开连接

tcpdump 抓包,查看 FIN、ACK 等行为,定位连接关闭一方

4.检查系统资源限制

复制代码
ulimit -n              # 当前最大打开文件数
cat /proc/sys/net/ipv4/ip_local_port_range  # 本地可用端口范围

常见解决方案

.1 修改服务器内核参数

复制代码
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1      # 表示开启TCP连接中TIME-WAIT sockets的快速回收。
net.ipv4.tcp_fin_timeout = 10    # 缩短 FIN_WAIT 超时时间
net.ipv4.ip_local_port_range = 1024 65000  # 扩大可用端口范围

2.提高资源限制:

复制代码
ulimit -n 65535  # 临时提高最大文件句柄数,防止资源耗尽

3.优化业务侧逻辑:

  • 避免频繁创建短连接,尽可能使用 长连接池

  • 对于客户端频繁主动断开连接的情况,考虑连接重用或引入 连接代理(如 Nginx)

4.使用四层负载均衡(如 LVS):

LVS 属于内核态转发,性能极高,避免了中间件层产生大量连接。

讲一下ospf协议

  • 特点:基于链路状态算法,收敛快,无自环,支持层次化网络,使用区域划分。

  • 类型:链路状态路由协议

  • 工作原理

    • 发现邻居:Hello 包建立和维护邻居关系。

    • 链路状态信息交换:用 DD、LSR、LSU、LSAck 交换链路状态。

    • 构建拓扑图:收集信息形成 LSDB,构建最短路径树。

    • 计算路由:用 SPF 算法算最佳路径。

  • 应用场景:大型企业网、数据中心网络。

R1\] ospf 1 # 创建 OSPF 实例 1 \[R1-ospf-1\] area 0 # 使用 area 0 \[R1-ospf-1-area-0.0.0.0\] network 10.0.12.0 0.0.0.255 # 宣告直连网段 display ospf peer #看邻居表 display ip routing-table #看路由表 ### 服务器 linux相关的 #### 常见端口: 1. **22 (SSH)** * **用途**:安全远程登录到服务器。 * **命令检查** :`ss -tulnp | grep :22` 或 `netstat -tulnp | grep :22` 1. **80 (HTTP)** * **用途**:Web 服务器使用的默认端口,用于未加密的 HTTP 通信(如 Nginx、Apache)。 * **命令检查** :`curl -I http://your-server-ip` 1. **443 (HTTPS)** * **用途**:安全 HTTP 通信,使用 SSL/TLS 加密的 Web 服务器(如 Nginx、Apache)。 * **命令检查** :`curl -I https://your-server-ip` 1. **3306 (MySQL)** * **用途**:MySQL 数据库默认监听端口。 * **命令检查** :`mysql -u root -p -h 127.0.0.1 -P 3306` 1. **5432 (PostgreSQL)** * **用途**:PostgreSQL 数据库默认监听端口。 * **命令检查** :`pg_isready -h localhost -p 5432` 1. **6379 (Redis)** * **用途**:Redis 内存数据库的默认端口。 * **命令检查** :`redis-cli -h localhost -p 6379 ping` 1. **8080 (常用于 Web 应用)** * **用途**:备用 Web 服务器端口,Tomcat、Jenkins 等常用。 * **命令检查** :`curl -I http://your-server-ip:8080` 1. **8443 (HTTPS 备用端口)** * **用途** :Tomcat、Spring Boot 应用的 HTTPS **端口**。 * **命令检查** :`curl -I https://your-server-ip:8443` 1. **25 (SMTP)** * **用途**:邮件传输协议(SMTP),用于发送邮件。 * **命令检查** :`telnet smtp.example.com 25` 1. **53 (DNS)** * **用途**:DNS 解析服务(如 BIND)。 * **命令检查** :`nslookup google.com 8.8.8.8` #### **谈谈进程,线程,协程** **协程** 不是进程也不是线程,而是一个**特殊的函数**,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。 一个进程可以包含多个线程,一个线程也可以包含多个协程。简单来说,一个线程内可以由多个这样的特殊函数在运行,但是有一点必须明确的是,一个线程的多个协程的运行是串行的 **进程**是资源分配的基本单位,一个进程拥有自己的内存空间、文件描述符等。如大型后台服务 **线程**是程序执行的最小单位,一个进程可以包含多个线程。线程之间共享进程的资源,因此比进程更轻量。用于需要共享资源和高效并发的任务,如计算密集型或多任务的程序 **协程**并不是操作系统级的线程或进程,而是由程序内部实现的轻量级线程,作用与I/O密集型任务,如网络请求、爬虫和异步数据处理。 #### **为何du和df统计结果不一致?** 用户删除了大量的文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它。 然而如果此时还有运行的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。 可通过 lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du和df统计结果不一致。 #### **swap分区的作用** swap分区是一个交换分区,当物理内存不足时, swap分区会释放一部分内存给当前正在运 行的程序使用。这部分空间一般来自那些很长时间没有运行过的程序,系统将这部分空间 临时存放在swap空间中,给那些内存占有率比较高的程序使用。 #### **遇到磁盘空间不足的报错 , 你应该如何处理** 可能一: 使用 df -h 命令查看磁盘空间的使用情况,确定哪个目录占用的磁盘空间过高 确定目录后,使用 du -h 命令进行逐级定位,确认到占用空间最大的大文件 查看文件内容,确认一下是否需要保留,如果需要保留就通过压缩导出,不需要保 留可以直接删除,或者对磁盘进行扩容 或者可以直接使用 find 命令查找目录下大于400MB的文件名称,然后进行删除 fi nd 目录 -size +400M 可能二: 使用 df -h 命令并不能发现大文件,那么可能是文件被删除,但是进程仍然在调用 这个文件 此时可以通过 lsof \| grep delete ,找到占用的进程,把这个进程kill掉然后重启 服务器即可 #### **服务器系统日志放在哪里** /var/log/message :系统启动后的信息和错误日志 /var/log/security :与系统安全相关的日志 /var/log/maillog :与系统邮件相关的日志 /var/log/cron :与定时计划任务相关的日志 /var/log/boot.log \& /var/log/dmesg :与系统启动相关的日志 **说 一 下Nginx做反向代理时常用的算法有哪些** · rr :轮询算法,将用户的请求平均的分配到后台的服务器上,如果后台服务器宕机,会 自动将宕机服务器清除 · wrr :加权轮询,根据权重分配请求,权重越大,处理的请求的越多 · ip_hash:根据请求的hash值进行分配, hash值相同的会被分配到同一台机器上 fair:根据后台服务器的响应时间进行分配,响应时间短的优先分配,必须下载nginx的 upstream_fair模块才能使用 · least_conn:哪台服务器的连接数最少,就分配到那台服务器上 ### 数据库 #### **MySQL数据库的备份方式** · 增量备份 · 异地备份 · 重要的数据库会在设计架构时,搭建一个一摸一样的数据库做完整备份 · 通过命令行备份: mysqldump -uroot -p 数据库名 \> \*.sql文件 · 通过Rsync+Inotify进行冷备 · 设计架构时,会搭建数据库的集群,进行热备 #### **数据库常用的引擎有什么 , 说 一 下区别** MYISAM:性能优异,查询速度快;但是不支持事务、锁、外键约束等高级功能 INNODB:支持事务、锁、外键约束等高级功能 MEMORY:将数据储存在内存中,方便快速读写 #### **在数据库查询中,发现查询速度变慢,你如何定位和处理** --第一时间排查是否是全局资源瓶颈导致的,使用 `top` / `htop` / `vmstat` 查看服务器负载、内存、IO 等; --不是的话定位到数据库相关,对慢查询日志分析( less /var/log/mysql/mysql-slow.log\*\*)观察是否存在锁等待(show enging innodb status;) 查看当前活跃连接和 SQL 执行情况(show processlist;) 用explain select 检查是否使用了索引、是否全表扫描、是否 JOIN 不当等。 **加索引** :如果 EXPLAIN 显示没有使用索引,会考虑在 `WHERE`、`JOIN` 或排序字段上加合适索引; **SQL 改写** :避免使用 `SELECT *`,拆分过于复杂的大 SQL,减少嵌套子查询; **减少数据量**:增加 LIMIT 分页、按需加载、或使用物化视图; **调整 MySQL 参数** :如 `innodb_buffer_pool_size`、`query_cache_size`、`tmp_table_size` 等; **拆库分表 / 读写分离 / 缓存引入**:如果是架构性瓶颈,考虑提升读写能力。 #### **MySQL为什么会出现锁表的情况 , 怎么解锁 , 如何避免这种情况的出现锁** 高并发情况下造成的io拥堵 数据主从同步失败 使用命令进行锁表: lock · 解锁: unlock · 增加数据库的缓存可以避免锁表的情况出现

相关推荐
masx2005 分钟前
升级uptime-kuma版本2.0.0-beta.2的cloudflared版本到2025.4.0
运维·后端
杨凯凡9 分钟前
Linux安全防护:全方位服务安全配置指南
linux·运维·服务器·安全
李菠菜12 分钟前
CentOS系统中重置Root用户密码的完整步骤详解
linux·运维
Nightwish517 分钟前
Linux随记(十七)
linux·运维·服务器
付出不多44 分钟前
Linux——系统安全及应用
linux·运维·系统安全
数巨小码人3 小时前
Linux常用指令
linux·运维·服务器
Linux运维老纪3 小时前
Linux之七大难命令(The Seven Difficult Commands of Linux)
linux·运维·服务器·云计算·运维开发
张书名4 小时前
高性能服务器配置经验指南3——安装服务器可能遇到的问题及解决方法
运维·服务器
前进的程序员5 小时前
在Linux驱动开发中使用DeepSeek的方法
linux·运维·服务器·人工智能