腾讯网络编程专项面经:HTTP/2多路复用、DNS优化、OkHttp连接池、Protobuf

24 阅读6分钟

Compose专项聊完,进入网络编程专项。网络层是中级以上必考——腾讯面试不光问协议原理,还问工程实践。HTTP/2多路复用?OkHttp连接池怎么配?DNS劫持怎么防?Protobuf比JSON快多少?这些工程细节区分"知道"和"用过"。今天8道题覆盖四大方向。

Q1:HTTP/1.1、HTTP/2、HTTP/3的核心区别?

HTTP/1.1:文本协议,一个TCP连接上请求串行(队头阻塞)。Keep-Alive复用连接但请求还是排队。浏览器为并发开6-8个TCP连接。

HTTP/2:二进制帧+多路复用,一个TCP连接上多个请求并发不阻塞。引入Stream概念,帧按Stream ID区分。还有HPACK头部压缩和服务端推送。

HTTP/3:底层TCP换QUIC(基于UDP)。解决TCP队头阻塞(QUIC每个Stream独立可靠传输互不影响)。0-RTT建连(TCP+TLS要多次握手,QUIC首次1-RTT后续0-RTT)。

追问:HTTP/2多路复用的限制?虽然请求并发但受限于TCP——TCP层丢包会阻塞该连接上所有Stream(TCP队头阻塞)。HTTP/3用QUIC解决了这个问题。

Q2:OkHttp连接池怎么工作?怎么配置?

连接池作用:复用TCP连接避免重复建连开销(TCP三次握手+TLS握手至少几十毫秒)。

OkHttp连接池机制:空闲连接缓存5分钟(默认),最多保留5个空闲连接(默认)。请求到来时先看池里有没有可复用的连接(同host、同协议、证书匹配),有就直接用没有就新建。

配置:ConnectionPool(maxIdleConnections, keepAliveDuration, timeUnit)。高频请求场景调大maxIdleConnections(如10-20),低频保持默认。keepAliveDuration太长浪费资源,太短频繁建连。

追问:连接复用怎么判断能不能复用?HTTP/1.1看host+port,HTTP/2看authority+证书。同一host的HTTP/2连接可以服务所有请求(多路复用),所以HTTP/2场景连接池里通常只有1个连接。

Q3:DNS解析优化怎么做?HTTPDNS是什么?

传统DNS问题:运营商LocalDNS存在劫持(返回广告页IP)、解析慢(递归查询几百毫秒)、TTL不可控(运营商忽略TTL缓存过期IP)。

HTTPDNS:绕过运营商LocalDNS,用HTTP请求直接向可信DNS服务器查询IP。腾讯/阿里/字节都有自己的HTTPDNS服务。

优势:防劫持(走HTTPS不走UDP 53端口)、精确TTL控制、支持IP调度(根据用户地理位置返回最近CDN节点)。

实现方案:OkHttp的DNS接口替换为HTTPDNS客户端。首次请求仍走LocalDNS(HTTPDNS还没拿到IP),后续用HTTPDNS返回的IP直连。注意:HTTPS场景IP直连要处理证书校验——SNI里写域名但连的是IP,用自定义SSLSocketFactory解决。

Q4:网络请求的超时策略怎么设计?

三种超时

connectTimeout:TCP建连超时。设5-10秒。太短弱网频繁失败,太长用户等太久。

readTimeout:等待服务端响应的超时。设10-30秒。大文件或慢接口适当放宽。

writeTimeout:发送请求体的超时。上传大文件设长一点。

重试策略:OkHttp默认retryOnConnectionFailure=true——连接失败自动重试。但要控制次数(最多3次)和间隔(指数退避1s/2s/4s)。幂等请求(GET)安全重试,非幂等(POST)要慎重——可能导致重复提交。

追问:弱网环境怎么优化?缩短超时快速失败给用户反馈、启用本地缓存(stale-if-error)、请求合并(batch API减少请求次数)、图片降质量传输。

