Android第三次面试总结之网络篇补充

一、网络模型:OSI 七层 vs TCP/IP 四层(必考点)

1. 分层模型对比
OSI 七层模型TCP/IP 四层模型核心功能Android 相关场景
应用层(7 层)应用层定义数据格式(HTTP/HTTPS/FTP/API)OkHttp/Retrofit 封装的网络请求(如 JSON 解析、Header 处理)
表示层(6 层)-数据加密、压缩(TLS/SSL 属于此层)HTTPS 通信时的证书校验、数据加密(Android 需处理 SSL Pinning)
会话层(5 层)-建立 / 管理会话(如 TCP 连接状态)TCP 长连接保持(如 HTTP 1.1 的Connection: keep-alive
传输层(4 层)传输层端到端通信(TCP/UDP)网络请求底层选择(TCP 用于可靠传输如接口调用,UDP 用于实时通信如 VoIP)
网络层(3 层)网络层路由寻址(IP 协议、ARP 协议)IP 地址获取(WifiManager.getDhcpInfo())、子网划分
数据链路层(2 层)数据链路层MAC 寻址、差错校验(以太网协议)Wi-Fi / 蓝牙的 MAC 地址识别(getMacAddress()在 Android 6.0 + 需权限)
物理层(1 层)物理层二进制数据传输(光纤 / 电磁波)网络类型判断(Wi-Fi/4G / 蓝牙,ConnectivityManager
2. 面试题:为什么网络要分层设计?
  • :解耦复杂度(每层专注单一功能)、标准化接口(跨平台兼容)、便于故障定位(如 HTTP 404 定位到应用层问题)。
  • Android 实例:OkHttp 底层用 Socket(传输层),上层封装 HTTP(应用层),分层设计让开发者无需关心 TCP 握手细节。

二、核心协议深度解析(高频考点)

1. 传输层:TCP vs UDP(必问)
特性TCPUDPAndroid 典型场景
连接方式面向连接(三次握手 / 四次挥手)无连接(即发即弃)TCP:接口请求、文件下载;UDP:视频通话、IM 心跳包
可靠性可靠(确认应答、重传机制)不可靠(无重传,需上层处理)TCP 通过HttpURLConnection实现重试策略
传输效率低(额外控制报文)高(无额外开销)UDP 适合实时性要求高的场景(如直播推流)
流量控制滑动窗口、拥塞控制TCP 拥塞控制影响网络优化(如慢启动算法)
经典问题:
  • 三次握手过程

    1. 客户端发 SYN 包(SEQ=x,请求连接),进入 SYN_SENT;
    2. 服务端回复 SYN+ACK(SEQ=y,ACK=x+1),进入 SYN_RCVD;
    3. 客户端回复 ACK(ACK=y+1),进入 ESTABLISHED。
      为什么是三次? 两次无法确认双方收发能力(如服务端 ACK 丢失时客户端无法知晓)。
  • 四次挥手原因
    服务端收到 FIN 后,可能仍有数据未发完,需先 ACK 确认,待数据发完再发 FIN,故 ACK 和 FIN 分开发送(两次挥手)。

2. 应用层:HTTP/HTTPS(核心考点)
(1)HTTP 1.1 vs 2.0 vs 3.0(QUIC)
特性1.12.0(基于 SPDY)3.0(QUIC,基于 UDP)
连接方式短连接(默认)/ 长连接长连接(强制)无连接(基于 UDP,0RTT 建连)
多路复用管道化(有队头阻塞)二进制分帧(无阻塞)多路复用 + 流量控制
头部压缩无(明文)HPACK 算法类似 2.0,但基于 UDP 更高效
Android 支持全版本OkHttp 3.0 + 支持Android 10 + 部分支持
(2)HTTPS 加密原理(面试必问)
  • 两次加密结合
    1. 非对称加密(TLS 握手阶段):客户端用服务端公钥加密随机生成的对称密钥(如 AES);
    2. 对称加密(数据传输阶段):用上述对称密钥加密实际数据(效率高)。
  • 证书校验流程
    客户端验证证书链(根证书→中间证书→服务器证书),防止中间人攻击(Android 可通过SSLSocketFactory自定义校验)。
(3)HTTP 状态码(实战考点)
  • 301/302:永久 / 临时重定向,Android 中 OkHttp 默认跟随重定向(可通过followRedirects()禁用);
  • 401/403:认证失败 / 权限不足,需处理 Token 刷新(如 Interceptor 中捕获后重新登录);
  • 500 系列:服务端错误,需实现重试机制(结合 Retrofit 的RetryCallAdapter)。
3. 网络层:IP/ARP 协议(易忽略但重要)
  • IP 地址 vs MAC 地址
    • IP(网络层):逻辑地址,动态分配(如 DHCP 获取),用于跨子网寻址;
    • MAC(数据链路层):物理地址,固化在网卡,用于局域网内寻址。
  • ARP 协议:通过 IP 地址获取 MAC 地址(如 Android 设备连接 Wi-Fi 时,用 ARP 解析路由器 MAC)。

三、Android 网络开发深度结合(面试重点)

1. 网络库底层原理(OkHttp 为例)
  • 拦截器链RealInterceptorChain按顺序执行RetryAndFollowUpInterceptor(重试)→BridgeInterceptor(处理 Header/Cookie)→CacheInterceptor(缓存策略)→ConnectInterceptor(建立 TCP 连接)→ 网络请求。
  • Connection Pool:复用 TCP 连接(默认保持 5 分钟,最多 5 个空闲连接),减少三次握手开销。
2. 网络优化实战(面试高频)
  • 缓存策略
    • 强制缓存(Cache-Control: max-age):直接读本地,不发请求;
    • 协商缓存(ETag/Last-Modified):发请求验证,304 状态码返回缓存;
    • OkHttp 集成Cache(需配置CacheInterceptor)。
  • 流量压缩:GZip/Brotli 压缩请求 / 响应体(OkHttp 默认支持,需在 Header 加Accept-Encoding: gzip)。
  • 避免队头阻塞:HTTP 2.0 多路复用(OkHttp 默认开启),或拆分为多个独立接口。
3. 网络安全(必问)
  • SSL Pinning:在 Android 中固定服务端证书,防止中间人攻击(通过CertificatePinner实现);
  • HTTPS 双向认证:客户端也需提供证书(如企业内网 API),通过KeyStore加载客户端证书。
4. 系统级网络管理
  • 网络类型检测ConnectivityManager.getNetworkInfo()判断 Wi-Fi / 移动网络,Android 10 + 推荐用NetworkCapabilities(区分 5G/4G);
  • 后台网络限制:Android 9 + 的Background Execution Limits,需用WorkManager/JobScheduler处理后台网络任务。

四、面试真题与进阶思考

1. 经典问题:TCP 如何保证可靠性?
  • :序列号(标识数据顺序)、确认应答(ACK 机制)、超时重传(RTO 动态计算)、流量控制(滑动窗口)、拥塞控制(慢启动→拥塞避免→快重传→快恢复)。
  • Android 关联:OkHttp 的RetryAndFollowUpInterceptor实现超时重传,需注意 TCP 重传与应用层重试的区别(避免重复提交)。
2. 难题:HTTPS 握手过程中,客户端如何验证证书?
    1. 检查证书有效期、主机名是否匹配;
    2. 用根证书(系统内置或自定义)解密证书签名,对比签名哈希值;
    3. 递归验证证书链直到根证书(Android 中可通过X509TrustManager自定义校验逻辑)。
3. 开放题:如何设计一个高可用的 Android 网络请求库?
  • 思路
    • 分层设计:底层用 OkHttp/Socket,中层封装重试、缓存、序列化(如 Gson/Moshi),上层提供响应式接口(协程 / RxJava);
    • 容错机制:超时重试、网络切换重试(如从 4G 切 Wi-Fi 时重新请求)、熔断机制(多次失败后暂时拒绝请求);
    • 性能优化:HTTP 2.0 支持、连接池复用、流量压缩、按需选择 TCP/UDP(如文件上传用 TCP,实时日志用 UDP)。
4.描述一次完整的 HTTP 请求流程(结合 Android)
  • 流程步骤

    1. DNS 解析:客户端通过 DNS 服务器将域名(如www.example.com)解析为 IP 地址(需处理缓存和超时)。
    2. TCP 连接建立:三次握手建立可靠连接(SYN→SYN+ACK→ACK),Android 中通过Socket或 OkHttp 实现。
    3. 数据传输
      • 应用层:构造 HTTP 请求(如GET /api/data HTTP/1.1),通过 OkHttp/Retrofit 发送。
      • 传输层:TCP 分段传输,Android 中需处理超时重传(OkHttp 默认超时 10 秒)。
      • 网络层:IP 路由选择,Android 通过ConnectivityManager获取网络类型(WiFi / 移动网络)。
    4. 响应处理:服务器返回 HTTP 响应(如200 OK),客户端解析 JSON/XML 数据(使用 Gson/Moshi)。
    5. 连接关闭:四次挥手断开 TCP 连接,Android 中需注意Socket及时关闭避免泄漏。
  • 面试陷阱

    • 若 DNS 解析失败,Android 会抛出UnknownHostException,需在try-catch中处理。
    • TCP 连接复用(HTTP Keep-Alive)可减少三次握手开销,OkHttp 默认开启连接池。

知识扩展

TCP 可靠传输机制(面试高频原理题)
  • 序列号与确认应答:如何通过 seq/ack 确保数据按序到达?
  • 重传机制:超时重传(RTO 动态计算)、快速重传(三次冗余 ACK 触发)的区别。
  • 滑动窗口:流量控制的核心,窗口大小动态调整,与 SACK(选择性确认)的结合优化。
  • 拥塞控制:慢启动(cwnd 指数增长)→拥塞避免(线性增长)→快恢复(ssthresh 调整)的完整流程,Android 网络请求库(如 OkHttp)如何实现拥塞控制。

UDP 与 Android 实时通信

1. UDP 特性与不可靠性解决方案
  • 优点:无连接、低延迟、适合实时场景(如视频通话、IM 消息);
  • 缺点:丢包、无序、无流量控制,需应用层实现:
    • 序列号 + ACK 确认机制(类似简化版 TCP);
    • 重传策略(超时重传 + 最大重传次数限制);
    • 拥塞控制(如 Google 的 CongeSTion Control for UDP)。
  • Android 中的 UDP 使用DatagramSocket的阻塞模式处理(需子线程),分片问题(MTU 通常 1500 字节,超过需手动分片重组)。
2. UDP vs TCP 应用场景对比
  • 必问面试题:“为什么 DNS 用 UDP?”(响应快,容忍偶尔丢包,可重试);“微信视频通话用什么协议?”(UDP 为主,结合 NAT 穿透与 FEC 前向纠错)。

面试问题:

TCP 为什么是可靠的?UDP 如何实现可靠传输?

答:TCP 通过序列号、确认应答、重传、滑动窗口、拥塞控制实现可靠;UDP 需在应用层添加 ACK 机制、重传策略、流量控制(如 GTP-U 协议在 5G 中的应用)。

HTTPS 比 HTTP 慢的原因?如何优化?

答:慢在 TLS 握手(1-RTT 或 2-RTT)、加密计算;优化手段:启用 HTTP3.0(0-RTT)、会话重用(Session ID/Session Ticket)、压缩证书(OCSP Stapling)。

核心知识点脑图

网络模型与协议
├─ 分层模型(OSI/TCP/IP)
│  ├─ 各层职责与Android对应场景
│  └─ 分层设计优势(解耦/标准化)
├─ 核心协议
│  ├─ 传输层(TCP三次握手/四次挥手,UDP应用场景)
│  ├─ 应用层(HTTP/HTTPS原理,版本区别,状态码处理)
│  └─ 网络层(IP/ARP,MAC与IP区别)
├─ Android实战
│  ├─ 网络库原理(OkHttp拦截器、连接池)
│  ├─ 优化(缓存、压缩、多路复用)
│  └─ 安全与系统适配(证书校验、后台限制)
└─ 面试高频题├─ TCP可靠性/UDP优缺点├─ HTTPS加密流程与证书校验└─ 网络优化方案设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql主从集群一键搭建脚本分享

脚本1: cat pg_ms_install.sh #!/bin/bash # 基础环境配置(保持不变) setenforce 0 >/dev/null 2>&1 || true sed -i "s/SELINUXenforcing/SELINUXdisabled/" /etc/selinux/config systemctl stop firewalld >/dev/n…

LWIP的ICMP协议

ICMP协议简介 ICMP协议是一个网络层协议 背景:如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能 为什么需要ICMP协议 1,IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效…

具身智能机器人开源陪跑计划(机器人实战落地)

Who:我们是谁? 主理人背景 华南理工大学硕士毕业,10年机器人研发经验,5年“互联网机器人”创业经历 累计牵头落地的机器人30多款,累计授权专利80余项,累计论文发表10余篇。 技术履历 C#、Sql server、SPSS…

Dify 配置网络爬虫为知识库数据来源 (以Jina Reader为例) - 随笔

API获取 进入官网获取免费的API密钥 官网链接&#xff1a;https://jina.ai/reader/ 点击“<> API”按钮 点击复制文本框中的API Key&#xff1a; 进入Dify的知识库页面 → 选择“同步自Web站点” → 选择“Jina Reader” → 点击“配置”按钮 选择数据来源为Jina …

基于网络爬虫+Spark+Hadoop等大数据和SpringBoot技术实现的的汽车行业大数据分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…

React学习路线图-Gemini版

前端开发学习路线图 (针对编程新手&#xff0c;主攻 React 框架) 总原则&#xff1a;先打好地基&#xff0c;再盖楼。 无论学习哪个框架&#xff0c;扎实的 HTML、CSS 和 JavaScript 基础是成功的关键。React 是基于 JavaScript 构建的&#xff0c;所以深入理解 JS 至关重要。…

空间计算:开启人机交互新纪元的下一代技术范式

引言 当苹果CEO蒂姆库克在2023年WWDC大会上宣布Apple Vision Pro将引领“空间计算时代”时&#xff0c;这一宣言不仅标志着技术范式的迭代&#xff0c;更预示着一场融合虚实世界的革命已悄然来临。 空间计算&#xff08;Spatial Computing&#xff09;作为连接物理世界与数字…

大语言模型训练的两个阶段

先说结论&#xff1a;第一阶段在云平台训练至收敛 第二阶段本地GPU微调 一、阶段划分的核心逻辑 阶段目标资源特点典型耗时占比成本敏感度预训练获取通用表征能力需要大规模分布式计算70-90%高&#xff08;追求每美元算力&#xff09;微调适配特定任务需要领域数据安全/低延迟…

【AI News | 20250512】每日AI进展

AI Repos 1、UI-TARS UI-TARS-1.5 是字节跳动开源的多模态智能体&#xff0c;基于强大的视觉语言模型构建&#xff0c;通过强化学习实现高级推理&#xff0c;显著提升了在虚拟世界中执行多样化任务的能力和适应性。相较前期模型&#xff0c;1.5 版本在 OSWorld、Windows Agent…

[git]如何关联本地分支和远程分支

主题 本文总结如何关联git本地分支和远程分支的相关知识点。 详情 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支(本地远程) git branch -a 查看本地分支及其关联的远程分支(如有) git branch -vv 关联本地分支到远程分支&#xff1a; git branch …

CC53.【C++ Cont】二分查找的普通模版

目录 1.知识回顾 2.关键点 特点 三个模版 普通的模版(有局限) 以LeetCode上的一道题为例:704. 二分查找 分析 引入二段性:分两段,舍一段,操作另一段(这个是二分查找的本质!) 代码 提交结果 当然也可以使用随机数来分两段 普通模版总结 1.知识回顾 之前在C语言专栏…

lua脚本+Redission实现分布式锁

实现分布式锁最简单的一种方式&#xff1a;基于Redis 不论是本地锁还是分布式锁&#xff0c;核心都在于“互斥”。 在 Redis 中&#xff0c; SETNX 命令是可以帮助我们实现互斥。SETNX 即 set if not exists (对应 Java 中的 setIfAbsent 方法)&#xff0c;如果 key 不存在的…

设计模式之工厂模式(二):实际案例

设计模式之工厂模式(一) 在阅读Qt网络部分源码时候&#xff0c;发现在某处运用了工厂模式&#xff0c;而且编程技巧也用的好&#xff0c;于是就想分享出来&#xff0c;供大家参考&#xff0c;理解的不对的地方请多多指点。 以下是我整理出来的类图&#xff1a; 关键说明&#x…

MultiTTS 1.7.6 | 最强离线语音引擎,提供多音色无障碍朗读功能,附带语音包

MultiTTS是一款免费且支持离线使用的文本转语音&#xff08;TTS&#xff09;工具&#xff0c;旨在为用户提供丰富的语音包选项&#xff0c;实现多音色无障碍朗读功能。这款应用程序特别适合用于阅读软件中的离线听书体验&#xff0c;提供了多样化的语音选择&#xff0c;使得听书…

歌曲《忘尘谷》基于C语言的歌曲调性检测技术解析

引言 在音乐分析与数字信号处理领域&#xff0c;自动检测歌曲调性是一项基础且关键的任务。本文以C语言为核心&#xff0c;结合音频处理库&#xff08;libsndfile&#xff09;和快速傅里叶变换库&#xff08;FFTW&#xff09;&#xff0c;探讨如何实现调性检测&#xff0c;并通…

大某麦演唱会门票如何自动抢

引言 仅供学习研究&#xff0c;欢迎交流 抢票难&#xff0c;难于上青天&#xff01;无论是演唱会、话剧还是体育赛事&#xff0c;大麦网的票总是秒光。大麦网是国内知名的票务平台&#xff0c;热门演出票往往一票难求。手动抢票不仅耗时&#xff0c;还容易错过机会。作为一名…

1.3.3 tinyalsa详细介绍

一、TinyALSA 的背景与设计目标 1. 诞生背景 Android 音频需求的演变&#xff1a;早期 Android 系统使用标准 ALSA&#xff08;Advanced Linux Sound Architecture&#xff09;的用户空间库 alsa-lib&#xff0c;但因其复杂性&#xff08;代码庞大、依赖较多&#xff09;和资…

超越合并速度(merge speed):AI如何重塑开发者协作

李升伟 编译 AI 关于现代开发的讨论通常围绕着单一指标&#xff1a;合并速度&#xff08;merge speed&#xff09;。但在这一表面测量之下&#xff0c;隐藏着开发团队工作方式的一种更深刻的变革。让我们探讨开发者协作的微妙演变方式以及为什么传统生产力指标只讲述了一部分故…

如何找正常运行虚拟机

1.新建虚拟机。Linux centos7&#xff0c;给虚拟机改个名字不要放在c盘 2.安装操作系统。cd/dvd->2009.iso 启动虚拟机

深度学习:系统性学习策略(二)

深度学习的系统性学习策略 基于《认知觉醒》与《认知驱动》的核心方法论,结合深度学习的研究实践,从认知与技能双重维度总结以下系统性学习策略: 一、认知觉醒:构建深度学习的思维操作系统 三重脑区协同法则 遵循**本能脑(舒适区)-情绪脑(拉伸区)-理智脑(困难区)**的…