【KO】Android 网络相关面试题
下面结合 Android 开发场景,对“网络相关面试题”的深度细化版回答(含代码、框架关联、实际应用),更贴近中高级 Android 面试考察方向:
一、HTTP/HTTPS
1. HTTP 核心细节(结合 Android)
- 请求结构:Android 中通过
HttpURLConnection
或 OkHttp 构造请求,包含 请求行(GET /api/user HTTP/1.1
)、请求头(Headers
,如User-Agent
、Cookie
)、请求体(POST 时传参,如表单、JSON )。 - 典型问题:
- 明文传输风险:Android 9.0 后默认禁止 HTTP 明文请求(需在
AndroidManifest.xml
配置android:usesCleartextTraffic="true"
绕过,但不建议生产环境用 )。 - 连接复用:HTTP 1.1 支持 长连接(
Connection: keep-alive
),减少 TCP 握手开销,OkHttp 内部默认启用连接池优化。
- 明文传输风险:Android 9.0 后默认禁止 HTTP 明文请求(需在
2. HTTPS 原理与 Android 实践
-
加密流程(面试必问):
- 客户端发起 HTTPS 请求,服务端返回 数字证书(含公钥、域名、有效期等 )。
- 客户端验证证书(Android 系统内置 CA 根证书,或 App 自定义证书校验 ),若验证通过,生成 随机对称密钥,用服务端公钥加密后传给服务端。
- 后续数据用 对称密钥加密(效率高 ),实现安全传输。
-
Android 常见场景:
- 证书锁定(Certificate Pinning):为防止证书劫持,App 可固定信任的证书(如 OkHttp 中配置
CertificatePinner
):CertificatePinner pinner = new CertificatePinner.Builder().add("your.domain.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=").build(); OkHttpClient client = new OkHttpClient.Builder().certificatePinner(pinner).build();
- 自签名证书处理:调试时服务端用自签名证书,需在 Android 中自定义信任(通过
SSLSocketFactory
加载本地证书,或忽略校验(仅调试用,生产禁用 ))。
- 证书锁定(Certificate Pinning):为防止证书劫持,App 可固定信任的证书(如 OkHttp 中配置
二、TCP/UDP
1. TCP 深度解析(结合 Android 网络框架)
-
三次握手 & 四次挥手(重点):
- 三次握手:
SYN -> SYN+ACK -> ACK
,建立可靠连接。Android 中 OkHttp 发起请求时,底层 Socket 会经历此过程,可通过抓包工具(如 Wireshark )观察。 - 四次挥手:
FIN -> ACK -> FIN -> ACK
,断开连接时需双向确认。若一方异常(如服务端崩溃 ),可能触发 超时重传 或 RST 复位。
- 三次握手:
-
Android 中的 TCP 应用:
- OkHttp 底层基于 TCP 实现 HTTP 协议,通过 连接池 复用 TCP 连接(默认最多 5 个空闲连接,保持 5 分钟 ),减少握手开销。
- 自定义 TCP 通信(如 Socket 长连接 ):需处理 心跳机制(定时发空包,维持连接,防止被网关断开 )、重连策略(网络切换、连接超时后自动重试 )。
2. UDP 实践与 Android 场景
-
典型应用:
- 音视频传输:如 WebRTC 在 Android 中基于 UDP 传输实时流,结合 SRTP 加密、RTCP 反馈丢包重传,平衡实时性与可靠性。
- 广播/组播:Android 中通过
MulticastSocket
实现局域网设备发现(如 DLNA 投屏 ),但需申请CHANGE_NETWORK_STATE
等权限。
-
可靠性优化:
- UDP 本身不可靠,但可在应用层实现 简单确认重传(如给 UDP 包加序列号,接收方反馈 ACK,发送方超时重传 )。
- 结合 QUIC 协议(基于 UDP ):Google 推广的协议,Android 10+ 已支持,具备 TCP 级可靠性(拥塞控制、重传 )+ UDP 低延迟,OkHttp 未来可能深度集成。