1.OSI和TCP/IP模型
-
OSI 七层口诀: 这里的顺序是从下往上的,如果不熟,可以用谐音记:
- 物数网传会表应 (巫术网传会报应 —— 稍微有点迷信但很好记!)
- 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
-
核心差异点:
- 面试官如果追问“为什么要合并上面三层?”,你可以补充一句:“因为在实际开发中,会话管理和数据格式转换(表示层)往往都是由应用程序自己来做的,不需要单独分层,所以 TCP/IP 这样更务实。”
第一,它们的定位不同。 OSI 七层模型是国际标准化组织制定的理论标准,非常严谨但比较复杂;而 TCP/IP 模型是互联网实际使用的工业标准,它是对 OSI 的一种简化和实践。
第二,它们的层级对应关系。 OSI 分为 7 层,从下往上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 而 TCP/IP 模型通常分为 4 层。它最大的区别在于,它把 OSI 最上面的三层(应用层、表示层、会话层)合并成了一个‘应用层’。 剩下的对应关系是:
-
传输层对应传输层(比如 TCP、UDP);
-
网络层对应网络层(比如 IP);
-
最底下的物理层和数据链路层,在 TCP/IP 里通常合并称为‘网络接口层’。
第三,结合 Java 开发来看。 我们在做后端开发时,其实接触最多的就是 TCP/IP 模型。
-
比如我们写 Controller 处理请求,或者用 Spring Cloud 调接口,主要是在应用层(HTTP 协议)。
-
而在排查网络连接中断、或者做一些高性能通信(比如 Netty)时,会关注传输层(TCP 三次握手、粘包拆包等问题)。
2.HTTP长连接
如果每次请求都要经历这样的过程:建立 TCP → 请求资源 → 响应资源 → 释放连接,那么此方式就是 HTTP 短连接,如下图:

- 这样实在太累人了,一次连接只能请求一次资源。 能不能在第一个 HTTP 请求完后,先不断开 TCP 连接,让后续的 HTTP 请求继续使用此连接? 当然可以,HTTP 的 Keep-Alive 就是实现了这个功能,可以使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,避免了连接建立和释放的开销,这个方法称为 HTTP 长连接。
特点:只要其中一方没有明确断开连接,就不会断开

3.讲讲HTTP和HTTPS

“关于 HTTP 和 HTTPS,简单来说,HTTP 是超文本传输协议,信息是明文传输的;而 HTTPS 可以看作是 HTTP + SSL/TLS,也就是在 HTTP 下面加了一层安全协议,用来保证数据的加密传输。
具体来说,主要有这几个区别:
第一,安全性不同(最核心)。
- HTTP 是明文传输,如果在网络中截包,是可以直接看到内容的,这很容易导致信息泄露或者被篡改(比如运营商劫持插广告)。
而 HTTPS 也是基于 HTTP 的,但它利用 SSL/TLS 协议进行了加密。它能做到三点:内容加密(别人看不懂)、身份认证(确认网站是真的)、数据完整性(防止被篡改)。
第二,默认端口不同。
这是一个硬指标,HTTP 默认使用 80 端口,HTTPS 默认使用 443 端口。
第三,资源消耗和证书。
HTTP 比较简单,连接建立快。
HTTPS 因为需要 SSL 握手(涉及到非对称加密和对称加密的转换),所以握手阶段比较耗时,对服务器 CPU 资源消耗也稍大一点。另外,HTTPS 通常需要去 CA 机构申请证书,企业级证书一般是收费的。
最后,结合项目经验(加分项):
在实际的 Java 微服务开发中,我们通常会在**网关层(如 Nginx 或 Spring Cloud Gateway)**配置 HTTPS 证书,对外暴露 HTTPS 接口。而在内网微服务之间调用时,为了性能考虑,有时候还是会直接用 HTTP。”
面试官听完这个,大概率会通过“安全性”这三个字往下挖。你要准备好这两个概念:
-
对称加密 vs 非对称加密:
-
HTTPS 怎么用的? 它是混合使用。
-
口语表达: “在握手建立连接的时候,用‘非对称加密’(公钥私钥)来安全地交换密钥;等到连接建立好,真正传输数据的时候,为了速度快,就改用‘对称加密’了。”
-
-
CA 证书是干嘛的?
- 防止“中间人攻击”。证明“我是我”,不是黑客伪造的网站。
4.讲讲HTTPS握手过程
“SSL/TLS 握手的核心目的,就是利用非对称加密(公钥/私钥),安全地协商出一把‘对称密钥’(Session Key),用来后续加密传输数据。
整个过程可以概括为四个主要步骤:
第一步:打招呼(Client Hello)
客户端(比如浏览器)先发个消息给服务器,告诉服务器:‘我支持哪些加密算法’,并且带上一个随机数 A。
第二步:亮身份(Server Hello)
服务器收到后,选定一种加密算法,然后回发给客户端三样东西:
-
服务器的证书(这里面包含了公钥,就像我们刚才说的‘特制锁头’)。
-
另一个随机数 B。
-
确认使用的加密协议版本。

