核心是三个层次的能力:基础扎实度(深挖细节) 、Android实战经验(踩坑与优化) ,以及安全认知(防篡改与证书体系)
第一步:基础定义
"HTTP是超文本传输协议,数据明文传输;HTTPS是HTTP + SSL/TLS协议栈,对数据进行了加密。标准端口分别是80和443。"
第二步:核心差异深挖("握手与加密")
不要只提对称加密,要讲清楚混合加密体系,这是区分中级和高级的分水岭:
"HTTPS的核心在于混合加密:
非对称加密(RSA/ECDHE):用于握手阶段,交换'对称加密的密钥'(Pre-Master Key),解决密钥配送问题。
对称加密(AES):用于实际数据传输,速度快。
现代HTTPS(TLS 1.3)已经不再使用RSA做密钥交换,而是改用 ECDHE(椭圆曲线迪菲-赫尔曼) 。因为它支持前向保密(PFS)------即使服务器私钥泄露,以前的历史流量也无法被解密。这一点对金融级App至关重要。"
第三步:SSL/TLS握手流程(展现网络协议功底)
"完整的TLS握手(以TLS 1.2为例)包括:
Client Hello:客户端发送随机数+支持的加密套件。
Server Hello :服务端返回随机数+选好的加密套件+CA颁发的数字证书。
证书校验(客户端):校验证书链、域名、有效期,并取出公钥。
Pre-Master生成:客户端生成一个随机密钥,用公钥加密传给服务端。
会话密钥计算:双方利用三个随机数(Client/Server Random + Pre-Master)计算出最终的对称会话密钥。
Finished:互发加密过的握手摘要,验证协商是否成功。"
第四步:Android高级工程师的"高光时刻"(实战与踩坑)
"在Android层面,我们不仅要懂原理,更要解决实际痛点:
1. 证书校验与抓包冲突(网络安全配置)在Android 7.0(API 24)以上,系统默认只信任系统CA证书,不信任用户CA证书。这导致Charles/Fiddler抓包抓不到HTTPS明文。
做法:通过
network_security_config.xml配置debug-overrides或certificates源。风险 :如果上架包开启
user信任,就等于把App暴露给中间人攻击,所以Release包必须强制使用系统证书或不配置debug。
2. SSL Pinning(证书绑定)------ 防中间人攻击的杀手锏
面试官如果追问安全,我会说:我们会在OkHttp里做 CertificatePinner,将服务端公钥的SHA-256哈希值写死在代码里。握手时比对,不一致直接报错断开。
- 坑:证书过期或更换时,必须提前下发新公钥或通过热修复更新,否则会导致大面积网络崩溃。
3. 性能优化(复用Session)
HTTPS完全握手需要2个RTT,耗时较长。我会在OkHttp中配置
ConnectionPool,并开启 Session Resumption(会话恢复),利用Session ID或Session Ticket复用之前的会话,把后续请求的握手降到0-RTT或1-RTT,显著提升弱网下的首屏速度。"
第五步:进阶区别(HTTP/2 与 HTTPS 的强关联)
"现在的Android主流网络库(OkHttp 4.x)默认支持HTTP/2。注意: 主流浏览器和Android应用强制要求 HTTP/2 over TLS(即必须用HTTPS)。HTTPS不仅保证安全,更是支持多路复用、头部压缩(HPACK)的前提条件。"
第六步:总结升华(展现技术视野)
"总结一下:HTTP是基础,HTTPS是标准。在高级工程实践中,HTTPS已经不是'选配'而是'标配'。我会把它当成一个全链路监控环节 ------在底层自定义
TrustManager处理自签名证书以兼容测试环境,在顶层通过EventListener监听TLS握手耗时,作为性能监控的重要指标。"
这是一个非常经典的分层进阶学习地图。
-
初级 :考察**"知不知道"**(API调用与基本概念)。
-
中级 :考察**"理不理解"**(原理机制与Android适配坑)。
-
高级 :考察**"能不能扛"**(性能优化、安全对抗与底层协议掌控)。
🟢 第一阶段:初级工程师(基石与API层)
核心目标:能正常发起网络请求,处理基本数据,不崩溃。
| 知识点模块 | 必须掌握的详细内容 |
|---|---|
| 基础概念 | 1. HTTP/HTTPS定义、默认端口(80/443)。 2. URL结构(Scheme、Host、Port、Path、Query)。 3. HTTP报文结构(请求行/状态行、Headers、Body)。 |
| 请求方法与状态码 | 1. 方法 :GET(幂等)、POST、PUT、DELETE的含义。 2. 状态码:1xx(信息)、2xx(成功-200/201/204)、3xx(重定向-301/302/304)、4xx(客户端错误-400/401/403/404)、5xx(服务端错误-502/504)。 |
| Android 原生 API | 1. HttpURLConnection 的基本使用(openConnection、getInputStream、disconnect)。 2. 知道AsyncTask或Thread + Handler做网络请求(主线程禁止网络IO)。 3. 最基本的 AndroidManifest 网络权限声明(INTERNET、ACCESS_NETWORK_STATE)。 |
| 常用 Header | Content-Type(application/json, x-www-form-urlencoded, multipart/form-data)、User-Agent、Cookie、Authorization 的基本作用。 |
🟡 第二阶段:中级工程师(原理机制与Android适配)
核心目标:能封装网络库,解决Android版本兼容问题,理解加密流程。
| 知识点模块 | 必须掌握的详细内容(含Android特质) |
|---|---|
| HTTPS混合加密体系 | 1. 对称加密 (AES/DES)用于数据体加密。 2. 非对称加密 (RSA/ECC)用于加密对称密钥。 3. 哈希摘要(SHA/MD5)用于防篡改,清楚三者结合的原因(速度+安全+密钥配送)。 |
| TLS 1.2 / 1.3 握手流程 | 1. TLS 1.2 完整握手 :ClientHello -> ServerHello(证书)-> 密钥交换(Pre-Master)-> 生成会话密钥 -> Finished。 2. TLS 1.3 变化 :缩减为 1-RTT(支持 Early Data / 0-RTT),砍掉不安全加密套件。 3. 必须理解 证书链校验过程(叶子证书 -> 中间证书 -> 根证书)。 |
| Android 网络安全适配(巨坑) | 1. Android 6.0 (API 23) :动态权限不影响网络,但需注意 usesCleartextTraffic。 2. Android 7.0 (API 24) :严禁用户CA证书 ,默认只信任系统证书(导致Charles抓包失败)。 3. Android 9.0 (API 28) :默认禁止明文HTTP(cleartextTraffic 默认false),必须配置 network_security_config.xml 开启域名例外。 4. 配置 network_security_config.xml 的 debug-overrides 和 domain-config。 |
| OkHttp 源码与封装 | 1. 拦截器链(Interceptor Chain) :区分 Application Interceptor 与 Network Interceptor 的执行顺序与时机。 2. 连接池复用(ConnectionPool) :Keep-Alive 机制和最大空闲连接数。 3. 重试与重定向 :RetryAndFollowUpInterceptor 处理认证失败和重定向逻辑。 |
| Cookie 与 Session 管理 | 1. Session 基于服务端存储 + Cookie(JSESSIONID)机制。 2. 在 OkHttp 中如何通过 CookieJar 持久化保存 Cookie(内存/SharedPreferences)。 |
🔴 第三阶段:高级工程师(架构、性能与安全对抗)
核心目标:能设计高可用网络层,解决弱网/安全/监控痛点,具备协议级视野。
| 知识点模块 | 必须掌握的详细内容(碾压面试官的关键) |
|---|---|
| SSL/TLS 深度(前向保密与密码套件) | 1. 前向保密(PFS) :详细解释 ECDHE 密钥交换算法为什么比 RSA 更安全(即使私钥泄露,历史数据不可解)。 2. 能说出几种主流 Cipher Suite (如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)并解释每一段含义(密钥交换/认证/加密/MAC)。 3. 明确 TLS 记录层(Record Layer) 的分片、压缩(已弃用)、加解密、添加MAC头过程。 |
| 性能优化(体系化) | 1. DNS优化 :HTTPDNS 绕过运营商 LocalDNS 劫持,实现精准调度与防DNS劫持。 2. 连接复用 :开启 OkHttp RetryAndFollowUpInterceptor 配合 HTTP/2 多路复用。 3. 弱网监控 :利用 OkHttp EventListener 监听 connectStart、secureConnectStart(TLS握手耗时)、responseBodyStart,构建全链路监控(监控握手耗时占比通常达 60%+)。 4. 请求合并与优先级:图片/文件的并发限制与队列优先级调度。 |
| 安全加固与防抓包(军备竞赛) | 1. SSL Pinning(证书/公钥绑定) :实现 OkHttp 的 CertificatePinner,将公钥 SHA-256 写死在代码里,对抗中间人攻击(需配套证书紧急更换的服务器下发策略)。 2. 双向认证(Mutual TLS / ClientAuth) :服务端要求客户端携带证书,用于金融级身份验证。 3. 防抓包 :检测网络是否开启代理(ProxySelector),检测 VPN 环境;在 so 层实现 SSL_CTX 自定义验证(增加逆向难度)。 4. HSTS(HTTP Strict Transport Security):强制浏览器/客户端只能用 HTTPS 访问,防止 SSL 剥离攻击。 |
| HTTP/2 与 QUIC 协议进阶 | 1. HTTP/2 特性 :二进制分帧、多路复用(解决队头阻塞)、HPACK 头部压缩、Server Push。 2. Android 适配 :OkHttp 如何通过 ALPN 协商升级 HTTP/2(必须基于 HTTPS)。 3. QUIC(HTTP/3):基于 UDP,解决 TCP 队头阻塞,0-RTT 连接恢复,在 Google 系App中的降级策略。 |
| 自定义 TrustManager 踩坑 | 1. 实现 X509TrustManager 时,必须 重写 checkServerTrusted 并调用系统默认校验,严禁 空实现(否则等于关闭所有证书校验,极其危险)。 2. 处理自签名证书时,如何区分 Debug 包(宽容)与 Release 包(严格)。 3. Android P/Q 以上对弱加密算法(如 SHA1withRSA)的禁用手册。 |
| 大型项目架构设计 | 1. 网络层与业务层解耦(Retrofit + OkHttp + 协程/Flow 或 RxJava)。 2. 多 BaseUrl 动态切换(灰度环境、预发布环境)。 3. 缓存策略(强制缓存 Cache-Control 与协商缓存 ETag/Last-Modified)结合 OkHttp Cache 的实现。 |
🎯 终极总结(高级回答的"点睛之笔")
针对"HTTP和HTTPS"引出上述高级区的 "前向保密算法性能损耗分析" + "OKHttp EventListener 全链路监控方案" + "SSL Pinning 紧急证书更换的蓝绿发布策略"。
给你的学习建议: 初级看《图解HTTP》,中级源码调试 OkHttp 断点看拦截器,高级直接去啃 《RFC 8446 (TLS 1.3)》 和 查看 Conscrypt(Android默认SSL库)源码。