计算机网络八股
本文参考并整理自 JavaGuide,对计算机网络中常见的面试高频问题进行了内容精简与结构化梳理。在保证核心概念准确性的前提下,尽量压缩表述、突出关键点,并结合个人理解做了适当的记忆扩展,便于快速复习和长期理解。
网络分层模型
OSI 七层模型
物(比特传输)、链(帧编码、差错控制)、网(路由和寻址)、输(进程通信)、会、示(编码、加密)、用
TCP/IP 四层模型
接(链路和物理)、网、输、用(会话、表示、应用)
网络分层的原因
- 各层相互独立(无需关注其他层)
- 提高灵活性和可替换性(多答特性)
- 大问题化小(复杂问题拆解)
协议
常见协议
应用层:HTTP、SMTP(发邮件)、POP3/IMAP(收邮件)、FTP(文件)、Telnet(登录)、SSH、RTP(实时传输,通常UDP)、DNS(域名解析,UDP)
传输层:TCP(面向连接、可靠)、UDP(无连接、最大可能交付)
网络层:IP、ARP(IP转MAC)、ICMP(控制报文)、NAT(网络地址转换)、OSPF(基于链路状态的内部网关协议)、RIP(基于距离向量的内部网关协议)、BGP(边界网关协议)
HTTP
输入URL到页面展示(重点)
- 输入指定网页的 URL。
- DNS 协议,解析出 IP 地址。
- 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
- 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
- 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
- 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
- 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
HTTP状态码

常见 HTTP 头字段包括:
- Host、User-Agent、Accept、Authorization、Cookie
HTTP/1.0 和 HTTP/1.1 有什么区别?

- 前者短连接、后者长连接
- 后者新增多种状态码
- 引入更多缓存控制策略(提供更多缓存头字段如:Entity tag、If-Match)
- 带宽,加入range头域,允许只请求资源的某个部分
- Host头,允许同一个IP托管多个域名,实现虚拟主机
HTTP/1.1 和 HTTP/2.0 有什么区别?(重点)

- 多路复用:HTTP/2 单连接并发请求;HTTP/1.1 连接内串行
- 二进制分帧:HTTP/2 二进制传输;HTTP/1.1 文本报文
- 队头阻塞:HTTP/2 解决应用层阻塞;HTTP/1.1 存在
- 头部压缩:HTTP/2 支持 HPACK;HTTP/1.1 不支持
- 服务器推送:HTTP/2 支持;HTTP/1.1 不支持
HTTP/2.0 和 HTTP/3.0 有什么区别?

- 传输协议:HTTP/2 基于 TCP;HTTP/3 基于 QUIC(UDP)
- 连接建立:HTTP/2 需 TCP + TLS 握手;HTTP/3 支持 0-RTT / 1-RTT
- 队头阻塞:HTTP/2 存在 TCP 层 HOL;HTTP/3 基本解决
- 头部压缩:HTTP/2 使用 HPACK;HTTP/3 使用 QPACK
- 连接迁移:HTTP/3 支持(基于 Connection ID);HTTP/2 不支持
- 安全性:HTTP/2 TLS 运行在 TCP 之上;HTTP/3 QUIC 内建加密整个数据包
三种HTTP协议比较

