1. 从输入 URL 到页面展示,涉及哪些网络协议?
小白通俗完整版口述答案(分层说,面试官最爱听)
整个流程按照OSI七层模型、TCP/IP五层模型从上到下,一共用到这些协议,我按访问流程一步步说:
-
应用层(最上层,用户操作层) :HTTP/HTTPS、DNS
-
DNS协议:把我们输入的域名(比如www.baidu.com),翻译成服务器IP地址,电脑只能识别IP,看不懂域名
-
HTTPS/HTTP:浏览器和网页服务器传输网页数据的协议,现在全部网站都是HTTPS,HTTP是明文不安全
-
-
传输层 :TCP
- HTTPS底层基于TCP,负责建立可靠连接,保证数据不丢包、不乱序传输
-
网络层 :IP、ICMP
-
IP协议:负责寻址路由,把数据包从本机转发到目标服务器,找路用
-
ICMP:辅助协议,ping命令就是用它,检测网络通不通
-
-
数据链路层 :ARP
- ARP协议:把IP地址转换成网卡MAC物理地址,局域网内部传输数据必须用MAC地址
-
物理层:无上层协议,就是网线、光纤、网卡传输二进制比特流
面试精简总结版(收尾):整体核心协议:DNS、HTTPS、TCP、IP、ARP。
2. 中间人攻击发生在哪一层?
核心结论:主要发生在应用层、网络层;最常见、面试标准答案:应用层和传输层之间,绝大多数考题答案:传输层/应用层
通俗拆解(新人必懂):
-
中间人攻击原理:黑客拦截我和服务器之间的网络数据,窃听、篡改数据;
-
HTTP明文传输,传输层数据无加密,黑客直接拦截;所以未加密的HTTP中间人攻击主要在传输层;
-
HTTPS如果被伪造证书钓鱼劫持,攻击发生在应用层;
面试直接背标准答案 :中间人攻击主要发生在传输层和应用层 ;常规八股标准答案:主要归属传输层(TCP层),证书劫持类中间人攻击在应用层。
补充小白知识点:HTTPS就是为了防御中间人攻击,加密传输+校验证书
3. TCP 和 UDP 分别什么场景用?
1. UDP 底层原理(简单无状态)
UDP全称用户数据报协议,底层无连接、无状态
-
底层没有握手流程,发送方直接把数据+目标端口,封装成UDP数据报,直接扔给网络层传输;
-
底层不保存通信双方状态,发送完直接不管,不会记录对方有没有收到;
-
底层仅做最简单的格式校验:校验数据是否传输破损;破损直接丢弃,不会通知重传;
-
底层没有数据包排序、流量控制、拥塞控制逻辑;数据包可能乱序、丢失、重复到达
底层特点:封装头部极小、开销极低、传输延迟最小,底层结构极简
2. TCP 底层原理(面向连接可靠传输)
TCP全称传输控制协议,底层面向连接、有状态、全流程校验,四大底层核心机制
-
底层握手机制(三次握手):传输数据之前,底层必须先建立专属双向通信通道;确认收发双方收发能力正常,才可以传输数据,建立稳定连接
-
确认应答+超时重传(可靠性底层核心):对方收到数据包必须返回ACK确认报文;发送方收不到确认,底层自动判定丢包,重新发送数据包,保证数据不丢失
-
数据包排序机制:TCP底层给每一个数据包标记序列号;接收方按照序列号重组数据,解决网络传输乱序问题
-
流量控制+拥塞控制:底层动态控制发送速度;防止发送方发太快压垮接收方设备;防止全网网络拥堵导致大面积丢包
TCP断开连接底层:四次挥手,双方主动断开通道,安全释放连接资源
先记两个核心区别:
-
TCP:可靠、有连接、慢、会重传、有序; 需要先握手建立通道,数据绝对不能丢、不能乱序
-
UDP:无连接、不可靠、快、无重传; 不用建立通道,直接发数据包,丢一点数据无所谓,追求速度
TCP 使用场景(数据不能丢)
-
网页访问(HTTPS底层TCP)、文件传输FTP、邮件收发
-
接口调用、数据库访问、登录注册业务
-
总结:所有业务数据、文件、文字类传输全部用TCP
UDP 使用场景(允许少量丢包,优先速度)
-
直播、短视频、语音通话、视频通话
-
游戏联机(王者荣耀、吃鸡实时帧同步)
-
广播、内网设备发现
-
总结:音视频、实时游戏、高并发广播场景全部用UDP
6. QUIC 协议是不是结合了TCP和UDP两者优点?
是,完全就是融合两者核心优点的升级版协议
-
底层载体:QUIC 基于UDP协议开发 ,继承UDP优点:传输速度快、无握手阻塞、弱网表现好
-
上层逻辑:自己实现了TCP的全部可靠机制,继承TCP优点:保证数据不丢包、数据有序、重传失败数据包
-
额外新增优势(面试加分):解决TCP硬伤------队头阻塞、网络切换重连慢;手机WiFi切流量不用重新握手
总结口述话术:QUIC底层跑UDP,拥有UDP高速、低延迟的特点;自己封装了TCP的可靠传输逻辑,保障数据可靠,完美结合两者优点,现在HTTP3协议底层就是QUIC。
7. 余弦相似度介绍
余弦相似度,是用来判断两个向量、两段文本、两组数据相似度高低的算法指标。
核心公式:
对于两个向量 A = (a₁, a₂, ..., aₙ) 和 B = (b₁, b₂, ..., bₙ),余弦相似度计算公式为:
cos(θ) = (A·B) / (||A|| × ||B||)
其中:
- A·B = a₁b₁ + a₂b₂ + ... + aₙbₙ(向量点积)
- ||A|| = √(a₁² + a₂² + ... + aₙ²)(向量A的模长)
- ||B|| = √(b₁² + b₂² + ... + bₙ²)(向量B的模长)
底层通俗原理:
-
把文本、特征数据转换成数学向量;
-
计算两个向量之间的夹角余弦值;
-
夹角越小,余弦值越大,两个内容越相似
数值范围:-1 ~ 1
-
等于1:两个内容完全一模一样
-
等于0:两个内容毫无关系
-
等于-1:两个内容完全相反
工程场景:大模型语义检索、文本查重、推荐系统、特征匹配
8. 红黑树解决什么问题,什么场景用?
先记住核心前提:普通二叉查找树有致命缺陷:数据有序插入的时候,会变成链表,查询速度从O(logn)退化到O(n),查询巨慢。
红黑树解决的核心问题:
解决普通二叉查找树不平衡、退化成链表、增删查性能暴跌 的问题;通过染色+旋转,强制维持树的弱平衡,把增删查时间复杂度稳定控制在 O(logn)
适用场景 :需要频繁新增、删除、查询有序数据的场景;不适合大批量静态查询。
小白重点:不用懂左旋右旋、染色规则!新人面试只说解决树不平衡问题、稳定O(logn)复杂度即可。
9. 红黑树在工程中的实际应用场景?
全部都是工业级落地场景,直接口述背诵:
-
Java底层:TreeMap、TreeSet 底层数据结构就是红黑树(最常考)
-
Linux内核:进程调度、内存管理,用红黑树管理系统进程
-
C++ STL:map、set 底层全部红黑树
-
数据库:部分数据库二级索引、内存临时有序索引
10. Top K 问题怎么解决?
Top K就是从一堆数据里,找出最大/最小的前K个数据
标准最优方案:堆排序
执行流程:
-
想要找最大前K个 :初始化一个容量为K的小顶堆;
-
遍历全部数据,堆满K个元素之后;
-
后续遍历到比堆顶大的数据,替换堆顶,重新调整堆;
-
遍历结束,堆里面留存的就是最大前K个数据
时间复杂度:O(N logK),N是全部数据量
11. Top K 除了堆还能用什么?
按面试优先级排序,全部小白易懂:
-
快速排序(快排分区/快选):最优替代方案;利用快排左右分区特性,定位第K大元素,左边/右边就是TopK;复杂度O(N),小规模数据比堆更快
-
全局全量排序:最简单粗暴;把全部数据排序直接截取前K,缺点大数据效率极低,只适合小数据量
-
桶排序/计数排序:数据范围有限、整数数据专用;速度最快,局限性大
-
二叉搜索树:维护有序树,直接遍历取出前K个
面试总结话术:除了堆,小规模数据优先快选算法;数据范围固定用桶排序;极小数据直接全局排序。
12. K 的大小对方案选择的影响?
分4种情况,小白直接背结论:
-
K很小(K<100):优先堆排序;内存占用极低,效率最高;
-
K中等(100<K<1w):堆 和 快选都可以,优先快选;整体遍历耗时更低
-
K很大(K接近N,比如前80%数据):放弃堆!直接全局排序最快;堆logK开销会变大
-
K等于N:直接全部排序输出即可
核心逻辑:K越小,堆算法优势越大;K越接近总数据量,排序算法优势越大。
13. 10 亿数据量下怎么做 Top K?
核心难点 :10亿数据无法全部加载进内存,内存放不下,不能用普通堆、快排
工业标准方案:分治+小顶堆+外部排序(分步口述)
-
数据分片拆分:把10亿磁盘大文件,拆分成多个小文件,每个小文件数据可以全部读进内存;
-
分片局部TopK:每个小文件内部,用堆算出局部最大前K数据;
-
全局合并汇总:把所有分片的局部TopK结果,放入全局大顶堆,合并筛选出全局最终TopK;
面试加分补充:分布式场景下用MapReduce分治计算;大数据组件Hadoop原生支持海量TopK。
小白总结:海量数据核心思路------大拆小、内存算局部、堆合并全局。
15. AI 工程从 Prompt 工程到上下文工程到 Harness 到 Loop 的演化
-
第一阶段:Prompt 工程(最简单初级阶段)
-
核心:只修改输入话术;通过写清晰、规范的提示词,引导大模型输出想要的结果;
-
缺点:模型本身弱,光改话术上限极低,复杂任务跑不通
-
-
第二阶段:上下文工程(RAG本质就是上下文工程)
-
核心:不依赖Prompt话术,给模型外挂真实业务知识库;把外部业务文档拼接进模型上下文窗口;
-
让模型拿着外部真实数据回答,解决模型幻觉、知识滞后问题;
-
缺点:单次上下文固定,不能自主决策、不能执行动作
-
-
第三阶段:AI Harness 模型编排/管控工程
-
核心:给模型加外部调度框架;管控模型调用工具、接口、数据库;编排多模型流水线;
-
做任务分发、结果校验、流程管控;模型不再独立运行,外部系统调度模型工作
-
-
第四阶段:AI Loop 闭环自主循环(最高级Agent形态)
-
核心:闭环自动迭代;模型自主判断任务、自主调用工具、自主校验结果、自主复盘修正;
-
形成输入-执行-校验-修正的闭环循环;不需要人工干预,就是标准智能Agent
-
面试总结话术 :整个演化逻辑是从优化输入文本→补充外部知识→外部流程管控→自主闭环循环,从纯模型交互变成全自动智能Agent工程。
16. 为什么模型不够强但 Agent 效果还不错?
核心原因:Agent效果不依赖大模型本身底座能力,靠外部工程流程补齐模型短板,一共4点核心原因:
-
外部工具兜底:弱模型本身推理能力差,Agent可以调用计算器、接口、数据库、搜索引擎,靠外部工具完成复杂任务,不靠模型脑子算;
-
上下文外挂知识库:RAG外挂业务数据,弥补模型参数知识不足、幻觉问题;
-
流程拆解+闭环校验:Agent把复杂大任务拆成简单小任务,弱模型只需要完成简单子问题;循环校验修正错误;
-
人工规则+编排管控:Harness框架固定业务流程,大部分逻辑靠硬性规则执行,模型只负责做简单语义理解;
Agent是工程框架+工具+知识库+规则兜底,不是靠模型本身推理能力,小参数弱模型也能跑出很好的Agent效果。
18. 最长公共前缀
题目:给一组字符串数组,找出所有字符串开头最长的相同前缀
-
拿第一个字符串当做基准前缀;
-
依次和后面每一个字符串对比;
-
匹配不上就把前缀末尾删减;
-
前缀删减到空字符串直接返回无公共前缀;
-
遍历全部字符串,留存的前缀就是最长公共前缀
python
def longestCommonPrefix(strs):
# 情况1:数组里没有字符串,直接返回空
if not strs:
return ""
# 拿第一个字符串当做基准前缀
prefix = strs[0]
# 遍历后面每一个字符串
for s in strs[1:]:
# 只要当前字符串不是以前缀开头,就不断截短前缀
while not s.startswith(prefix):
# 删掉前缀最后一个字符
prefix = prefix[:-1]
# 前缀删空了,说明没有公共前缀,直接返回
if prefix == "":
return ""
# 全部比对完成,剩下的就是最长公共前缀
return prefix
# 测试例子
if __name__ == "__main__":
print(longestCommonPrefix(["flower", "flow", "flight"])) # fl
print(longestCommonPrefix(["dog", "racecar", "car"])) # 空字符串
print(longestCommonPrefix(["apple", "app", "application"])) # app
print(longestCommonPrefix([])) # 空
最优思路:横向遍历比对;新人不用二分、纵向遍历,最简单横向遍历即可通过面试。
19. LRU 缓存实现
先通俗定义LRU :最近最少使用缓存;缓存容量满了之后,自动删掉最久没有被访问的数据,腾出空间存新数据。
标准底层实现结构 :哈希表 + 双向链表
-
哈希表:负责快速查询数据,O(1)时间找到缓存元素;
-
双向链表:负责排序;头部放最近访问数据,尾部放最少访问数据;增删节点不需要遍历,效率高;
完整工作流程
-
查询缓存:查到数据,把这个数据移动到链表头部;
-
新增缓存:缓存没满,直接插链表头部;缓存已满,删除链表尾部最少使用数据,新数据插头部;
-
修改缓存:更新数据,移动到链表头部;