最近帮几个准备大厂面试的朋友做了几轮模拟面试,发现一个特别有意思的现象:很多人聊分布式、聊数据库能讲十分钟,但一被问到网络协议的底层细节,立刻开始背概念。TCP三次握手背得滚瓜烂熟,被追问“为什么不能是两次”就卡壳;状态码能顺口报出两百多个,但线上同时遇到503和504却说不清到底谁出了问题。这篇文章把网络协议、HTTP、TCP/IP中最常被问到的八个高频问题整理出来,从面试官为什么要问、回答时怎么组织语言、到最可能出现的追问,按真实面试场景完整过一遍。无论校招还是社招,只要岗位碰后端、客户端、测试或运维,这套内容都值得你花两天时间吃透。
简单说一下这八问分别是什么:网络分层模型怎么理解、TCP三次握手为什么不能省、四次挥手的细节与TIME_WAIT、TCP与UDP的取舍、TCP可靠传输如何实现、HTTP状态码与请求方法的区别、HTTP/1.1到HTTP/2的演进、HTTPS的加密逻辑与证书。每一问我都会拆开讲,最后再补一段线上排查经验,这份附赠内容在面试之外真能救命。
1. 分层模型:面试开场最常见的送分题,别在这里翻车
1.1 先想清楚“分层到底分几层”
面后端岗十次里至少有八次,第一个协议问题会落在“请说说你对网络分层的理解”。很多人张口就背OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。能背完整只是基础操作,面试官真正想看的是你懂不懂“为什么需要分层”。各层各司其职,上层只需要调用下层的接口,不需要关心下层怎么实现;下层升级换代,上层代码不用跟着改。这就是分层最大的价值:隔离变化,允许各层独立演进。这句话一出来,面试官基本知道你不是死记硬背。
实际互联网跑的是TCP/IP四层模型:网络接口层、网络层、传输层、应用层。OSI七层里的会话层和表示层,在TCP/IP模型里基本被并进了应用层;网络接口层则把物理层和数据链路层揉到一起。标准参考模型是理论,工程落地做了收敛。回答时最好主动说一句“面试里问OSI七层是看理论功底,实际开发和抓包看的是TCP/IP四层”,这句话能瞬间拉开差距。很多冲突都出在分层边界不清晰,比如一个加密请求到底在哪一层做、会话状态在哪一层维护,把分层想明白了,这些问题的答案自然就清楚了。
1.2 HTTP、TCP、IP各自待在哪一层,对应什么问题
分层模型直接决定了后面所有问题的定位。HTTP属于应用层,解决客户端和服务端怎么组织数据语义的问题,请求方法、路径、状态码、Header的规则都在HTTP这一层。TCP属于传输层,负责把数据不丢、不乱、不快不慢地送到对端,它是可靠传输真正的主角。IP属于网络层,解决“数据包在网络里怎么寻址和路由”的问题。这三层的职责完全不同,面试的时候不要混着答。
我用寄快递来类比:IP是快递公司的分拣与运输网络,负责把包裹从一个城市送到另一个城市;TCP是快递的保价和签收确认服务,负责跟踪包裹有没有完整到达,没到就重新派送;HTTP是信封里那封信的书写格式,写信人和收信人按照同一个格式才能读懂彼此的意思。三个角色在不同高度配合,任何一层出问题,用户体验都会断掉。这个类比面试时很有用,因为面试官能立刻判断出你明白它们不是平行概念,而是层层封装的关系。
提示:完整表述是“HTTP报文作为TCP的负载,TCP段作为IP数据报的负载,逐层封装”。这个封装关系很常被追问,能补充一句“TCP数据太大触发分片发生在IP层”更稳妥,顺着这点还能聊到MTU,提前想一下是有用的。
2. 三次握手:为什么是三次,两次不行吗?
2.1 完整流程与三个关键报文
TCP三次握手流程要能随手画出来。我用最简单的方式记录一下:
客户端 -> 服务端:SYN=1, seq=x 服务端 -> 客户端:SYN=1, ACK=1, seq=y, ack=x+1 客户端 -> 服务端:ACK=1, seq=x+1, ack=y+1第一个报文表示“我客户端想建立连接,我的起始序号是x”;第二个表示“我服务端同意建立连接,同时我的起始序号是y,我已经收到你的x,请从x+1开始发”;第三个表示“我已经收到你的y,后续按你给的序号通信”。三个报文发完,双方都能确认自己的收发能力以及对端的收发能力都没问题,连接才真正建立。
面试容易栽在一个小细节上:ack=x+1不是“把x加一”,而是“我已经连续收到了序号x之前的字节,期望你下一次发x+1”。这个语义如果理解不到位,滑动窗口、快速重传这些机制都容易解释混乱。建议面试时把seq和ack写到纸上边说边画,很多面试官会跟着你的思路走,逻辑顺畅了,印象分自然高。
2.2 为什么必须是三次:能力确认与防过期
两次握手为什么不行?核心原因有两个。第一个是状态确认不完整:第一次收到SYN,服务端能确认“客户端的发送能力正常、自己的接收能力正常”;第二次服务端发出SYN+ACK,客户端收到后能确认“服务端的发送能力正常、自己的发送能力正常”,但此时服务端并不知道客户端有没有收到自己那条SYN+ACK。如果服务端直接进入ESTABLISHED,一旦第二次报文在网络中丢失,服务端就会为一个根本没建成的连接分配资源,两边状态不一致,后续收发全乱。
第二个原因是防过期报文。假设客户端曾经发过SYN,这个旧包在网络里堵了很久,客户端等不及重传并完成了新连接的建立和数据传输,之后旧包才漂到服务端。如果只有两次握手,服务端收到旧SYN后照样回复SYN+ACK并建立连接,凭空多出一条占用资源的坏连接。三次握手时,服务端发出的确认会再被客户端核对,客户端发现序号不对就不会回最后的ACK,服务端拿不到第三次确认,自然不建立连接。这个“防呆”设计,是三次握手最容易被略过、但面试官最想听的点。
2.3 面试追问:SYN Flood是什么,怎么防
一个非常高频的追问:三次握手有什么可攻击的点?SYN Flood基本是必考。攻击者伪造大量不存在的源IP,不停向服务端发SYN,服务端每收到一个都回SYN+ACK并进入SYN_RCVD状态,等待一个永远不会来的ACK。半连接队列很快被占满,正常用户的连接请求直接被丢弃,服务就罢工了。这个问题的本质是资源被无意义消耗:服务端在连接还没确立时就已经为每个SYN预分配了内存和连接对象。
防御思路至少要能说出两三条。限制SYN收包速率、缩短半连接超时时间,让占坑报文快速过期,这是比较常规的做法。更经典的是SYN Cookie:服务端收到SYN后不直接分配连接资源,而是把源地址、端口、时间等信息算出一个cookie,放进SYN+ACK的序号段里发回去,等收到客户端的ACK时校验cookie,校验通过了才真正建立连接。这个方案的精妙之处在于把“先分配再验证”变成“先验证再分配”,本质上是从资源管理上根治占坑问题。能讲到这个层面,面试官一般就不会再追了。
3. 四次挥手:断开连接比建立连接更讲究
3.1 为什么会多出一次
断开连接的流程同样可以用序列记录:
主动关闭方 -> 被动关闭方:FIN=1 被动关闭方 -> 主动关闭方:ACK=1 被动关闭方 -> 主动关闭方:FIN=1 主动关闭方 -> 被动关闭方:ACK=1很多人只背了“两个FIN加两个ACK”,却没理解中间两步为什么不能合并。第一次FIN表示“我的数据发完了,准备关闭”,被动方收到后立刻回一个ACK,表示“我收到了,你继续等”。这个ACK必须单独发,因为被动方此时可能还有数据要继续发送,它不能在自己还没处理完时就发FIN。被动方把剩余数据全部发完后,才会发出自己的FIN,告诉主动方“我也准备关闭了”。所以后两次之间可能隔着很长的业务处理时间,也是四次而不是三次的根本原因。
这个点对排查线上问题非常有用。如果你观察到服务端有大量连接长期处于CLOSE_WAIT状态,基本可以断定是应用收到对端FIN后只回了ACK,没有调用close,代码里连接没释放。CLOSE_WAIT数量只增不减,比TIME_WAIT更要警惕,它往往意味着连接泄漏。很多同学只关心TIME_WAIT,却忽略了CLOSE_WAIT才是应用层问题的信号灯。
3.2 TIME_WAIT为什么必须等2MSL
主动关闭方发出最后一个ACK后,不会立刻进入CLOSED,而是进入TIME_WAIT状态,等待大约2MSL后才彻底关闭。MSL是报文段在网络中的最大存活时间,一般按30秒到2分钟配置。等待2MSL有两个原因:第一,最后的ACK有可能丢失,被动方等不到ACK会重发FIN,主动方在TIME_WAIT期间有机会再回一个ACK,确保对方能完成关闭;第二,连接关闭后,这条连接上的旧数据包可能还残留网络里,等2MSL足够让它们全部过期,避免被误认为是下一次新建连接的数据。
面试常追一个问题:线上TIME_WAIT很多要不要处理?我的经验是,如果一个服务是短连接模式,单位时间内新建连接多,TIME_WAIT多一些是正常现象。但如果持续增长不回落,就要查是不是客户端一直在创建新连接,却因为超时或异常没有正常关闭。优化手段有两个方向:一是改用长连接复用,减少握手和关闭的次数;二是开启连接回收,按照业务可接受的方式加快TIME_WAIT老化。具体参数要和运维一起评估,不要盲目调低。
4. TCP与UDP:口算送分题,追问才是分水岭
4.1 一张表说清核心差异
TCP与UDP的对比属于开场送分题,但凡背过几天网络基础的人都能答两句。但送分题往往最容易暴露理解深浅,因为面试官听完你的概念后,通常会立刻追一个场景题,比如“为什么视频直播不用TCP”,这时候只看过概念的人就容易卡住。所以别把这一问当热身,答得有条理、能举出反例,反而能在面试最开始几分钟就建立正面印象。
| 对比项 | TCP | UDP |
|---|---|---|
| 连接状态 | 面向连接,需要先建立连接 | 无连接,直接发数据 |
| 可靠性 | 可靠,确认与重传机制完备 | 尽力而为,不保证到达 |
| 数据组织 | 字节流,无边界 | 数据报,有报文边界 |
| 头部大小 | 20到60字节 | 固定8字节 |
| 传输效率 | 握手与维护状态开销大 | 开销小,延迟低 |
| 典型场景 | Web、文件传输、数据库 | 直播、语音、游戏、DNS |
背这张表只是第一步,真正能被记住的答案来自理解:TCP的所有复杂机制,都是为了在一个不可靠的IP网络上,给上层提供一个可靠的字节流信道;UDP则是保留IP网络的尽力而为特性,把传输控制的责任交还给应用层,想快、想省、想自己定义控制逻辑都行。这两个定位完全不同,回答时点出“可靠与效率的取舍”,比单纯罗列差异要高级得多。
4.2 场景选型:为什么直播游戏不选TCP
场景选型问题是考察工程感。需要可靠传输的地方,比如网页HTTP、文件下载FTP、远程登录SSH,选TCP没有悬念。但实时语音、视频直播、竞技对战,反而更多直接用UDP,原因很简单:实时数据旧了就旧了,重传一个已经过时的视频帧没有意义,甚至让画面停顿更久;少量的乱序和丢包对感官影响有限,延迟高却是致命的。UDP牺牲可靠,换来低延迟和可控的发送节奏,在实时场景里反而是优点。
还有一个容易被追问的点:DNS默认用UDP的53端口,因为一次查询的请求和响应都很短,一个数据报就能装下,如果每次都先做TCP三次握手,代价太大。当响应数据超过一定大小的时候,DNS才会自动切到TCP,因为需要传输的数据量变大,依靠UDP一个报文承载不了。这个细节如果你能主动讲出来,能明显看出你关注过协议的实际行为而不只是背结论。
4.3 QUIC:披着UDP外衣的加强版TCP
如果还能主动补一句“现在HTTP/3已经跑在QUIC上面”,整个回答的层次立刻不一样。QUIC基于UDP传输,却在应用层实现了类似TCP的可靠传输、乱序重排、拥塞控制,还默认集成TLS加密,同时支持连接迁移,手机从WiFi切到4G时连接ID不变,不会断线。它的出现说明一个趋势:可靠传输并不一定要绑死在TCP协议栈上,把控制逻辑搬到用户态,反而能获得更快的迭代空间。
这个知识在社招面试里非常加分,它证明你不只看教科书,也在关注协议演进的前沿。回答时不需要展开QUIC的所有细节,只要说清楚“它用UDP实现了可靠传输,并解决了TCP队头阻塞”,面试官通常就会认为你有较好的知识广度。
5. TCP可靠传输:面试官最爱在这里深挖
5.1 确认应答与序号机制
快速答完TCP与UDP的差异后,面试官十有八九会紧接着问:TCP到底怎么保证可靠?最底层的机制是确认应答加序号。TCP把数据看作字节流,每个字节都有唯一序号,发送方一段一段发出去,接收方收到后回一个ACK,里面带上期望收到的下一个字节序号。发送方超过一定时间没收到ACK,就认为数据包丢了,直接重传。这个一答一应、超时补发的循环,构成了TCP可靠传输的基石。
在此基础上还有快速重传。接收方如果收到乱序数据,比如期望6但先到了7和8,它会不停重复发送ACK=6。发送方连续收到三个重复ACK,就能判断6这个包大概率丢了,不等超时计时器到达,立刻重传。这个设计把一次超时等待的时间省掉,对降低端到端延迟很有意义。重传是TCP的正常兜底,但重传率持续偏高的服务,大概率是网络上存在丢包,这也是抓包时最值得重点关注的一类信号。
5.2 滑动窗口与流量控制
如果每个包都要等ACK再发下一个,网络利用率会非常低。TCP引入了滑动窗口:发送方可以在未确认的情况下连续发送窗口允许范围内的数据,窗口大小由接收方动态通告。接收方根据应用处理速度和缓冲区剩余情况,告诉发送方“你现在最多还能发多少”,这就是流量控制,解决的是“发送方不要冲垮接收方”的问题。窗口机制把停等协议的串行等待变成了流水线发送,吞吐量提升非常明显。
窗口变成0时怎么办?发送方停止发送,并启动持续计时器,定期发送1字节的窗口探测报文,问对方窗口恢复了没有。如果不做这个动作,接收方恢复后发来的窗口更新报文一旦在途中丢失,两边可能都会傻等,谁都不再动作。面试能答到这个细节,大概率不会再被往下追问了。流量控制的说辞看似简单,但它只管收发两端,网络中间的链路设备过载是另一件事,这就自然引出了拥塞控制。
5.3 拥塞控制:慢启动、拥塞避免、快重传、快恢复
拥塞控制解决的是“网络中间设备处理能力有限,大家别一拥而上把链路打爆”。TCP发送方维护一个拥塞窗口cwnd,实际发送窗口取接收方窗口和拥塞窗口的较小值。整个调整过程分四个阶段:慢启动时每收到一个ACK,cwnd翻倍,从1、2、4、8这样指数增长;增长到慢启动阈值ssthresh之后,进入拥塞避免阶段,每个往返时间内仅增加1,近似线性,避免过度试探。
发生超时,TCP认为网络严重拥塞,把ssthresh降为当前cwnd的一半,cwnd重置为1,重新慢启动;而如果只收到三个重复ACK,说明网络还有余量,进入快恢复:cwnd减半,直接进入拥塞避免,不再从1开始。这个“重超时回1、快恢复减半”的差别一定要说清楚,是面试官最爱抓的分寸感。最后再补一句“流量控制管两端,拥塞控制管链路,两端的保障覆盖不了中间设备”,这段回答就闭环了。
6. HTTP请求与状态码:必须形成肌肉记忆
6.1 状态码分类与高频码
HTTP状态码按首位数字分五类:1xx信息类、2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误。听起来简单,但线上问题定位时,90%的精力都花在几个高频状态码上。我把最常见的整理成一张表,面试前过一遍,用处比背上百个冷门码大得多。
| 状态码 | 含义 | 一句话定位 |
|---|---|---|
| 200 | OK | 正常返回 |
| 201 | Created | 创建成功,常用于POST |
| 204 | No Content | 成功但没有响应体 |
| 301 | Moved Permanently | 永久重定向 |
| 302 | Found | 临时重定向 |
| 304 | Not Modified | 协商缓存命中,回本地缓存 |
| 400 | Bad Request | 客户端请求格式不对 |
| 401 | Unauthorized | 未认证,身份还没确认 |
| 403 | Forbidden | 已确认身份但无权访问 |
| 404 | Not Found | 资源不存在 |
| 405 | Method Not Allowed | 请求方法不支持 |
| 429 | Too Many Requests | 请求太频繁被限流 |
| 500 | Internal Server Error | 服务端内部出错 |
| 502 | Bad Gateway | 网关拿不到有效的上游响应 |
| 503 | Service Unavailable | 服务暂不可用,过载或维护 |
| 504 | Gateway Timeout | 网关等待上游超时 |
这张表背熟之后,重点放在易混组合上。502、503、504是面试和实战的最高频三兄弟。502是上游服务本身异常,返回了无效响应;503是服务还没有准备好,通常对应过载或发版维护;504是请求发出去了,但上游在限时内没处理完。遇到504先看上游耗时,遇到503先确认服务状态,遇到502直接查后端日志,这个排查顺序能省很多时间。
6.2 易混状态码逐个说明
301和302的区别在于“是否永久”。301永久重定向,浏览器和搜索引擎会记住新地址,后续直接访问新地址;302临时重定向,每次请求仍然先访问原地址再跳转。深一点的坑是:历史实现里301、302在处理POST请求时行为不规范,许多浏览器会擅自把POST改成GET再重定向,导致业务语义丢失。所以后来标准定义了307和308,用来保留原始请求方法和body。做后端接口设计时,如果能规定清楚不同跳转码对方法的处理,会显得专业很多。
401和403也经常被误解。401表示“我不知道你是谁,请先认证”,比如没带Token访问受保护接口,服务端返回401;403表示“我已经知道你是谁,但你没有权限做这件事”,比如普通用户访问管理员接口。区别在于是不是认得出你这个人。304则是协商缓存命中的响应,服务端通过ETag或Last-Modified告诉浏览器“资源没变,去本地缓存拿吧”,响应体为空,对节省流量很关键,也是性能面试里的常见话题。
6.3 GET与POST别再背过时答案
GET与POST的经典差异基本是必问。常规说法是:GET用于查询数据,POST用于提交数据;GET参数一般在URL上,POST在body里;GET可以被缓存、被收藏,POST一般不会。这些能背出来只能拿基本分。真正拉开差距的是幂等性:GET、PUT、DELETE应该做成幂等操作,同一个请求执行多次,结果与执行一次相同;POST天然不幂等,你请求支付接口,不会有人希望你多发几次。后端设计接口时,幂等性直接决定重试机制安不安全。
另一个维度是安全。URL里的参数会被访问日志、浏览器历史以及沿途各种设备记录下来,敏感数据放GET相当于公开写在快递单上;就算放POST的body里,不加密的HTTP也还是明文。还有个常见问题:GET能不能带body?协议规范没有明确禁止,但工程惯例强烈不推荐,因为很多网关和缓存只提取URL作为缓存键,body会被丢弃。回答这类问题最好的姿态是“规范上没禁止,工程上不要这样用”,显得你既懂标准又懂实践。
7. 从HTTP/1.1到HTTP/2:连接复用与队头阻塞
7.1 Keep-Alive:连接复用的基础
HTTP/1.0时代,一个请求就要新建TCP连接,请求结束立刻断开,页面上一堆图片和样式文件会导致几十次握手,浪费非常严重。HTTP/1.1默认开启持久连接,一个TCP连接上可以连续发送多个请求和响应,通过Connection头控制是否关闭。这个机制是“连接复用”的基石,面试问到HTTP连接复用时,通常就从这里开始。
顺着这个点,可以继续讲持久连接的实际收益:只要经过一次TCP三次握手和TLS握手,后续所有静态资源和接口请求都能复用同一连接,大量网络往返被省掉。如果进一步用到HTTP/2,浏览器可以在连接上同时发起大量请求,不再像HTTP/1.1那样受到“一个连接同一时刻只能有一个响应在途”的限制。所以连接复用不只是连接本身的复用,更是并发能力的升级前提。
7.2 HTTP层队头阻塞与缓解
持久连接解决了握手开销,却没解决响应顺序问题。HTTP/1.1规范里有管线化机制,允许客户端在同一个连接上连续发送多个请求,但服务端必须按收到请求的顺序返回响应。一旦第一个请求处理耗时很长,后面所有响应都被卡住,这就是HTTP层的队头阻塞。实际工程里浏览器很少真正启用管线化,更常见的方案是让页面并行建立六条左右TCP连接,把请求分散到多条连接来缓解阻塞,但每条连接内部依然是串行的。
这个现象有点像超市只有一个收银台:队伍里第一个人买的东西特别多,后面的人明明只买一瓶水,也必须等第一个人全部结完账才能动。HTTP/2的出现,本质上就是打破这种“必须按序结账”的限制。
7.3 HTTP/2多路复用与TCP层队头阻塞
HTTP/2的核心变化是二进制分帧。一个TCP连接被拆成多个“流”,每个流上承载一组请求-响应,帧可以交错发送、重组,从而打破了HTTP/1.1“响应必须按序返回”的限制。同时它还引入了HPACK头部压缩,能大幅减小Header体积;还有Server Push,服务端可以在客户端请求前主动推送资源。这些特性叠加起来,页面加载性能提升非常明显。
很多候选人在这里漏讲一个关键点:HTTP/2解决的是HTTP协议层的队头阻塞,但TCP层的队头阻塞依然存在。TCP要求数据按序交付,一条连接上某个帧丢失后,后续所有流的数据都要等这个帧重传成功才能继续向上层交付。这个问题直到HTTP/3才彻底解决:它把传输层换成基于UDP的QUIC,每个流有独立的传输控制,一个流丢包不再影响其他流。把这条演进线讲通,面试官通常会很满意地放你过。
8. HTTPS:HTTP加了一层什么
8.1 加密逻辑:两类加密怎么协作
HTTP是明文协议,数据经过任何一个中间节点都能被完整读到,Cookie、登录态、请求参数全是裸奔状态。HTTPS在HTTP和TCP之间加了TLS层,做三件事:加密内容、校验完整性、验证身份。加密逻辑的核心是混合加密:数据量大,用对称加密提高效率;密钥分发难,用非对称加密安全地交换密钥。对称加密用同一个密钥加解密,速度快,但密钥一旦在传输途中被截获就失去意义;非对称加密有公钥私钥一对,能在不暴露私钥的前提下安全交换信息,但计算开销大。所以实际流程是先用非对称加密协商出一个随机会话密钥,之后所有HTTP内容都用这个会话密钥做对称加密。
这个“为什么不用纯对称、为什么不用纯非对称”的问题,面试里几乎必问。要能把“对称加密算得快但密钥没法安全传递,非对称加密能安全传密钥但太慢”这个冲突讲透,再引出“两者结合各取所长”的结论,才算真正理解HTTPS。
8.2 TLS握手关键流程
TLS握手的核心过程大致是:客户端发ClientHello,带上TLS版本、支持的加密套件列表和客户端随机数;服务端回ServerHello,选定加密套件,带上服务端随机数和自己的证书;客户端校验证书的合法性与域名匹配,验证通过后生成一个预主密钥,用服务端公钥加密发过去;服务端用私钥解密拿到预主密钥。此后双方根据客户端随机数、服务端随机数和预主密钥,各自独立计算出同一条会话密钥;最后双方发Finished消息确认握手完成,进入加密通信。
TLS 1.3把整个过程缩短到一次往返:客户端在ClientHello里直接携带密钥交换参数,服务端回复时也带上自己的,双方通过各自的公私钥完成协商,省掉整整一个RTT。面试官喜欢追问“TLS 1.3为什么能更快”,如果答出这一点,说明你对HTTPS不仅有概念,还关注过协议版本演进。
8.3 证书链与常见HTTPS问题
证书是HTTPS身份验证的可信基础。CA用根证书签发中间证书,中间证书再签发网站证书;浏览器内置受信任的根证书,通过链条逐级验证,就能确认服务端身份。实战中遇到最多的问题有三个:证书过期,浏览器会有明显提示;证书域名不匹配,比如证书只有example.com,却拿它访问www.example.com;根证书不受信任,常见于内网自建HTTPS环境,需要手动信任根证书。这三个问题基本能覆盖绝大多数HTTPS报错场景。
另一个高频问题是混合内容:一个HTTPS页面里引用了http://静态资源,浏览器会拦截并提示页面包含不安全连接。加密页面上混进明文资源,等于把鸡蛋放进一个破篮子。解决办法很简单,把资源地址改成https前缀,或者使用相对路径。这个点不太会作为面试题出现,但实际开发中排查“HTTPS页面样式莫名丢失”时,出现频率非常高,值得记一下。
9. 实战排查:这些协议细节比面试题更有用
9.1 从状态码快速定位线上问题
面试里背状态码是为了考试,真实线上的状态码才是解决问题的第一现场。遇到504,先怀疑网关等上游超时,优先看上游服务处理耗时;遇到503,先确认服务是否过载或正在发版维护;遇到502,直接查上游服务是否宕机或响应异常。很多同学一看到500就开始清缓存、重启服务,其实先翻服务端日志找异常堆栈,通常比盲目操作有效得多。
我在实际工作中遇到过几次典型的HTTP异常。一次是网关返回500,重试仍然失败,最后定位到后端数据库连接池耗尽;另一次是客户端下载资源时报“请求头过长”,其实是登录态和Cookie字段太大,把请求头撑爆了。这些问题本质都能用协议知识解释:HTTP头是文本,过大的头会让服务端直接拒绝。掌握协议细节的价值,不只是面试多拿两分,而是线上出问题时你能比同事更快判断问题出在哪一层。
curl -v https://example.com/api curl -I http://example.com/health这两个命令是排查利器。-v能看到完整的请求响应头和握手过程,-I只取响应头快速确认状态。如果怀疑DNS或连接层问题,在DevTools或Wireshark里抓包观察TCP握手和TLS握手是否正常,基本能覆盖日常90%的问题。
9.2 面试中的“意外问题”速答
除了核心八问,面试官喜欢顺手扔几个工程向问题。比如“为什么ping不通但HTTP能通”,多半是ICMP被防火墙或网络策略拦截,TCP端口本身是通的;“为什么TCP抓包全是重传”,大概率是网络链路存在丢包;“为什么RTT很低但接口很慢”,可以先排除Nagle算法和延迟确认机制叠加导致的小包延迟,再去看应用层有没有串行处理。这些知识不靠背,用Wireshark或tcpdump抓几次包,观察TCP标志位变化,比背十篇文章都有效。
前端排查也有固定套路。浏览器DevTools的Network面板里,优先看请求状态、耗时瀑布和Mixed Content警告;移动端Native应用排查,优先抓包确认请求有没有发出、DNS有没有解析到预期IP。这些思路本质都是把网络协议里的分层、连接、状态码知识,套到具体环境的排查路径上。协议知识刷完面试题之后,最好跟着做一两次真实抓包分析,你会发现很多“背不下来”的细节,看一眼包就彻底记住了。
最后说一点我自己的体会。网络协议这块内容,最忌讳用背题的方式准备。三次握手你背流程,不如亲手画一遍并问自己“如果少了第三次会发生什么”;状态码你贴一张表,不如某个凌晨真的被504叫起来,看一次网关日志。真正拉开面试差距的,从来不是谁记住的状态码多,而是面对“为什么”的时候,能不能给出一个清晰的推导过程。把这些协议问题当作一组安全工程问题来复盘,你会发现答案自然就记住了,面试现场也不容易慌。