网络相关
tcp三次握手,四次挥手
三次握手(TCP 连接建立)
-
SYN :客户端发送
SYN
(seq=x)请求建立连接。 -
SYN-ACK :服务器回复
SYN-ACK
(seq=y,ack=x+1),表示同意连接。 -
ACK :客户端发送
ACK
(ack=y+1),连接建立。
目的:确保双方具备发送和接收能力,防止历史连接干扰。
四次挥手(TCP 连接断开)
-
客户端发送
FIN
,请求断开连接,关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。 -
服务器回复
ACK
,服务端进入 CLOSE_WAIT 状态。但仍可能有数据未发送完。 -
服务器发送
FIN
,关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态,表示数据传输完毕。 -
客户端收到 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 · 增加数据库的缓存可以避免锁表的情况出现