HTTP/1.1 和 HTTP/2.0 的队头阻塞有什么不同?
| 方面 | HTTP/1.1 的队头阻塞 | HTTP/2.0 的队头阻塞 |
|---|---|---|
| 阻塞层级 | 应用层(HTTP 协议本身限制) | 传输层(TCP 协议限制) |
| 根本原因 | 无法多路复用,请求和响应必须按顺序传输 | TCP 要求数据包按序交付,丢包会阻塞整个连接 |
| 受影响范围 | 单个 HTTP 请求/响应会阻塞后续请求/响应 | 单个 TCP 包丢失会影响所有 HTTP/2.0 流 |
| 缓解方法 | 开启多个并行 TCP 连接(一般限制6个) | 减少丢包,或使用基于 UDP 的 QUIC |
| 影响场景 | 几乎每次都会发生,尤其是大文件阻塞小文件 | 丢包率较高的网络环境下更明显 |
HTTP 是不保存状态的协议, 如何保存用户状态?(重点)
HTTP 协议本身是 无状态的 (stateless) 。
为了解决这个问题,主要有以下几种常用机制:
方案一:Cookie + Session(主流)
- 服务端创建 Session 保存用户状态
- 通过 Cookie 存 SessionID
- 每次请求自动携带 SessionID
- Session 常存于 Redis / 内存
特点:有状态、依赖 Cookie、实现简单、广泛使用
方案二:URL 重写(不常用)
- 将 SessionID 放入 URL 参数中
- 服务器从 URL 中识别用户
缺点:不安全、不美观、对搜索引擎优化(SEO)不友好
方案三:Token(如 JWT)
- 登录成功后返回 Token
- 客户端自行保存(Header / localStorage)
- 每次请求携带 Token
- 服务端 不保存会话状态
特点:无状态、适合前后端分离和微服务
| 对比点 | Session | JWT / Token |
|---|---|---|
| 状态存储 | 服务端保存会话状态 | 客户端保存,服务端无状态 |
| 依赖 Cookie | 是 | 否(通常放 Header) |
| 扩展性 | 分布式需共享 Session | 天然适合分布式 |
| 安全控制 | 可随时失效 / 踢下线 | 一旦签发难以主动失效 |
| 性能开销 | 需查询 Session 存储 | 无需查库,直接校验 |
| 适用架构 | 传统 Web / 单体应用 | 前后端分离 / 微服务 |
| Token 体积 | 小(仅 SessionID) | 较大(携带用户信息) |
| 常见存储 | 内存 / Redis | Header / localStorage |
URL和URI的区别
- URI 是统一资源标识符,用来唯一标识资源;
- URL 是 URI 的一种,不仅标识资源,还指明资源的位置和访问方式。
- 所以 URL 一定是 URI,但 URI 不一定是 URL。
Cookie 和 Session 有什么区别?
| 对比点 | Cookie | Session |
|---|---|---|
| 存储位置 | 浏览器(客户端) | 服务器 |
| 数据存什么 | 可以直接存用户信息 | 通常存用户状态数据 |
| 安全性 | 低(可被篡改) | 相对高(存在服务器) |
| 大小限制 | 一般 4KB 左右 | 理论不限(受服务器内存限制) |
| 是否占服务器资源 | 不占 | 占 |
| 依赖关系 | 可独立存在 | 依赖 Cookie(通常) |
GET 和 POST 的区别(重点)
| 对比维度 | GET | POST |
|---|---|---|
| 语义(核心区别) | 获取 / 查询资源 | 创建 / 修改资源 |
| 是否幂等 | 是(多次执行结果相同) | 否(可能产生不同结果) |
| 是否安全(语义层面) | 是(不改变资源状态) | 否(会改变资源状态) |
| 参数位置 | URL 查询字符串(query string) | 请求体(body) |
| 参数格式 | URL 编码 | application/x-www-form-urlencoded、multipart/form-data、application/json 等 |
| 长度限制 | 受浏览器和服务器对 URL 长度限制 | 理论无限制(受服务器限制) |
| 是否可缓存 | 可以(浏览器/代理默认可缓存) | 默认不可缓存 |
| 数据暴露性 | 参数显示在 URL 中,容易暴露 | 参数在 body 中,相对不易暴露 |
| 是否一定更安全? | 否(HTTP 下都是明文) | 否(HTTP 下都是明文) |
| 典型场景 | 搜索、查询列表、获取详情 | 登录、注册、提交表单、创建订单 |
WebSocket
什么是WebSocket
- WebSocket 是一种基于 TCP 的全双工通信协议。
- 它通过 HTTP 握手建立连接,然后升级为 WebSocket 协议。
- 与 HTTP 的请求-响应模式不同,WebSocket 支持服务器主动向客户端推送数据,适用于实时通信场景,如聊天室、实时行情等。
WebSocket 和 HTTP 有什么区别?
| 对比维度 | HTTP | WebSocket |
|---|---|---|
| 协议层级 | 应用层协议(基于 TCP) | 应用层协议(基于 TCP) |
| 通信模式 | 单向(请求-响应) | 双向(全双工) |
| 谁发起通信 | 只能客户端发起 | 双方都可以主动发送 |
| 是否支持实时通信 | 不适合 | 非常适合 |
| 协议前缀 | http:// https:// |
ws:// wss:// |
| 是否支持扩展 | 扩展性较弱 | 支持扩展(子协议、压缩等) |
| 数据格式 | 每次请求携带完整头部 | 使用帧(frame),头部小 |
| 网络开销 | 较大 | 较小 |
| 适合场景 | 普通网页请求 | 聊天、实时推送、游戏 |
WebSocket 的工作过程是什么样的?
1 | HTTP 请求 |
- WebSocket 首先通过 HTTP 握手请求升级协议,服务器返回 101 状态码表示升级成功。
- 之后双方建立一个基于 TCP 的长连接,并通过帧的形式进行双向通信。
- 关闭连接时会先发送关闭帧,然后再断开 TCP。
- 为了保持连接活跃,通常还会使用心跳机制。
WebSocket 与短轮询、长轮询的区别(重点)
| 对比维度 | 短轮询 | 长轮询 | WebSocket |
|---|---|---|---|
| 基于协议 | HTTP | HTTP | WebSocket(基于 TCP) |
| 通信模式 | 请求-响应 | 请求-响应 | 全双工 |
| 是否长连接 | 否 | 半长连接 | 是 |
| 实时性 | 一般 | 较好 | 非常好 |
| 服务器能否主动推送 | 否 | 否(本质仍是响应) | 是 |
| 连接开销 | 高(频繁建立) | 中(响应后重建) | 低(持续连接) |
| 服务器压力 | 高 | 较高 | 相对较低 |
| 实现复杂度 | 简单 | 中等 | 较复杂 |
| 典型场景 | 低频刷新 | 实时性要求不高的通知 | 聊天、IM、实时游戏 |
短轮询
“我每 5 秒问你一次”
长轮询
“我问你,你没消息就别挂电话,有了再告诉我”
WebSocket
“我们一直保持通话,随时说话”
SSE 与 WebSocket 有什么区别?
| 特性 | SSE(Server-Sent Events) | WebSocket |
|---|---|---|
| 通信方式 | 单向:服务器 → 客户端 | 双向(全双工):客户端 ↔ 服务器 |
| 底层协议 | 基于 HTTP/HTTPS,长连接发送事件流 | 独立协议 ws:// 或 wss://,通过 HTTP Upgrade 建立连接 |
| 实现复杂度 | 简单,浏览器原生 EventSource 支持,开发成本低 |
较复杂,需要处理连接管理、心跳和重连逻辑 |
| 断线重连 | 浏览器自动支持 | 需要手动实现 |
| 数据类型 | 主要文本(UTF-8),二进制需编码 | 原生支持文本和二进制 |
| 适用场景 | 实时推送更新、流式响应,如大型语言模型 API | 实时双向交互,如聊天室、在线游戏、协作应用 |
PING
PING 命令的作用是什么?
PING 是一种常用的网络诊断工具,用于测试主机之间的连通性和网络延迟。通过向目标主机发送 ICMP 请求报文,并接收回应,用户可以判断网络是否畅通以及往返时间(RTT)。
PING 命令的工作原理是什么?
PING 基于 ICMP(Internet Control Message Protocol) 实现:
- 发送 ICMP Echo Request(类型 8)到目标主机。
- 目标主机若连通,会返回 ICMP Echo Reply(类型 0)。
- 通过计算请求发送到回应接收的时间,得到往返延迟(RTT)。
PING 的核心就是通过 ICMP 报文查询主机是否可达,并获取网络性能信息。
DNS
DNS 的作用是什么?
- 将域名映射为 IP 地址。
- 电脑上一般会保留DNS缓存
- DNS 是 应用层协议,可以在 UDP 或 TCP 上运行,默认端口为 53
DNS 服务器有哪些?根服务器有多少个?
根 DNS:指向 TLD 服务器,全球 13 个 IP 地址,实际部署 1700+ 台。
顶级域 DNS (TLD):管理域名后缀,如 .com、.cn。
权威 DNS:存储域名真实 IP,是最终解析源。
本地 DNS:ISP 提供的代理服务器,加速解析。
DNS 解析的过程是什么样的?
完整解析流程较为复杂,可参考专门文章:DNS 域名系统详解(应用层) 。
简要流程如下:
- 用户发起域名请求 → 浏览器、操作系统、路由器缓存查询。
- 缓存未命中 → 本地 DNS 服务器查询。
- 本地 DNS 服务器递归查询根 DNS → TLD DNS → 权威 DNS,直到获取域名对应 IP。(或迭代查询)
- 返回 IP,浏览器与服务器建立连接。
DNS 劫持了解吗?如何应对?
DNS 劫持(DNS Hijacking)是一种网络攻击,通过修改 DNS 解析结果,将用户访问的域名指向错误 IP,导致:
- 无法访问正常网站
- 被引导至恶意网站
应对措施:
- 使用可信的 DNS 服务器(如 114.114.114.114、8.8.8.8 等)
- 使用 DNS over HTTPS(DoH)或 DNS over TLS(DoT)加密解析
- 安装安全防护软件,防止本地 DNS 缓存被篡改
TCP与UDP
TCP与UDP区别(重要)
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠 | 不可靠(尽力而为) |
| 状态维护 | 有状态 | 无状态 |
| 传输效率 | 较低 | 较高 |
| 传输形式 | 面向字节流 | 面向数据报(报文) |
| 头部开销 | 20–60 字节 | 8 字节 |
| 通信模式 | 点对点(单播) | 单播、多播、广播 |
| 常见应用 | HTTP/HTTPS、FTP、SMTP、SSH | DNS、DHCP、SNMP、TFTP、VoIP、视频 |
HTTP是基于TCP还是UDP?
- HTTP/1.x 和 HTTP/2
- 基于 TCP 协议
- TCP 提供可靠、面向连接的传输,确保数据按序无误到达
- 发送请求前需要经历 TCP 三次握手
- TCP 特性可能导致 队头阻塞(HOL Blocking):如果一个报文丢失,整个连接上的其他流都会等待重传
- HTTP/3
- 弃用 TCP,改用 QUIC 协议(基于 UDP)
- 解决队头阻塞问题:不同流独立传输,单个流丢包不会影响其他流
- 减少连接延迟:QUIC + TLS 1.3 支持 0-RTT 或 1-RTT 握手
- 更适合高并发、低延迟的网页和流式应用
总结:HTTP/1.x 和 HTTP/2 基于 TCP,HTTP/3 基于 UDP 的 QUIC 协议。
有哪些基于 TCP/UDP 的协议?
| 传输协议 | 应用协议 | 主要用途 | 特点 |
|---|---|---|---|
| TCP | HTTP / HTTPS | 网页传输 | 可靠、有序,HTTPS 增加 TLS 加密 |
| FTP / SFTP / FTPS | 文件传输 | 可靠传输,SFTP/FTPS 提供加密 | |
| SMTP | 发送邮件 | 可通过 STARTTLS 加密 | |
| POP3 / POP3S | 接收邮件 | 下载邮件到本地,POP3S 为加密版本 | |
| IMAP / IMAPS | 管理邮件 | 邮件保留在服务器,多设备同步 | |
| Telnet | 远程登录 | 明文传输,不安全 | |
| SSH | 安全远程管理 | 加密远程登录与命令执行,替代 Telnet | |
| UDP | HTTP/3 (QUIC) | 网页传输 | 基于 UDP 的 QUIC 协议,减少延迟,支持 0-RTT |
| DHCP | 动态分配 IP | 自动获取 IP、子网掩码、网关、DNS | |
| DNS | 域名解析 | 通常用 UDP 快速查询,大响应或区域传送会切换 TCP | |
| RTP / RTCP | 实时音视频 | 低延迟,允许少量丢包,RTCP 提供质量监控 | |
| TFTP | 简单文件传输 | 小文件传输,常用于局域网设备升级 | |
| SNMP | 网络管理 | 查询与修改网络设备状态 | |
| NTP | 时间同步 | 保证网络计算机时间一致 |
TCP 三次握手和四次挥手(非常重要)