第三步:关键交换(Key Exchange)
这是最核心的一步。客户端收到证书后,先找 CA 验证证书是不是真的(防假冒)。
验证通过后,客户端生成第三个随机数,叫 Pre-master Secret。
然后,客户端用服务器的公钥把这个 Pre-master Secret 加密(锁起来),发给服务器。
这时候,全世界只有服务器有私钥能解开这个包,拿到这个秘密。
第四步:生成会话密钥(Session Key)
现在,客户端和服务器手里都有了三个数:随机数 A、随机数 B、Pre-master Secret。
双方利用相同的算法,把这三个数混合在一起,生成最终的 会话密钥(Session Key)。
最后,双方互相发一个‘Finished’消息,表示‘后面的数据我都用这个会话密钥加密了’,握手结束。”
-
为什么要有第三个随机数(Pre-master Secret)?
- 回答: “为了保证随机性。前两个随机数是明文传输的,容易被截获。第三个是加密传输的,只有双方知道,这样生成的最终密钥才安全。”
-
为什么要这么麻烦?全程用公钥私钥加密不行吗?(非对称加密)
- 回答: “不行,因为非对称加密太慢了(比对称加密慢几百倍),非常消耗 CPU。所以我们只在握手这一瞬间用它来交换密钥,后面传数据全都要切回对称加密(AES)来保证速度。”
5.DNS了解吗
端口:53
“对于 DNS,我的理解是:它就是互联网的通讯录(或电话本)。因为在这个网络世界里,计算机只认识 IP 地址(一串数字),记不住像 baidu.com 这样的域名。所以 DNS 的作用就是把好记的域名翻译成机器能读的 IP 地址。
关于 DNS 的解析流程,我把它分为几个层级(假设我要访问 www.google.com):
第一层:找缓存(这是最快的)
-
浏览器缓存: 浏览器会先看自己有没有记过。
-
系统缓存(Hosts): 如果浏览器没有,就去问操作系统(比如
/etc/hosts文件)。 -
路由器缓存: 再没有,就去问路由器。
第二层:问本地 DNS 服务器(LDNS)
如果家里都没找到,我的电脑就会发请求给本地 DNS 服务器(通常是运营商提供的,比如电信或联通的 DNS)。这时候,LDNS 如果有缓存就直接给我;如果没有,它就要帮我去‘跑腿’了。
第三层:全球接力查(这里是重点)
LDNS 会代表我,去互联网上进行一轮‘接力问询’:
-
问根域名服务器(Root): ‘老大,你知道
com归谁管吗?’ —— 根服务器说:‘找.com顶级域名服务器。’ -
问顶级域名服务器(TLD): ‘你好,你知道
google.com归谁管吗?’ —— TLD 服务器说:‘去找 Google 的权威域名服务器。’ -
问权威域名服务器(Authoritative): ‘终于找到你了,
www.google.com的 IP 是多少?’ —— 权威服务器说:‘是142.250.x.x,拿去吧!’
最后,LDNS 拿到 IP,一边把它存进缓存(方便下次用),一边告诉我的电脑,这样我就能上网了。”