大厂面试网络协议高频15问:TCP/IP+HTTP+DNS全覆盖
涵盖TCP、HTTP、DNS等15道网络协议高频面试题,每题含考察点与答案方向,助你全面备战网络协议面试。
背景介绍
网络协议这块,说实话我之前是有点轻敌的。觉得TCP三次握手四次挥手背下来就行了,结果面试官一问"为什么是三次不是两次"、"TIME_WAIT太多怎么办",我就傻眼了。后来我把网络协议的高频题全部整理了一遍,发现其实套路很固定,关键是理解每个协议设计的"为什么",而不是死记硬背。这15道题是我面试过程中遇到频率最高的,分享给大家。
一、TCP(5题)
1. 三次握手和四次挥手的过程?
考察点:TCP连接管理
三次握手:客户端发SYN→服务端回SYN+ACK→客户端发ACK。为什么是三次?因为三次握手保证了双方都能确认对方的发送和接收能力正常,两次无法确认服务端的发送能力和客户端的接收能力。四次挥手:主动方发FIN→被动方回ACK→被动方发FIN→主动方回ACK。为什么是四次?因为TCP是全双工的,被动方收到FIN后可能还有数据没发完,所以ACK和FIN分开发。面试官最爱追问的就是这些"为什么"。
2. TCP拥塞控制机制?
考察点:流量调节算法
四个阶段:慢启动(cwnd从1开始指数增长)、拥塞避免(cwnd线性增长)、快重传(收到3个重复ACK立即重传,不等超时)、快恢复(cwnd减半而非降为1)。关键概念:慢启动阈值ssthresh,cwnd超过ssthresh后进入拥塞避免阶段。面试官可能追问:BBR算法了解吗?BBR是基于带宽和RTT的拥塞控制,不像传统算法基于丢包判断,在高速长肥网络中表现更好。
3. TCP流量控制机制?
考察点:接收端速率控制
流量控制通过滑动窗口实现,接收端在ACK中携带窗口大小rwnd告知发送端还能接收多少数据。零窗口问题:接收端窗口为0时,发送端停止发送,但会启动持续计时器定期发送零窗口探测报文,防止死锁。糊涂窗口综合征:接收端缓冲区快满时每次只腾出很少空间,发送端每次只发很少数据,效率极低。解决方案:Nagle算法(发送端攒够数据再发)和Clark方案(接收端等缓冲区有足够空间再通知)。
4. TIME_WAIT状态是什么?为什么需要?太多怎么办?
考察点:连接关闭细节
TIME_WAIT是主动关闭方在发送最后一个ACK后进入的状态,持续2MSL(Maximum Segment Lifetime)。存在原因:一是确保最后一个ACK能到达被动方(如果丢失,被动方会重发FIN,主动方可以重发ACK);二是确保本次连接的所有报文在网络中消失,避免影响新连接。太多TIME_WAIT的解决方案:开启tcp_tw_reuse(允许将TIME_WAIT连接用于新的TCP连接);调整tcp_max_tw_buckets;长连接替代短连接。注意:tcp_tw_recycle在NAT环境下有坑,不推荐使用。
5. TCP粘包问题?
考察点:应用层协议设计
严格来说TCP不存在"粘包"问题,因为TCP是面向字节流的协议,没有消息边界的概念。所谓的粘包是应用层的问题——发送方连续发送的数据被接收方一次性读出。解决方案:消息定长(每个消息固定长度,不够补齐);使用特殊分隔符(如HTTP的\r\n\r\n);消息头包含长度字段(最常用,如TLV格式)。面试官可能追问:UDP有粘包问题吗?没有,因为UDP是面向报文的,每个UDP包都有明确边界。
二、HTTP(5题)
6. HTTP/1.1、HTTP/2、HTTP/3的区别?
考察点:HTTP协议演进
HTTP/1.1:持久连接(Keep-Alive)、管道化(但存在队头阻塞)、Host头支持虚拟主机。HTTP/2:二进制分帧、多路复用(一个连接上并行多个请求,解决HTTP层队头阻塞)、头部压缩(HPACK)、服务器推送。HTTP/3:基于QUIC(UDP)替代TCP,解决了TCP层的队头阻塞;0-RTT连接建立;连接迁移(基于Connection ID而非四元组)。面试官追问:HTTP/2还有队头阻塞吗?HTTP层没有了,但TCP层还有——一个TCP包丢失会阻塞所有流。
7. HTTPS的原理?
考察点:安全通信机制
HTTPS = HTTP + TLS。TLS握手过程:客户端发Client Hello(支持的TLS版本和加密套件)→服务端回Server Hello + 证书→客户端验证证书(CA签名链)→客户端生成预主密钥,用服务端公钥加密发送→双方通过预主密钥生成会话密钥→后续通信使用对称加密。面试官追问:为什么不全用非对称加密?因为非对称加密性能差,只用于密钥交换,数据传输用对称加密。TLS 1.3简化了握手,支持1-RTT甚至0-RTT。
8. 常见HTTP状态码?
考察点:协议语义理解
200成功;301永久重定向(浏览器会缓存);302临时重定向;304未修改(缓存命中);400请求语法错误;401未认证;403禁止访问;404未找到;500服务器内部错误;502网关错误;503服务不可用;504网关超时。面试官常问:301和302的区别?301是永久重定向,搜索引擎会更新索引;302是临时重定向,搜索引擎保留原URL。还有:502和504的区别?502是上游服务返回了无效响应,504是上游服务超时无响应。
9. HTTP缓存策略?
考察点:缓存机制设计
强缓存:Expires(HTTP/1.0,绝对时间)和Cache-Control(HTTP/1.1,max-age相对时间),命中则不请求服务器。协商缓存:Last-Modified/If-Modified-Since(基于修改时间)和ETag/If-None-Match(基于内容哈希),命中返回304。优先级:Cache-Control > Expires > ETag > Last-Modified。面试官追问:ETag和Last-Modified怎么选?ETag更精确(文件内容没变但修改时间变了不会误判),但ETag计算有性能开销。一般静态资源用强缓存+文件名hash,HTML用协商缓存。
10. Cookie和Session的区别?
考察点:会话管理机制
Cookie存储在客户端,Session存储在服务端。Session通过Cookie中的SessionID关联(也可以通过URL重写)。Cookie有大小限制(4KB),Session理论上无限制但占用服务端内存。安全性:Cookie可以被客户端修改和窃取,Session更安全但需要考虑分布式场景下的共享问题(通常用Redis存储Session)。Token方案(JWT)是另一种选择:无状态、适合分布式,但无法主动失效。面试官追问:Cookie的SameSite属性?Strict(完全禁止第三方Cookie)、Lax(导航到目标网站时携带)、None(允许但需Secure)。
三、DNS(2题)
11. DNS解析过程?
考察点:域名解析机制
浏览器缓存→操作系统缓存→本地DNS服务器→根域名服务器→顶级域名服务器→权威域名服务器。具体流程:本地DNS先查缓存,没有则向根域名服务器查询,根返回对应顶级域名服务器地址;本地DNS再查询顶级域名服务器,获取权威域名服务器地址;最后查询权威域名服务器获取IP。这个过程是递归+迭代结合的:客户端到本地DNS是递归,本地DNS到各级域名服务器是迭代。面试官追问:DNS用的是TCP还是UDP?默认UDP,但区域传送(主从同步)用TCP。
12. DNS劫持是什么?如何防范?
考察点:安全防护意识
DNS劫持是攻击者篡改DNS响应,将域名解析到恶意IP。常见场景:运营商劫持(插入广告)、中间人攻击、DNS服务器被入侵。防范措施:使用HTTPDNS(绕过传统DNS,直接向HTTP接口请求IP);DNS over HTTPS(DoH)或DNS over TLS(DoT)加密DNS查询;DNSSEC验证响应真实性;使用可信DNS服务器(如8.8.8.8、1.1.1.1)。我在项目中用过HTTPDNS,在移动端效果特别好,避免了运营商劫持的问题。
四、其他(3题)
13. CDN原理?
考察点:内容分发网络
CDN通过在全球部署边缘节点,将源站内容缓存到离用户最近的节点。用户请求时,DNS将域名解析到最近的CDN节点(基于Anycast或DNS智能解析);CDN节点如果有缓存直接返回,没有则回源获取并缓存。关键概念:回源率(CDN缓存命中率越低回源越多)、缓存策略(不同资源设置不同TTL)、预热(主动将内容推送到CDN节点)。面试官追问:CDN和反向代理的区别?CDN是分布式部署在各地的缓存网络,反向代理通常集中部署,CDN更侧重"就近访问"。
14. WebSocket原理?
考察点:全双工通信
WebSocket通过HTTP升级握手建立连接:客户端发Upgrade: websocket请求,服务端回101 Switching Protocols,之后切换为WebSocket协议进行全双工通信。相比HTTP轮询,WebSocket只需一次握手,后续通信开销极小(帧头2-10字节)。适用场景:即时通讯、实时数据推送、在线协作。面试官追问:WebSocket和SSE的区别?SSE是服务端向客户端的单向推送,基于HTTP,更简单;WebSocket是双向通信,功能更强但实现更复杂。
15. 跨域解决方案?
考察点:浏览器安全策略
同源策略:协议+域名+端口相同才算同源。跨域解决方案:CORS(最标准,服务端设置Access-Control-Allow-Origin等响应头);JSONP(只支持GET,利用script标签不受同源限制);代理服务器(开发环境用webpack-dev-server或nginx代理);postMessage(跨窗口通信)。CORS分简单请求和非简单请求,非简单请求会先发OPTIONS预检请求。面试官追问:Cookie跨域怎么处理?设置withCredentials + 服务端Access-Control-Allow-Credentials + Allow-Origin不能是*。
心得建议
网络协议面试的核心是理解"为什么这样设计",而不是背诵流程。三次握手为什么是三次、TIME_WAIT为什么存在、HTTP/2为什么要多路复用——这些设计背后都有明确的问题驱动。建议用抓包工具(Wireshark)实际观察TCP握手挥手和HTTP请求响应,有了直观感受后再理解理论会容易很多。另外,网络协议经常和实际场景结合考察,比如"短连接太多TIME_WAIT怎么处理"、"如何设计一个推送系统",这类题需要把知识点串联起来。
FAQ
Q:网络协议面试需要看RFC吗?
不需要通读RFC,但了解关键RFC的要点(如RFC 2616/7540/9000)会非常加分。
Q:TCP和UDP怎么选?
需要可靠传输用TCP,需要低延迟或广播用UDP。现代方案可以用QUIC(基于UDP的可靠传输)。
Q:HTTPS面试重点是什么?
TLS握手过程、证书验证链、对称/非对称加密的配合使用,以及TLS 1.3的改进。