计网面试躲不掉的三连问:OSI七层、HTTPS握手、REST还是RPC

大家好,我是HLAIA光子。

计网是面试里绕不开的一关。OSI 七层模型、TCP/IP 四层模型、HTTPS 握手过程、REST 和 RPC 的区别,这几个问题面试官翻来覆去地问。但大多数人的理解停留在"背答案"的层面,换个问法就答不上来。


OSI 七层与 TCP/IP 四层

为什么分层

网络通信的复杂度是爆炸级的。从你敲下回车到网页渲染出来,中间经历了 DNS 查询、TCP 三次握手、TLS 加密协商、HTTP 请求、IP 路由、以太网帧封装、光纤上的光信号传输......任何一环出问题都可能打不开网页。

如果把这些功能全部塞进一个"大而全"的协议里,任何一个小的改动都会牵一发而动全身。分层的核心思想很简单:每一层只管自己的事,层和层之间通过标准接口交互,各自独立演进。

说人话就是:你写 HTTP 应用的时候不需要关心光纤用什么波长传输数据。反过来,光纤设备也不需要理解你传的是 JSON 还是 XML。

OSI 七层模型

OSI 由 ISO 在 1984 年提出,是一个理论参考模型,七层可以看这个图

数据封装是 OSI 模型的核心概念。发送方从第七层往下走,每一层给数据加上自己的头部信息,就像套娃一样一层层包起来。接收方从第一层往上走,每层拆掉对应的头部,最终还原出原始数据。

这里有个容易被忽略的点:很多人背了七层的名字,但没意识到第四层也就是传输层,是真正的分水岭。四层以下关心的是"数据怎么到达目的地",四层以上关心的是"数据是什么意思"。这个区别在你排查问题的时候特别有用。

TCP/IP 四层模型

以前有种说法,说TCP/IP 模型是简化版 OSI,其实不是,它是完全不同的出身。OSI 是先有模型再找协议填充,TCP/IP 是先有协议实践再抽象出分层。所以 TCP/IP 模型只有四层:

它的应用层把 OSI 的应用层、表示层、会话层合并了;它的网络接入层把 OSI 的数据链路层和物理层合并了。

两者对照关系:

从哪层开始排障

实际工作中网络出问题了,排查的思路就是从底层往上层走:

网络接入层:网线插好了吗?接口是 UP 状态吗? 网际层:IP 地址配对了没?能 ping 通网关吗? 传输层:目标端口开放吗?防火墙有没有拦截? 应用层:服务在跑吗?DNS 解析对了吗?证书过期了没?

这个排查习惯能省掉大量无效排查的时间。


HTTP 与 HTTPS

HTTP 的硬伤

HTTP 协议有三个先天缺陷,而且是致命的:明文传输 ,任何人都能窃听报文内容;无完整性校验 ,中间人可以篡改数据;无身份验证,中间人可以冒充服务器。

在咖啡店的公共 WiFi 下用 HTTP 访问网站,你的密码、Token、浏览记录对同网络的所有人来说都是透明的,用 Wireshark 抓个包就能看到。

HTTPS 怎么修的

HTTPS 就是在 HTTP 和 TCP 之间插了一个 TLS 层,用三套机制分别修补了这三个漏洞:

混合加密解决窃听问题。非对称加密用来安全地交换一把临时会话密钥,之后的通信都用对称加密。混合的原因是:非对称加密很慢,对称加密很快。用非对称加密传密钥只跑一次,之后的数据传输全走对称加密。

消息认证码解决篡改问题。接收方收到数据后验证 MAC 值,如果数据在传输中被改过,校验立刻失败。

数字证书解决身份伪造问题。CA 机构用自己的私钥给网站信息签名,浏览器用内置的 CA 公钥验签。签名匹配就说明这个网站确实是它声称的那个人。

现在说的"SSL 证书"其实用的是 TLS 协议。SSL 早就被废弃了,但这个名字实在太好记了,业界改不了口。

TLS 握手到底发生了什么

这是面试高频题,很多人能说出"四次握手"但讲不清楚每次握手里具体传了什么。我们来看 TLS 1.2 的完整流程:

第一次握手:客户端发 ClientHello,带上 TLS 版本、支持的密码套件列表、以及一个随机数。

第二次握手:服务器回 ServerHello 确认版本和密码套件,再发自己的证书链,再发密钥协商参数,最后告诉客户端"我说完了"。

第三次握手:客户端验证证书没问题后,生成第三个随机数用服务器公钥加密发过去。然后双方各自用这三个随机数算出同一把主密钥,再拆分成四把会话密钥。

第四次握手:双方互相发 Finished 消息确认密钥没问题。

之后的所有通信都用对称加密。这就是 HTTPS 的完整握手过程。

三个随机数的设计

三个随机数的设计,不是为了凑数。客户端生成一个,服务器生成一个,客户端再生成一个用服务器公钥加密传过去,三者共同参与最终主密钥的计算。

