第十一篇:网络与操作系统基础——后端工程师的“底层常识“ 别再背TCP三次握手的细节了你只需要知道为什么握手要三次而不是两次写在前面网络和操作系统是后端工程师的底层功底。面试考这块不要求你像网工一样深但核心概念必须懂而且要能和你日常开发联系起来。这篇文章的任务让你用常识理解网络和OS的基础概念而不是背一堆RFC文档。一、TCP三次握手和四次挥手面试必问但别背状态机这是面试考频最高的网络题。但很多人的回答就是背SYN→SYN-ACK→ACK面试官一追问就懵了。1.1 三次握手建立连接为什么要三次不能两次吗这是面试官最想听的。假设只有两次客户端发SYN → 服务端。服务端回SYN-ACK → 客户端连接建立。问题在哪里如果客户端发的第一个SYN在网络里迷路了客户端超时后重新发了第二个SYN并建立了连接。过了一会儿第一个迷路的SYN突然到达服务端服务端以为是新连接回了个SYN-ACK但客户端根本不认它没有在等这个连接。服务端就白白浪费资源等一个永远不会来的ACK。三次握手的目的就是让双方都确认对方有收发能力。第一次客户端→服务端客户端说我能发。第二次服务端→客户端服务端回我收到了我也能发。第三次客户端→服务端客户端回我也收到了同时告诉服务端你发给我的信息我确认收到了你的发能力我也验证过了。面试官追问“第三次握手可以带数据吗”理论上可以但实际上不能。因为第三次握手时服务端还不知道客户端的IP和端口是否有效如果带了数据万一客户端是伪造的服务端白白处理了数据容易被攻击SYN Flood。所以第三次握手不携带数据纯ACK包。1.2 四次挥手断开连接为什么挥手要四次因为TCP是全双工双向通信关闭要分两步客户端说我不发了FIN→ 服务端说收到ACK→ 客户端→服务端方向关闭。服务端说我也不发了FIN→ 客户端说收到ACK→ 服务端→客户端方向关闭。TIME_WAIT面试高频追问主动关闭的一方先发FIN的那方进入TIME_WAIT状态持续2MSLMaximum Segment Lifetime最大报文生存时间通常2分钟。为什么要有TIME_WAIT两个原因保证最后一个ACK被对方收到如果最后一个ACK丢了服务端会重发FIN客户端在TIME_WAIT里能收到并重发ACK。让网络中残留的旧数据包消失防止旧连接的数据包被新连接误收。二、TCP vs UDP面试必问对比TCPUDP连接面向连接三次握手无连接可靠性可靠确认重传不可靠丢了不管顺序保证顺序不保证顺序速度慢开销大快轻量场景HTTP、FTP、MySQLDNS、视频通话、游戏面试官追问“既然UDP不可靠为什么视频通话用UDP”因为视频通话可以容忍偶尔丢帧但不能容忍延迟。TCP的丢包重传会导致画面卡顿等重传包UDP丢了就丢了画面继续走最多是短暂花一下。用可靠性换实时性。HTTP/3引入了基于UDP的QUIC协议结合了TCP的可靠性和UDP的低延迟是2026年面试的一个新增考点。QUIC在UDP之上实现了类似TCP的拥塞控制、丢包重传、加密并且解决了TCP的队头阻塞问题。你如果在面试里主动提到QUIC面试官会觉得你关注了技术演进。三、HTTP协议后端天天打交道3.1 HTTP/1.1 vs HTTP/2 vs HTTP/3版本核心特点问题HTTP/1.1持久连接keep-alive、管道化队头阻塞同域名只能6个并发连接HTTP/2多路复用一个连接并发处理多个请求、头部压缩、服务器推送虽然解决了HTTP层面的队头阻塞但TCP层面的队头阻塞依然存在一个包丢了TCP会堵住后面的流HTTP/3基于UDP的QUIC协议彻底解决TCP的队头阻塞减少连接建立时间0-RTT面试官追问“HTTP/2的多路复用和HTTP/1.1的管道化有什么区别”HTTP/1.1的管道化虽然可以一次发多个请求但响应必须按请求顺序返回第一个响应没回来后面的都得等着。HTTP/2的多路复用允许多个请求和响应交错发送彻底解决了这个问题。但HTTP/2依然跑在TCP上TCP层如果有丢包包1丢了要重传TCP的队头阻塞依然会卡住后续所有流——这就是HTTP/3用UDP的根本原因。3.2 HTTPS加密原理HTTPS HTTP SSL/TLS加密层。面试常问“HTTPS的加密过程是什么”简单说客户端请求服务端服务端返回SSL证书包含公钥。客户端验证证书是否可信CA签名。客户端生成一个对称加密密钥Session Key用服务端的公钥加密后发给服务端。服务端用私钥解密拿到Session Key。之后所有通信都用对称加密效率高。为什么不用非对称加密全程因为非对称加密太慢RSA比AES慢几百倍。所以用非对称加密安全地交换对称密钥然后用对称加密高效地传输数据。3.3 常见的HTTP状态码面试必问状态码含义场景200OK请求成功201Created创建成功POST301永久重定向域名换了302临时重定向登录后跳转304Not Modified缓存有效走缓存400Bad Request参数错误401Unauthorized未认证没登录403Forbidden没权限404Not Found资源不存在429Too Many Requests限流了500Internal Server Error服务器代码报错502Bad Gateway网关代理的服务挂了503Service Unavailable服务不可用可能正在重启504Gateway Timeout网关超时四、Linux常用命令后端必备面试官会问线上接口慢你怎么排查这要求你熟悉基本的Linux命令。4.1 CPU排查# 看整体CPU负载1分钟、5分钟、15分钟平均负载top# 或者更直观的htop# 看具体的每个CPU核心使用率mpstat-PALL1load average的含义面试常问三个数字分别是1分钟、5分钟、15分钟的平均负载正在运行等待运行的进程数。如果这个数 CPU核数说明系统过载了。4.2 内存排查# 查看内存总使用情况free-h# 看哪个进程占用内存最多按RES排序psaux--sort-%mem|head-204.3 磁盘排查# 看磁盘空间各个分区的使用率df-h# 看当前目录下文件/文件夹大小找大文件du-sh*|sort-hr|head-204.4 网络排查# 查看端口监听情况看服务有没有启动netstat-tlnp# 新版Linux推荐用ss-tlnp# 测试网络连通ping192.168.1.1# 跟踪路由traceroutegoogle.com# 查看网络连接状态统计netstat-n|awk/^tcp/ {S[$NF]} END {for(a in S) print a, S[a]}4.5 Java专用排查Java进程# 找Java进程的PIDjps-l# 或者ps-ef|grepjava# 看JVM堆内存使用情况GC情况jstat-gcutil[pid]1000# 每秒刷新一次# 看线程栈排查死锁jstack[pid]thread_dump.txt# 看堆内存快照排查OOMjmap -dump:live,formatb,fileheap.hprof[pid]面试官追问“线上CPU飙高怎么排查”加分回答“三步走。第一top找到CPU最高的进程PID。第二top -H -p [pid]找到该进程里CPU最高的线程ID转成十六进制。第三jstack [pid] stack.log在日志里搜索那个线程的十六进制ID定位到具体代码行。通常不是死循环就是频繁GC。”五、IO模型面试加分项面试官偶尔会问NIO和BIO的区别是什么5.1 五种IO模型模型大白话阻塞IOBIO等数据来了再返回没来就一直等着非阻塞IONIO问一下数据来了吗没来就回去干别的过会再来问IO多路复用select/epoll一个线程同时监控多个连接哪个有数据就处理哪个信号驱动IO数据来了发个信号通知我不常用异步IOAIO数据准备好了直接通知我我不用自己复制Java AIO用得少5.2 后端工程师只需要记住两个① BIO阻塞IOTomcat 7之前用的。每个请求一个线程线程数并发数1000个并发就要1000个线程资源消耗大。② NIO非阻塞IO 多路复用Netty、Tomcat 8用的。一个线程可以处理成千上万个连接通过Selector哪个连接有数据就读哪个。epoll为什么比select/poll好面试常问select每次调用要遍历所有文件描述符FD找到有事件的O(n)。有1024个FD的限制。poll和select类似但去掉了1024的限制。epoll内核直接告诉你哪些FD有事件不用遍历O(1)。Redis、Nginx、Netty底层都用的epoll。六、面试官真正想听什么场景1“一个HTTP请求从浏览器到服务端经过哪些步骤”这是一个综合性问题考察你的网络知识广度。加分回答浏览器输入URL → DNS解析域名转IP→ TCP三次握手建立连接 → 浏览器发起HTTP请求如果是HTTPS先TLS握手→ 请求经过网关、负载均衡到达服务器 → 服务器处理 → 返回响应 → 浏览器解析渲染。这个过程中每个环节都可能成为性能瓶颈DNS解析慢、TCP握手慢、服务端处理慢、网络传输慢。场景2“线上接口响应慢怎么排查”加分回答实战思路先看是哪个环节慢。首先排除网络ping看延迟curl -w看DNS解析时间和TTFBTime To First Byte。再看服务端top看CPUfree看内存jstat看GC频率。如果GC频繁dump堆分析。如果CPU正常但响应慢可能是数据库慢查询看MySQL的慢查询日志。顺着链路逐层排查总能找到根因。场景3“TCP连接数太多怎么办”加分回答“TIME_WAIT太多会导致端口被占用新连接建立不了。可以调整内核参数net.ipv4.tcp_tw_reuse1和net.ipv4.tcp_tw_recycle1注意tcp_tw_recycle在NAT环境下有坑会误判同一源IP为同一个客户端。如果是ESTABLISHED太多说明并发连接太高需要检查是否有连接泄露未正确关闭连接池或者考虑增加服务器资源。在云原生环境下通常会配置spring.datasource.hikari.maximum-pool-size来控制连接池大小避免连接数打满。”小结核心概念大白话面试考点三次握手确认双方都能收发为什么不是两次四次挥手双向分别关闭TIME_WAIT为什么存在TCP vs UDP可靠但慢 vs 快但可能丢包视频用UDP、支付用TCPHTTP/1.1 vs 2 vs 3逐步解决队头阻塞QUIC基于UDPHTTPSHTTP加密非对称加密交换对称密钥HTTP状态码常见错误码502/504/429含义Linux排查top/free/netstat/jstack线上CPU飙高怎么查IO模型阻塞 vs 非阻塞epoll为什么比select快记住一句话网络和操作系统基础是后端工程师区分会用框架和真懂底层的分水岭。遇到线上问题能想到用Linux命令排查的人和只会重启的人是两个档次的工程师。下一篇我们讲设计模式——23种模式本质上就是6种原则Spring里到底用了哪些设计模式把设计模式还原成解决特定问题的套路。下期见。