上篇聊完Java基础,这篇进入滴滴网络编程专项。滴滴出行高度依赖网络——叫车请求、实时定位上报、行程同步。网络编程面试考TCP原理、HTTPS加密、DNS优化、网络状态监听。
今天8道题覆盖滴滴网络编程面试核心考点。
Q1:TCP三次握手的过程和原因?
过程:客户端发送SYN(seq=x)→ 服务端收到SYN,回复SYN+ACK(seq=y, ack=x+1)→ 客户端收到SYN+ACK,回复ACK(ack=y+1)。三次握手完成后连接建立。
为什么三次不是两次:两次握手无法防止历史连接。如果客户端之前发送的一个SYN在网络中延迟到达服务端,服务端认为是新连接发送SYN+ACK,客户端没有第三次确认——服务端白白分配资源。三次握手中客户端可以发送RST拒绝这个历史连接。
为什么不是四次:三次已经足够确认双方的收发能力(第一次确认客户端能发,第二次确认服务端能收能发,第三次确认客户端能收)。
追问:TCP四次挥手?主动关闭方发送FIN → 被动方回复ACK(此时被动方可能还有数据要发送)→ 被动方发送FIN → 主动方回复ACK → 等待2MSL(Maximum Segment Lifetime)后关闭。为什么等2MSL?确保末个ACK到达对方,以及让网络中残留的报文过期。
Q2:HTTPS的加密流程是什么?
TLS握手(TLS 1.2):客户端发ClientHello(加密套件+Client Random)→ 服务端回ServerHello(选定套件+Server Random+证书)→ 客户端验证证书 → 生成Pre-Master Secret用服务端公钥加密发送 → 双方用三个随机数生成Session Key → 后续对称加密(AES)通信。
为什么混合加密:非对称加密(RSA/ECDH)安全但慢(用于密钥交换),对称加密(AES)快但需要安全地传递密钥。TLS用非对称加密安全传递对称密钥,后续用对称加密高效传输数据。
证书验证:客户端检查证书是否过期、域名是否匹配、是否被CA签名(逐级验证到根CA)。Android 7.0+默认不信任用户安装的CA证书(需要network_security_config显式配置)。
追问:TLS 1.3改进了什么?握手从2-RTT降到1-RTT(甚至0-RTT恢复),移除不安全的加密算法(RC4/3DES/SHA1),只保留前向安全的密钥交换(ECDHE/DHE)。
Q3:DNS解析怎么优化?
DNS问题:运营商DNS劫持(返回错误IP)、DNS解析延迟(首次查询200-500ms)、TTL过期后重新解析。
优化方案:
HTTPDNS:绕过运营商DNS,直接通过HTTP请求可信DNS服务器获取IP。阿里HTTPDNS/腾讯HTTPDNS。避免劫持、解析更快(HTTP连接复用)。
本地缓存:App内部缓存域名→IP映射,设置合理TTL(如5分钟)。命中缓存时直接用IP连接,跳过DNS解析。
预解析:App启动时预解析核心域名(API域名、CDN域名),存入缓存。用户后续请求直接用缓存IP。
IP直连+域名兜底:优先用缓存IP直连,失败时回退到系统DNS解析。IP过期时后台刷新。
追问:HTTPDNS怎么处理HTTPS的SNI问题?HTTPS的TLS握手需要SNI(Server Name Indication),IP直连时SNI是IP不是域名,服务端可能返回错误证书。解决:自定义SSLSocketFactory,手动设置SNI为域名。
Q4:OkHttp的连接池怎么工作?
连接复用:HTTP/1.1的Keep-Alive允许一个TCP连接发多个请求。OkHttp的ConnectionPool缓存空闲连接,新请求优先复用(避免TCP握手+TLS握手开销)。
连接池参数:maxIdleConnections(最大空闲连接,默认5)、keepAliveDuration(空闲存活时间,默认5分钟)。
连接选择:新请求 → 查找同地址空闲连接 → 有则复用 → 无则创建 → 请求完归还连接池。
追问:OkHttp的拦截器链怎么工作?应用拦截器(addInterceptor)→ 重试和重定向拦截器 → 桥接拦截器(设置请求头)→ CacheInterceptor(缓存判断)→ ConnectInterceptor(建立连接)→ CallServerInterceptor(发送请求读取响应)。责任链模式,每个拦截器可以修改请求/响应或终止链。
Q5:网络状态监听怎么做?
ConnectivityManager:Android 7.0+推荐registerDefaultNetworkCallback监听网络变化(onAvailable/onLost/onCapabilitiesChanged)。
Android 7.0变更:隐式广播CONNECTIVITY_ACTION被移除。必须用registerNetworkCallback动态注册。
网络质量判断:NetworkCapabilities.hasTransport(TRANSPORT_WIFI)判断WiFi/移动网络。
追问:怎么判断网络是否真正可用(有互联网连接)?NetworkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)只表示网络有互联网接入能力,不代表真正能连通。更准确:发送一个HEAD请求到可靠的URL(如connectivitycheck.gstatic.com),根据响应判断。
Q6:WebSocket在Android中怎么用?
WebSocket:全双工通信协议。一次HTTP握手升级后双方可随时发送消息。适合实时通信(IM、行情推送)。
OkHttp WebSocket:newWebSocket(request, listener)创建连接。回调:onOpen(连接成功)、onMessage(收到消息)、onFailure(连接失败)、onClosed(关闭)。
心跳保活:定期发送Ping帧(OkHttp自动发送),对方回Pong。建议30秒一次心跳。
追问:断线重连怎么做?onFailure中触发重连。指数退避(1s→2s→4s→...→最大30s)。前后台切换时检查连接状态,切到前台断开立即重连。
Q7:HTTP缓存策略怎么设计?
强制缓存:Cache-Control: max-age=3600(3600秒内直接用缓存)。Expires(HTTP/1.0,指定过期时间)。
协商缓存:Cache-Control: no-cache(每次确认缓存有效性)。If-Modified-Since/If-None-Match(ETag比较)。命中返回304 Not Modified(不传body,节省带宽)。
Android实践:OkHttp内置缓存(Cache(cacheDir, maxSize)),只缓存GET。配合FORCE_NETWORK强制走网络、FORCE_CACHE强制用缓存。
追问:离线时怎么展示数据?网络请求先读缓存展示(即使过期),同时发起网络请求更新缓存。网络恢复后用新数据刷新UI。Room数据库做本地缓存+Repository统一数据源(离线优先架构)。
Q8:滴滴网络编程面怎么准备?
重点复习:TCP三次握手(为什么三次+四次挥手)、HTTPS加密(TLS握手+混合加密+证书验证)、DNS优化(HTTPDNS+本地缓存+预解析)、OkHttp(连接池+拦截器链)、网络状态监听(NetworkCallback)、WebSocket(心跳+断线重连)。
面试技巧:网络编程面考原理+实战——不只背协议流程,要能结合实际场景分析。比如"滴滴叫车请求在弱网下怎么优化"、"实时位置上报用WebSocket还是HTTP长轮询"。准备时结合滴滴出行场景思考。
面试Tips:滴滴网络编程面考原理——TCP三次握手和HTTPS加密流程是必考题。DNS优化(HTTPDNS)和OkHttp连接池也高频。网络状态监听和WebSocket经常问。能结合出行场景(弱网/实时通信)分析问题加分明显。
下一篇进入滴滴性能优化专项——地图场景性能优化、GPS定位优化、电量优化策略、后台保活。
做过网络优化的同学扣1,你觉得DNS优化效果最明显的是哪个方案?
本系列连载中,关注不迷路,下一篇:滴滴高级Android(性能优化专项)面试真题
系列简介:Android大厂面经连载,覆盖字节跳动、腾讯、阿里、美团等40+企业,从初级到架构师全岗位覆盖。每篇文章包含真实面试题+详细答案+代码示例,帮你拿到大厂Offer。