这套机制的核心目的是防止重放攻击:即使攻击者录制了握手的全部报文,重新发送时因为随机数不同,生成的密钥完全不同,解密失败。

TLS 1.3 的改进

TLS 1.3 在 2018 年发布,做了挺大的简化。

握手从 2-RTT 砍到了 1-RTT;加密起点提前到了 ServerHello 之后;只支持 ECDHE 密钥交换,强制前向保密;密码套件从数百种砍到仅 5 种。

前向保密的意思是,即使服务器的私钥未来某天被泄露了,历史的通信记录也无法被解密。因为每次会话的密钥是临时协商的,和服务器私钥没有直接依赖关系。这个特性在数据合规越来越严格的今天是刚需。


HTTP 与 RPC

两种设计哲学

HTTP 的 RESTful 风格和 RPC 代表了两种完全不同的世界观,

REST 把世界看成资源的集合。URL 是资源的地址,HTTP Method 是对资源的操作。核心问题是"我对哪个资源做什么操作"。

RPC 把世界看成函数的集合。像调用本地函数一样调用远程函数,网络细节全部透明。核心问题是"我要调用哪个函数,传什么参数"。

举个例子。查一个用户的信息:

REST 的思路是:GET /users/123。名词是 user,动词是 GET。

RPC 的思路是:getUser(123)。这就是函数了。

两种思路没有绝对的对错,但它们的适用场景还是有所差别。

gRPC 为什么快

gRPC 是 Google 开源的 RPC 框架,底层用了 HTTP/2 加 Protocol Buffers 序列化。

JSON 是文本,要逐字符解析,字段名在每个请求里重复传输。Protobuf 是二进制,字段名用数字编号代替,解析速度快 5 到 8 倍,序列化后的体积也比 JSON 小 60% 到 80%。

gRPC 还原生支持四种通信模式:一问一答的 Unary、服务端流式推送、客户端流式上传、以及双向流。这些在 HTTP/1.1 下要么做不了,要么需要 WebSocket 额外支持。

更关键的是契约。gRPC 的 .proto 文件编译后生成客户端和服务端代码,接口定义即文档,编译期就能检查类型安全。REST 的 Swagger 文档是人写的,人和代码之间的同步是松散的。

什么时候用哪个

这不是非此即彼的选择,业界主流做法是混合架构(没错又是混合...这个世界是一个巨大的杂交水稻):

对外暴露的 API 用 HTTP/REST。浏览器原生支持,curl 和 Postman 就能调试,所有防火墙和代理都兼容。第三方开发者不需要装任何额外的工具链。

内部微服务之间用 gRPC。速度快、契约强、流式传输原生支持。内部服务不需要考虑浏览器兼容,网络环境可控。

中间加一层 API Gateway 做协议转换。外部请求通过 HTTP 进来,Gateway 转成 gRPC 发给内部服务,响应再转回 HTTP 返回客户端。

有一点容易混淆:OpenAPI 描述的 URL 模板模式,概念上其实更接近 RPC 而不是真正的 REST。客户端清楚地知道"我要调哪个操作、填什么参数"。真正的 REST 客户端是通过服务器返回的超媒体链接来导航的,不需要提前知道 URL 结构。不过实践中纯粹的 REST 很少见,OpenAPI 风格是最主流的。


写在最后

学计网最大的误区就是把它当文科来背,七层叫什么名字、TLS 分几步握手、REST 五个约束是什么,背得滚瓜烂熟一问"为什么这么设计"就哑了。

理解设计动机比记住名词重要得多。OSI 为什么要分层,HTTPS 为什么用三个随机数,RPC 为什么比 HTTP 快。把这些问题想通,面试的时候不管对方怎么换问法你都能接住。

实际工作中这些知识也用得上。排查线上问题的时候,你能快速判断是网络层的连通性出问题、传输层的端口被防火墙挡了、还是应用层的协议不兼容。

如果你觉得这篇文章有帮助,点赞关注,点点赞~

相关推荐
JAVA社区1 小时前
Java高级全套教程(九)—— SpringCloud超详细实战详解
java·开发语言·后端·spring cloud·面试·职场和发展
yspwf1 小时前
Electron/Node 本地集成 C#/.NET,node-api-dotnet
后端
万少2 小时前
Claude Code 任务结束会自己喊你:一个 Stop Hook 搞定提示音
前端·后端·代码规范
仙俊红2 小时前
spring有多个对象时如何注入
java·后端·spring
Java爱好狂.2 小时前
Redis高级笔记:深入浅出Java面试高频考点!
java·数据库·redis·后端·java面试·java程序员·java八股文
IT_陈寒2 小时前
React hooks闭包陷阱把我坑惨了,原来这才是正确用法
前端·人工智能·后端
会编程的土豆2 小时前
Go 里 interface 为什么能比较?到底在比什么?
开发语言·后端·golang
为思念酝酿的痛2 小时前
线程同步与互斥
linux·运维·服务器·后端
meowrain3 小时前
Git HTTPS Token 凭据配置指南
git·网络协议·https