Android面试常被问的网络协议问题
HTTP、HTTPS、gRPC、WebSocket 和 TCP 握手——Android 面试里常被一锅炖的网络题,按分层答法整理成一份能讲清楚的笔记。
为什么写这篇
做 Android 业务,表面上天天在调 Retrofit、OkHttp、WebSocket 客户端,底下跑的多半是 TCP + HTTP。但面试里总有人把一堆名词端上来:
HTTP、HTTPS、1.0、1.1、2.0、gRPC、WebSocket、三次握手四次挥手——这些到底什么关系?
我脑子有时候会卡一下。不是完全不知道——大方向能说出来——但要一口气讲清「谁在上层、谁解决什么问题、Android 里实际用哪个」,就得先把这张地图理顺。
这篇就是按 面试最常问的顺序 整理的:先分层,再逐个协议,最后给一张关系图和分层答法表。
被问到时,我一般会先答这一句
传输层管「怎么可靠地把字节送到」;应用层管「这些字节代表什么意思、怎么交互」。
往下展开之前,先看这张总表:
| 类别 | 代表 | 解决什么问题 |
|---|---|---|
| 传输层 | TCP / UDP | 数据怎么传、可不可靠、要不要先建连接 |
| 安全层 | TLS(HTTPS 用它) | 传输内容加密、防窃听和篡改 |
| 应用层 | HTTP、gRPC、WebSocket | 请求格式、业务语义、通信模型 |
| HTTP 版本 | 1.0 → 1.1 → 2 → 3 | 在 TCP/QUIC 之上怎么更高效地跑 HTTP |
TCP 和 UDP 的对比见 TCP 和 UDP 的区别。这篇重点放在 HTTP 家族 以及它们和 TCP 的关系。
一张关系图,先把位置摆正
┌─────────────────────────────────┐
│ 应用层:HTTP / gRPC / WebSocket │
└───────────────┬─────────────────┘
│
HTTPS = HTTP + TLS ───┤
│
┌───────────────▼─────────────────┐
│ 传输层:TCP(HTTP/1.x、2、WS) │
│ UDP(HTTP/3 的 QUIC) │
└─────────────────────────────────┘记住三个锚点就够了:
- HTTP 是应用层协议,定义请求/响应长什么样。
- HTTPS 不是新协议,是 HTTP 套了一层 TLS 加密。
- gRPC 和 WebSocket 也是应用层,只是通信模型和 HTTP 的「一问一答」不一样。
TCP 三次握手与四次挥手:地基,不必背诗
HTTP、gRPC、WebSocket 只要走 TCP,建立连接前都要 三次握手;断开时要 四次挥手。面试爱问,是因为它考你有没有「连接是有状态的」这个直觉。
三次握手(建立连接)
| 步骤 | 方向 | 含义 |
|---|---|---|
| 1. SYN | 客户端 → 服务端 | 「我想连你,我的初始序号是 x」 |
| 2. SYN + ACK | 服务端 → 客户端 | 「收到了,我也想连你,我的初始序号是 y」 |
| 3. ACK | 客户端 → 服务端 | 「收到,连接建立」 |
为什么要三次? 确保双方都能发、都能收。两次不够——服务端没法确认客户端收到了自己的应答。
四次挥手(断开连接)
| 步骤 | 方向 | 含义 |
|---|---|---|
| 1. FIN | 主动方 → 被动方 | 「我没数据要发了」 |
| 2. ACK | 被动方 → 主动方 | 「知道了,但我可能还有数据没发完」 |
| 3. FIN | 被动方 → 主动方 | 「我也发完了,可以关了」 |
| 4. ACK | 主动方 → 被动方 | 「收到,连接彻底关闭」 |
为什么是四次? TCP 是全双工的,关闭要两边各自说「我发完了」。被动方收到 FIN 后可能还要把缓冲区里的数据发完,所以不能把 ACK 和 FIN 合成一步(多数情况下)。
Android 里你很少手写握手,但 OkHttp 的 连接池、Keep-Alive、超时重试 都建立在「TCP 连接是有生命周期的」之上。被追问 TIME_WAIT、半连接队列之类,再往 TCP 细节深挖即可。
HTTP 与 HTTPS:明文 vs 加密
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 本质 | 应用层超文本传输协议 | HTTP + TLS |
| 默认端口 | 80 | 443 |
| 数据是否加密 | 明文,可被窃听、篡改 | TLS 加密,防中间人攻击 |
| 典型场景 | 内网调试、明文局域网 | 线上 API、H5、正式环境 |
Android 里你会碰到什么
- 正式环境几乎全是 HTTPS。Retrofit + OkHttp 默认就是走 TLS。
- 本地调试 有时会开 HTTP(比如
http://10.0.2.2:8080),需要在networkSecurityConfig里允许明文,或者只在 debug 构建打开——别把这个习惯带到 release。 - 面试若问「HTTPS 安全在哪」,别只答「加密」。完整链路是:证书校验身份 → 协商对称密钥 → 后续通信用对称加密传数据。证书不对,OkHttp 会直接抛
SSLHandshakeException。
HTTP 各版本:性能演进,不是换个号
很多人能把版本号背出来,但说不清 每个版本解决了上一版的什么痛点。面试要的是这个。
| 版本 | 核心变化 | 解决了什么 | 还遗留什么 |
|---|---|---|---|
| HTTP/1.0 | 默认短连接,请求完就断 | — | 每次请求都 TCP 握手,开销大 |
| HTTP/1.1 | 默认 Keep-Alive 长连接;支持管道化(pipelining) | 同一条 TCP 上跑多个请求,少握手 | 队头阻塞:前一个响应没回来,后面的得等 |
| HTTP/2 | 二进制分帧、多路复用、头部 HPACK 压缩、服务端推送 | 一条连接并行多个请求,不再排队等响应 | TCP 层丢包会让整条连接上的流都等重传——TCP 队头阻塞 |
| HTTP/3 | 基于 QUIC(跑在 UDP 上),连接迁移、独立流 | 流之间互不影响,弱网更稳 | 生态还在普及,OkHttp 等客户端支持在跟进 |
怎么用人话记
- 1.0:打一枪换一个连接,贵。
- 1.1:连接复用,但响应还得排队——像单车道,前面车慢后面全堵。
- 2.0:多车道并行——一个 TCP 连接里多个请求同时进行。gRPC 默认就跑在 HTTP/2 上,不是巧合。
- 3.0:换了个更现代的「路面」(QUIC/UDP),单车道堵车不再拖死隔壁车道。
Android 业务侧,你调接口时 多数是 HTTP/1.1 或 HTTP/2(取决于服务端和 OkHttp 协商结果)。同一域名下 OkHttp 会 连接池复用,所以「长连接」这件事框架帮你做了——但面试问起来,你得知道底层为什么这么设计。
gRPC、WebSocket 和 HTTP:三种通信模型
这三个名字常被放在一起问,其实考的是:你的业务是「问一句答一句」,还是「一直聊」,还是「服务之间高效调用」?
| 协议 | 基于什么 | 通信模型 | 典型场景 |
|---|---|---|---|
| HTTP | TCP | 请求-响应,客户端主动问 | REST API、拉配置、上传图片 |
| WebSocket | TCP(先 HTTP 握手升级) | 全双工长连接,双方随时发 | 即时消息、行情推送、在线协作 |
| gRPC | HTTP/2 | RPC 调用,强类型接口,支持流式 | 微服务间通信、后端对后端 |
一句话区分
- HTTP:像发邮件——你写一封,等一封回信,来回分明。
- WebSocket:像打电话——线一直连着,谁都可以先开口。
- gRPC:像内部办公系统里的「远程函数调用」——我调你的
getUser(id),参数和返回值都有 schema(Protocol Buffers),序列化比 JSON 省。
Android 侧怎么选
| 需求 | 常见选型 |
|---|---|
| 普通 CRUD 接口 | Retrofit + HTTP/HTTPS |
| 服务端主动推、低延迟双向通信 | WebSocket(或 MQTT 等,那是另一条链) |
| 和后端微服务直连、要高性能强类型 | gRPC(移动端相对少,但 IoT、部分大厂内部会用) |
被追问「WebSocket 和 HTTP 长轮询有什么区别」:长轮询还是 一问一答,只是服务端故意 hold 住响应;WebSocket 升级后协议就换了,不再是 HTTP 请求响应语义,开销和实时性都更好。
面试分层答法
和 Android 面试套路 里其他题一样,网络题也常按三层往下追:
| 问题 | 基础层(会用) | 进阶层(原理) | 深入层(系统/工程) |
|---|---|---|---|
| HTTP 和 HTTPS 区别 | HTTPS 加密,正式环境用 443 | HTTPS = HTTP + TLS;证书校验防中间人 | OkHttp CertificatePinner、TLS 版本、明文流量配置 |
| HTTP/1.1 和 HTTP/2 | 2 支持多路复用,更快 | 2 二进制分帧;1.1 有应用层队头阻塞 | ALPN 协商、连接池与多路复用的关系 |
| TCP 三次握手 | 建连接要三次 | SYN/SYN-ACK/ACK 各干什么 | TIME_WAIT、半连接队列、SYN 洪水 |
| WebSocket 是什么 | 长连接、双向通信 | 先 HTTP Upgrade,再切 WS 帧协议 | 心跳、断线重连、与 OkHttp WebSocketListener |
| gRPC 是什么 | 基于 HTTP/2 的 RPC | Protobuf 序列化、四种调用模式(一元/流) | 和 REST 的取舍、移动端接入成本 |
关键词接龙 也常这么走:
HTTP 和 HTTPS → TLS 握手、证书链 → TCP 三次握手 → 长连接 Keep-Alive → HTTP/2 多路复用 → 队头阻塞 → gRPC / WebSocket 选型
上位者不需要每个细节都精通,但得能在任意一环 接住话头、往下引。
小结:一张表带走
| 名称 | 所在层 | 核心功能 | 面试一句话 |
|---|---|---|---|
| TCP | 传输层 | 可靠、有序、面向连接 | HTTP 的地基,三次握手建连、四次挥手断开 |
| HTTP | 应用层 | 请求-响应式超文本传输 | 最普遍的 API 形态,Android 里 Retrofit 就是它 |
| HTTPS | HTTP + TLS | 加密的 HTTP | 线上标配,考证书和 TLS 握手 |
| HTTP/2 | HTTP 版本 | 多路复用、二进制帧 | gRPC 的底座,解决 1.1 并发瓶颈 |
| HTTP/3 | HTTP 版本 | QUIC over UDP | 解决 TCP 队头阻塞,了解即可 |
| WebSocket | 应用层 | 全双工长连接 | 实时推送、聊天,先 HTTP 升级 |
| gRPC | 应用层(HTTP/2) | 高性能 RPC + Protobuf | 微服务间调用,强类型、可流式 |
收尾
这些协议不是什么新东西。做移动端这么多年,表面上天天在调框架,底下无非是:TCP 把字节可靠送到,HTTP 定义这些字节是什么意思,TLS 决定别人能不能偷看,WebSocket 和 gRPC 则是不同业务形态下的选型。
把它们讲清楚,不是为了面试背一张表炫技,而是为了 知道你的请求在赌什么——赌可靠、赌安全、赌实时、还是赌吞吐。
若你问我更底层的报文格式、TLS 1.3 握手细节、QUIC 连接迁移,我多半也得翻开笔记。没关系的——网络栈深不见底,能把这张地图讲明白,面试里已经够用了。