计算机网络与HTTP面试核心:从TCP到HTTPS加密

2026年 阅读约 17 分钟 面试指南 · 计算机网络

计算机网络与HTTP面试核心:OSI/TCP-IP分层、TCP三次握手与可靠传输、HTTP报文与状态码、HTTPS/TLS加密握手、HTTP/1.1到3演进、DNS解析与从URL到页面全过程。

一、网络分层模型:OSI 七层与 TCP/IP 四层

计算机网络本质是把"要发送的数据"从一台机器可靠地送到另一台机器。分层的核心目的是解耦:每一层只关心自己的职责,向上提供能力、向下调用服务,便于标准化和独立演进。

教科书用 OSI 七层(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层);工程上实际落地的是 TCP/IP 四层/五层模型(网络接口层、网络层 IP、传输层 TCP/UDP、应用层 HTTP/DNS 等)。面试常问对应关系:应用层对应 OSI 的上三层,传输层、网络层一致,网络接口层对应 OSI 的数据链路层+物理层。

各层典型协议与设备:物理层(网线、光纤、集线器)、数据链路层(MAC、交换机、ARP)、网络层(IP、ICMP、路由器)、传输层(TCP、UDP)、应用层(HTTP、HTTPS、DNS、FTP、SSH、WebSocket)。

二、TCP 可靠传输:三次握手、四次挥手与拥塞控制

三次握手建立连接:①客户端发 SYN(seq=x);②服务端回 SYN+ACK(seq=y, ack=x+1);③客户端发 ACK(ack=y+1)。为什么是三次而不是两次? 核心是确认"双方收发能力都正常":两次握手只能证明客户端→服务端通畅,服务端无法确认自己的包能否被客户端收到;三次让服务端也拿到客户端的 ACK,确认双向通路。同时三次握手能规避历史失效连接请求突然到达服务端而建立无效连接(序列号随机化防旧 SYN 建连)。

四次挥手断开:①主动方发 FIN;②被动方回 ACK(此时被动方仍可继续发数据,处于半关闭);③被动方发完剩余数据后发 FIN;④主动方回 ACK,进入 TIME_WAIT。之所以是四次而非三次,是因为被动方收到 FIN 后可能还有数据要发,不能把 ACK 与 FIN 合并,必须分两次。

TIME_WAIT 等待 2MSL:确保最后一个 ACK 能到达对方(若丢失,对方会重发 FIN),并让本连接的所有报文在网络中消散,防止新连接收到旧数据。高并发短连接服务器 TIME_WAIT 过多会占满端口——调优可开启 tcp_tw_reuse 或改用长连接/连接池,不要盲目改已废弃的 tcp_tw_recycle。

可靠传输机制:序列号 + 确认应答(ACK)、超时重传与快速重传、滑动窗口做流量控制(接收方通过 rwnd 告知还能收多少)、拥塞控制避免压垮网络(慢启动 → 拥塞避免 → 快重传 → 快恢复,阈值 ssthresh 是关键)。

UDP vs TCP:TCP 面向连接、可靠、有序、带流量/拥塞控制,首部 20 字节;UDP 无连接、不可靠、无拥塞控制、首部 8 字节,适合实时音视频、DNS、游戏。QUIC 在 UDP 之上自实现可靠与多路复用。

三、HTTP 报文、方法与状态码

HTTP 是无状态的请求/响应协议。报文分三部分:起始行(请求行/状态行)、首部(键值对)、空行、实体(body)。

常见方法:GET(获取,幂等)、POST(提交,非幂等)、PUT(整体替换,幂等)、PATCH(部分更新)、DELETE(删除,幂等)、HEAD(只取首部)、OPTIONS(探测跨域/能力)。幂等指多次执行效果相同。

常用状态码:2xx 成功(200 OK、201 Created、204 No Content);3xx 重定向(301 永久、302 临时、304 未修改走缓存、307/308 不改写方法);4xx 客户端错(400 参数错、401 未认证、403 无权限、404 不存在、405 方法不允许、429 限流);5xx 服务端错(500 内部、502 网关坏、503 过载、504 网关超时)。

GET vs POST:语义上 GET 取数据、POST 提交;GET 参数在 URL(有长度限制、会进历史/日志、不安全),POST 在 body;GET 幂等可缓存,POST 一般不可缓存。二者本质都是在 TCP 上发数据,不存在"POST 比 GET 安全"——安全靠 HTTPS。

无状态如何用 Cookie / Session 维持登录:服务端种 Session 存服务端,客户端持 SessionId(Cookie);JWT 则把声明签名后直接放客户端,服务端无状态校验。请求示例:

