返回 Java / Kotlin
Java / Kotlin
13 分钟阅读

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)    │
                    └─────────────────────────────────┘

记住三个锚点就够了:

  1. HTTP 是应用层协议,定义请求/响应长什么样。
  2. HTTPS 不是新协议,是 HTTP 套了一层 TLS 加密。
  3. 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 加密

对比项HTTPHTTPS
本质应用层超文本传输协议HTTP + TLS
默认端口80443
数据是否加密明文,可被窃听、篡改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:三种通信模型

这三个名字常被放在一起问,其实考的是:你的业务是「问一句答一句」,还是「一直聊」,还是「服务之间高效调用」?

协议基于什么通信模型典型场景
HTTPTCP请求-响应,客户端主动问REST API、拉配置、上传图片
WebSocketTCP(先 HTTP 握手升级)全双工长连接,双方随时发即时消息、行情推送、在线协作
gRPCHTTP/2RPC 调用,强类型接口,支持流式微服务间通信、后端对后端

一句话区分

  • 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 加密,正式环境用 443HTTPS = HTTP + TLS;证书校验防中间人OkHttp CertificatePinner、TLS 版本、明文流量配置
HTTP/1.1 和 HTTP/22 支持多路复用,更快2 二进制分帧;1.1 有应用层队头阻塞ALPN 协商、连接池与多路复用的关系
TCP 三次握手建连接要三次SYN/SYN-ACK/ACK 各干什么TIME_WAIT、半连接队列、SYN 洪水
WebSocket 是什么长连接、双向通信先 HTTP Upgrade,再切 WS 帧协议心跳、断线重连、与 OkHttp WebSocketListener
gRPC 是什么基于 HTTP/2 的 RPCProtobuf 序列化、四种调用模式(一元/流)和 REST 的取舍、移动端接入成本

关键词接龙 也常这么走:

HTTP 和 HTTPS
  → TLS 握手、证书链
  → TCP 三次握手
  → 长连接 Keep-Alive
  → HTTP/2 多路复用
  → 队头阻塞
  → gRPC / WebSocket 选型

上位者不需要每个细节都精通,但得能在任意一环 接住话头、往下引


小结:一张表带走

名称所在层核心功能面试一句话
TCP传输层可靠、有序、面向连接HTTP 的地基,三次握手建连、四次挥手断开
HTTP应用层请求-响应式超文本传输最普遍的 API 形态,Android 里 Retrofit 就是它
HTTPSHTTP + TLS加密的 HTTP线上标配,考证书和 TLS 握手
HTTP/2HTTP 版本多路复用、二进制帧gRPC 的底座,解决 1.1 并发瓶颈
HTTP/3HTTP 版本QUIC over UDP解决 TCP 队头阻塞,了解即可
WebSocket应用层全双工长连接实时推送、聊天,先 HTTP 升级
gRPC应用层(HTTP/2)高性能 RPC + Protobuf微服务间调用,强类型、可流式

收尾

这些协议不是什么新东西。做移动端这么多年,表面上天天在调框架,底下无非是:TCP 把字节可靠送到,HTTP 定义这些字节是什么意思,TLS 决定别人能不能偷看,WebSocket 和 gRPC 则是不同业务形态下的选型。

把它们讲清楚,不是为了面试背一张表炫技,而是为了 知道你的请求在赌什么——赌可靠、赌安全、赌实时、还是赌吞吐。

若你问我更底层的报文格式、TLS 1.3 握手细节、QUIC 连接迁移,我多半也得翻开笔记。没关系的——网络栈深不见底,能把这张地图讲明白,面试里已经够用了。

相关文章

Android
公开
18 分钟
Android面试套路
面试分层答法总表——网络题也常按「会用 → 为什么 → 系统怎么协作」往下追。