Q5:HTTPS的TLS握手流程?1.2和1.3区别?

TLS 1.2(2-RTT):Client Hello → Server Hello+证书 → Client验证证书+发预主密钥 → 双方生成会话密钥 → Finished。

TLS 1.3(1-RTT):Client Hello里直接带密钥交换参数 → Server返回Hello+证书+Finished。减少一轮往返速度快一倍。支持0-RTT复用PSK,但0-RTT数据可能遭重放攻击。

Android实践:OkHttp默认支持TLS 1.3(Android 10+原生,低版本靠Conscrypt)。证书锁定(Certificate Pinning)防中间人。

Q6:Protobuf比JSON好在哪?什么时候用?

Protobuf优势:二进制格式体积小(比JSON小30-50%)、序列化/反序列化速度快(不需要解析文本和字符串匹配)、强类型Schema保证数据格式正确。

JSON优势:可读性好调试方便、无需预定义Schema、前端生态完善。

选择场景:高频数据传输(IM消息、实时位置)用Protobuf——体积小省流量速度快。后台管理API用JSON——调试方便前端对接简单。腾讯微信的消息协议就是基于Protobuf的。

追问:FlatBuffers和Protobuf区别?FlatBuffers零拷贝——数据直接在buffer上访问不需要反序列化。适合游戏和需要极致性能的场景。Protobuf需要反序列化但Schema更灵活(字段增删兼容性好)。

Q7:OkHttp拦截器链原理?五种拦截器各自做什么?

OkHttp的请求处理是一条拦截器链,每个拦截器可以做请求修改和响应处理:

RetryAndFollowUpInterceptor:重试和重定向。连接失败自动重试,301/302自动跟随重定向。

BridgeInterceptor:桥接层。把用户配置的Request转成OkHttp内部格式,把内部Response转回用户格式。

CacheInterceptor:缓存策略。根据Cache-Control/ETag/Last-Modified判断走缓存还是网络。

ConnectInterceptor:建连。从连接池找可用连接或创建新连接,准备输入输出流。

CallServerInterceptor:发送请求接收响应。写请求头+请求体到Socket,读响应头+响应体。

追问:自定义拦截器加在哪?addInterceptor加在RetryAndFollowUp之前(应用级,可以修改所有请求),addNetworkInterceptor加在CacheInterceptor之后ConnectInterceptor之前(网络级,看到的是缓存处理后的请求)。

Q8:WebSocket在Android怎么用?跟HTTP区别?

WebSocket:全双工长连接协议。一次HTTP Upgrade握手后升级为WebSocket,之后双方随时发数据不需要每次建连。适合实时通信(IM、股票行情、游戏)。

OkHttp的WebSocket:OkHttpClient.newWebSocket(request, listener)。listener的onOpen/onMessage/onClosing/onClosed/onFailure回调处理连接状态和数据。

跟HTTP区别:HTTP是请求-响应模式(客户端发服务端回),WebSocket是双向(服务端也能主动推)。HTTP每次请求有头部开销,WebSocket帧头只有2-14字节。

心跳保活:WebSocket连接容易被中间设备(NAT路由器)断开。客户端定时发Ping帧(30-60秒间隔),服务端回Pong保持连接活跃。OkHttp自动处理Ping/Pong。


面试Tips:网络编程中级岗考工程实践。HTTP/2多路复用和HTTP/3 QUIC要能讲清原理和区别。OkHttp连接池配置和拦截器链是高频题。DNS优化(HTTPDNS)和HTTPS(TLS握手)考安全方向。Protobuf考数据格式选型。最好能结合项目说出具体数据——"切HTTP/2后接口平均延迟降了30%"这种比背概念强十倍。

下一篇进入UI与动画专项,RecyclerView源码深度解析、DiffUtil原理、SharedElement转场动画——UI层的高级玩法。


项目中用过HTTPDNS的同学评论区报到,接入体验怎么样?

本系列连载中,关注不迷路,下一篇:腾讯高级Android(UI与动画专项)面试真题

系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。