为什么要三次握手?
- 目的是建立可靠的双向连接,确保 双方都能发送和接收数据。
- 第一次握手:客户端告诉服务器“我要建立连接”,并发送序列号。
- 第二次握手:服务器确认客户端能接收数据,同时告诉客户端自己也准备好了。
- 第三次握手:客户端确认服务器可接收数据,连接正式建立。
- 总结:三次保证双方的发送/接收能力都确认到位,防止半连接。
第二次握手传回了 ACK,为什么还要传回 SYN?
- 第二次握手是服务器对客户端的 SYN 做 ACK 并且告诉客户端自己也有序列号要发送(SYN)。
- 如果只传 ACK,服务器的序列号还没有告诉客户端,客户端不能确认服务器也能发送数据。
为什么要四次挥手?
- TCP 连接是全双工的,客户端和服务器可以独立关闭各自的发送方向。
- 第一次挥手:客户端说“我发送完了”(FIN)。
- 第二次挥手:服务器确认客户端 FIN(ACK)。
- 第三次挥手:服务器说“我也发送完了”(FIN)。
- 第四次挥手:客户端确认服务器 FIN(ACK)。
- 总结:四次保证双方都能独立关闭发送方向,防止数据丢失。
为什么不能把服务器发送的 ACK 和 FIN 合并成三次挥手?
- 因为服务器可能还有数据未发送,如果直接合并 ACK + FIN,可能导致客户端过早关闭,服务器的数据还没发送完。
- 分开保证 可靠关闭,先 ACK 客户端 FIN,再 FIN 自己的数据。
如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
- 客户端在 TIME_WAIT 状态会等待一段时间,超时会重发 FIN。
- 服务器收到重复 FIN 后,会重新发送 ACK,保证可靠关闭。
- 总结:TCP 保证任何丢失的报文都能被重新确认。
为什么第四次挥手客户端需要等待 2×MSL 才进入 CLOSED 状态?
- MSL(Maximum Segment Lifetime)是报文在网络中的最长寿命。
- 等待 2×MSL 可以保证:
- 网络中残留的报文不会干扰后续新的连接。
- 如果服务器没有收到客户端最后的 ACK,客户端还能重发 ACK,保证服务器可靠关闭。
TCP 如何保证传输的可靠性?(重要)
TCP 如何保证传输的可靠性?
- 序列号:每个字节都有唯一序列号,接收方按序重组数据。
- 确认应答(ACK):接收方确认已收到数据。
- 重传机制:未收到 ACK 的数据会重传,支持快速重传。
- 流量控制 + 拥塞控制:防止接收方处理不过来或网络拥塞导致丢包。
TCP 如何实现流量控制?
- 使用 滑动窗口(Window)机制:
- 接收方通过窗口大小告知发送方自己能接收的数据量。
- 发送方根据窗口大小控制发送速率,防止接收方缓存溢出。
TCP 的拥塞控制怎么实现?