GET /api/user HTTP/1.1
Host: jptool.cn
Authorization: Bearer <token>
Accept: application/json

四、HTTPS 与 TLS 握手:明文为什么不安全

HTTP 明文传输,链路中任意节点都可窃听、篡改(插广告、劫持)。HTTPS = HTTP + TLS/SSL,在传输层之上加了一层加密。

对称加密(一把密钥加解密,快)vs 非对称加密(公钥加密、私钥解密,慢,解决密钥分发)。TLS 用混合加密:先用非对称协商出对称密钥,之后用对称密钥通信。

数字证书与 CA:服务端把公钥交给 CA 签名成证书,客户端内置信任的 CA 根证书,校验签名即可确认公钥确属该域名——杜绝中间人伪造公钥。自签名证书会被浏览器报警。

TLS 握手(简化):①客户端发 ClientHello(支持的加密套件、随机数);②服务端回 ServerHello(选定套件、随机数)+ 证书;③客户端验证证书,生成预主密钥用公钥加密发回;④双方各自算出会话密钥。之后的应用数据用对称密钥加密。TLS 1.3 进一步简化为 1-RTT,并支持 0-RTT 恢复连接(牺牲一定前向安全)。

五、HTTP 版本演进:1.0 → 1.1 → 2 → 3

HTTP/1.0 每条请求新建 TCP 连接(短连接),开销大。HTTP/1.1 默认持久连接(Connection: keep-alive)、支持管线化(pipelining,但响应必须按序,易队头阻塞)、分块传输、增加 Host 头支撑虚拟主机。

HTTP/2:二进制分帧、多路复用(单连接并发多请求/响应,解决应用层队头阻塞)、HPACK 头部压缩、服务器推送。但仍跑在 TCP 上,TCP 层的丢包会阻塞所有流(TCP 队头阻塞仍在)。

HTTP/3:基于 QUIC(构建在 UDP 之上),自带可靠传输与多路复用,独立流之间互不阻塞;握手结合 TLS 1.3 可 0-RTT,弱网与移动切换更稳。代价是 UDP 可能被部分网络限流。

六、DNS 解析过程

DNS 把域名解析成 IP。查询分递归(客户端→本地 DNS 一次性问到底)与迭代(本地 DNS 逐级问根→顶级域→权威)。

完整链路:浏览器缓存 → 本机 hosts → 本地 DNS 解析器(运营商/公共如 114.114.114.114、8.8.8.8)→ 根 DNS(返回顶级域服务器)→ 顶级域 DNS(如 .cn,返回权威)→ 权威 DNS(返回最终 A 记录 IP)。各级都有 TTL 缓存。

常见记录类型:A(域名→IPv4)、AAAA(→IPv6)、CNAME(别名,指向另一个域名)、MX(邮件)、TXT(校验/SPF)。DNS 也是 CDN 与负载均衡的核心(按地域返回不同 IP)。

七、从 URL 输入到页面显示

经典连贯题,串起前面所有知识点:

① URL 解析:浏览器拆分协议/主机/端口/路径;② DNS 解析拿到 IP(见上);③ TCP 三次握手建立连接(HTTPS 还需 TLS 握手);④ 发送 HTTP 请求;⑤ 服务器处理并返回响应(状态码、HTML);⑥ 浏览器解析渲染:构建 DOM 树、CSSOM、渲染树,布局(Layout)与绘制(Paint),JS 执行可能阻塞解析(async/defer 优化);⑦ 断开连接(TCP 四次挥手,keep-alive 下复用)。

优化点:CDN 就近返回 IP、HTTP/2 多路复用减少连接、强缓存/协商缓存减少请求、关键渲染路径优化首屏。

八、高频追问清单

  • 为什么三次握手不是两次? 双向通路确认 + 防历史失效连接建连。
  • TIME_WAIT 过多怎么办? 调 tcp_tw_reuse、用长连接/连接池,不要盲目改已废弃的 tcp_tw_recycle。
  • TCP 粘包/拆包? TCP 是字节流无消息边界,需应用层定长/分隔符/长度字段;UDP 是数据报有边界。
  • 301 vs 302? 301 永久(缓存、权重转移)、302 临时(不转移权重);307/308 不改写方法。
  • 强缓存 vs 协商缓存? 强缓存 Cache-Control/Expires 不请求;协商缓存 ETag/Last-Modified 问服务器是否变(304)。
  • HTTPS 一定安全吗? 只加密传输,不防钓鱼/证书冒用/服务端漏洞;"绿锁"≠ 网站可信。