- 动态调整发送速率,防止网络拥塞。
- 核心算法:
- 慢开始(Slow Start):初始窗口指数增长。
- 拥塞避免(Congestion Avoidance):线性增长窗口,平稳发送。
- 快速重传(Fast Retransmit):收到重复 ACK 时立即重传丢失报文。
- 快速恢复(Fast Recovery):丢包后调整窗口继续传输,避免回退到慢开始。
ARQ 协议(Automatic Repeat reQuest)
- 自动重传请求协议,用于保证可靠传输。
- 类型:
- 停止等待 ARQ(Stop-and-Wait ARQ)
- 发送方发送一个数据包后等待确认,再发送下一个。
- 简单,但效率低。
- 连续 ARQ(Sliding Window / Go-Back-N, Selective Repeat)
- 发送方可以连续发送多个数据包,无需等待每个 ACK。
- Go-Back-N:出错包之后的数据全部重传。
- Selective Repeat:只重传出错的包,效率更高。
- 停止等待 ARQ(Stop-and-Wait ARQ)
超时重传如何实现?
- 发送方设置 定时器,若超时未收到 ACK,则重传该数据包。
超时重传时间(RTO, Retransmission Timeout)如何确定?
- 根据 往返时间 RTT(Round Trip Time) 动态计算。
- 自适应调整,保证既不频繁重传,也不等待过久。
IP
IP协议的作用是什么?
IP(Internet Protocol)是 网络层协议,负责将数据包从源主机传输到目标主机,通过 逻辑地址(IP 地址) 定位设备。
什么是IP地址?IP寻址如何工作?
- IP 地址是互联网上设备的唯一标识,用于定位和寻址。
- IP 寻址:发送方将数据封装成 IP 数据包,路由器根据目标 IP 地址转发,直到到达目的主机。
什么是 IP 地址过滤?
IP 地址过滤(IP Filtering)通过允许或拒绝特定 IP 地址访问网络,实现安全控制和防火墙策略。
IPv4 和 IPv6 有什么区别?
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位 | 128 位 |
| 地址格式 | 点分十进制(如 192.168.0.1) | 冒号十六进制(如 2001:0db8::1) |
| 地址空间 | ≈42亿 | ≈3.4×10³⁸,几乎无限 |
| 支持特性 | 不支持内置加密 | 内置 IPsec、简化报文头、自动配置 |
| NAT | 常用 | 不再依赖 NAT,端到端可达 |
如何获取客户端真实 IP?
获取客户端真实 IP 主要有三种方法:
应用层方法
- 通过
X-Forwarded-For请求头获取客户端 IP。传输层方法
- 利用 TCP Options 或 Proxy Protocol 传递客户端真实 IP。
网络层方法
- 通过 隧道 + DSR(Direct Server Return)模式获取真实 IP。
NAT 的作用是什么?
NAT(Network Address Translation,网络地址转换)将 私有 IP 与公网 IP 映射,实现:
- 节省 IPv4 地址
- 内网设备共享公网访问
- 提高网络安全性,隐藏内网结构
ARP
什么是Mac地址
MAC(Media Access Control)地址是 网卡的硬件唯一标识。
长度为 48 位,通常用 十六进制表示(如
00:1A:2B:3C:4D:5E)。用于 局域网内设备间通信,由硬件厂商分配,不随 IP 地址改变。
ARP协议解决了什么问题
网络层使用 逻辑地址(IP) 通信,但数据链路层需要 物理地址(MAC)。
ARP(Address Resolution Protocol) 负责将 IP 地址解析为对应的 MAC 地址,实现 局域网内的数据传输。
ARP协议的工作原理
同一局域网内的 MAC 寻址
- 目的:找到目标 IP 对应的 MAC 地址,实现局域网内直接通信。
- 流程:
- 主机 A 想发送数据到同一局域网内的 IP B,但不知道 MAC。
- A 广播 ARP 请求:谁拥有 IP B,请回复 MAC。
- IP B 的主机收到请求后,发送 ARP 响应(单播给 A)告知自己的 MAC。
- A 缓存 B 的 MAC,后续通信直接使用。
不同局域网内的 MAC 寻址
- 目的:跨网段通信,局域网无法直接找到远端主机 MAC。
- 流程:
- 主机 A 想发送数据到不同网段 IP B。
- A 检查目标 IP,不在同一子网。
- A 将数据发送给 默认网关(路由器)的 MAC)。
- 路由器负责转发到目标网段,再通过目标局域网的 ARP 获取目标主机 MAC。
总结:
- 同一局域网:ARP 广播直接找到目标 MAC。
- 跨局域网:ARP 只找到网关 MAC,由网关负责转发到目标。




