本文参考并整理自 JavaGuide,对计算机网络中常见的面试高频问题进行了内容精简与结构化梳理。在保证核心概念准确性的前提下,尽量压缩表述、突出关键点,并结合个人理解做了适当的记忆扩展,便于快速复习和长期理解。

网络分层模型

OSI 七层模型

物(比特传输)、链(帧编码、差错控制)、网(路由和寻址)、输(进程通信)、会、示(编码、加密)、用

TCP/IP 四层模型

接(链路和物理)、网、输、用(会话、表示、应用)

网络分层的原因

  1. 各层相互独立(无需关注其他层)
  2. 提高灵活性和可替换性(多答特性)
  3. 大问题化小(复杂问题拆解)

协议

常见协议

应用层:HTTP、SMTP(发邮件)、POP3/IMAP(收邮件)、FTP(文件)、Telnet(登录)、SSH、RTP(实时传输,通常UDP)、DNS(域名解析,UDP)

传输层:TCP(面向连接、可靠)、UDP(无连接、最大可能交付)

网络层:IP、ARP(IP转MAC)、ICMP(控制报文)、NAT(网络地址转换)、OSPF(基于链路状态的内部网关协议)、RIP(基于距离向量的内部网关协议)、BGP(边界网关协议)

HTTP

输入URL到页面展示(重点)

  1. 输入指定网页的 URL。
  2. DNS 协议,解析出 IP 地址。
  3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
  4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
  5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
  6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
  7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。

HTTP状态码

常见 HTTP 状态码

常见 HTTP 头字段包括:

  • Host、User-Agent、Accept、Authorization、Cookie

HTTP/1.0 和 HTTP/1.1 有什么区别?

HTTP/1.0 和 HTTP/1.1 对比

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

HTTP/1.1 和 HTTP/2.0 有什么区别?(重点)

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.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-3-implementation

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
存储位置 浏览器(客户端) 服务器
数据存什么 可以直接存用户信息 通常存用户状态数据
安全性 低(可被篡改) 相对高(存在服务器)
大小限制 一般 4KB 左右 理论不限(受服务器内存限制)
是否占服务器资源 不占
依赖关系 可独立存在 依赖 Cookie(通常)

GET 和 POST 的区别(重点)

对比维度 GET POST
语义(核心区别) 获取 / 查询资源 创建 / 修改资源
是否幂等 是(多次执行结果相同) 否(可能产生不同结果)
是否安全(语义层面) 是(不改变资源状态) 否(会改变资源状态)
参数位置 URL 查询字符串(query string) 请求体(body)
参数格式 URL 编码 application/x-www-form-urlencodedmultipart/form-dataapplication/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
2
3
4
5
6
7
8
9
10
11
HTTP 请求

协议升级(101 Switching Protocols)

建立 WebSocket 长连接

双向帧通信

发送关闭帧

关闭 TCP 连接
  • 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) 实现:

  1. 发送 ICMP Echo Request(类型 8)到目标主机。
  2. 目标主机若连通,会返回 ICMP Echo Reply(类型 0)。
  3. 通过计算请求发送到回应接收的时间,得到往返延迟(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 域名系统详解(应用层)
简要流程如下:

  1. 用户发起域名请求 → 浏览器、操作系统、路由器缓存查询。
  2. 缓存未命中 → 本地 DNS 服务器查询。
  3. 本地 DNS 服务器递归查询根 DNS → TLD DNS → 权威 DNS,直到获取域名对应 IP。(或迭代查询)
  4. 返回 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 三次握手和四次挥手(非常重要)

tcp-shakes-hands-three-timestcp-waves-four-times

为什么要三次握手?
  • 目的是建立可靠的双向连接,确保 双方都能发送和接收数据
  • 第一次握手:客户端告诉服务器“我要建立连接”,并发送序列号。
  • 第二次握手:服务器确认客户端能接收数据,同时告诉客户端自己也准备好了。
  • 第三次握手:客户端确认服务器可接收数据,连接正式建立。
  • 总结:三次保证双方的发送/接收能力都确认到位,防止半连接。

第二次握手传回了 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 可以保证:
    1. 网络中残留的报文不会干扰后续新的连接。
    2. 如果服务器没有收到客户端最后的 ACK,客户端还能重发 ACK,保证服务器可靠关闭。

TCP 如何保证传输的可靠性?(重要)

TCP 如何保证传输的可靠性?
  • 序列号:每个字节都有唯一序列号,接收方按序重组数据。
  • 确认应答(ACK):接收方确认已收到数据。
  • 重传机制:未收到 ACK 的数据会重传,支持快速重传。
  • 流量控制 + 拥塞控制:防止接收方处理不过来或网络拥塞导致丢包。

TCP 如何实现流量控制?
  • 使用 滑动窗口(Window)机制
    • 接收方通过窗口大小告知发送方自己能接收的数据量。
    • 发送方根据窗口大小控制发送速率,防止接收方缓存溢出。

TCP 的拥塞控制怎么实现?

tcp-congestion-control

  • 动态调整发送速率,防止网络拥塞。
  • 核心算法:
    1. 慢开始(Slow Start):初始窗口指数增长。
    2. 拥塞避免(Congestion Avoidance):线性增长窗口,平稳发送。
    3. 快速重传(Fast Retransmit):收到重复 ACK 时立即重传丢失报文。
    4. 快速恢复(Fast Recovery):丢包后调整窗口继续传输,避免回退到慢开始。

ARQ 协议(Automatic Repeat reQuest)
  • 自动重传请求协议,用于保证可靠传输。
  • 类型
    1. 停止等待 ARQ(Stop-and-Wait ARQ)
      • 发送方发送一个数据包后等待确认,再发送下一个。
      • 简单,但效率低。
    2. 连续 ARQ(Sliding Window / Go-Back-N, Selective Repeat)
      • 发送方可以连续发送多个数据包,无需等待每个 ACK。
      • Go-Back-N:出错包之后的数据全部重传。
      • Selective Repeat:只重传出错的包,效率更高。

超时重传如何实现?
  • 发送方设置 定时器,若超时未收到 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 OptionsProxy 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 地址,实现局域网内直接通信。
  • 流程
    1. 主机 A 想发送数据到同一局域网内的 IP B,但不知道 MAC。
    2. A 广播 ARP 请求:谁拥有 IP B,请回复 MAC。
    3. IP B 的主机收到请求后,发送 ARP 响应(单播给 A)告知自己的 MAC。
    4. A 缓存 B 的 MAC,后续通信直接使用。
不同局域网内的 MAC 寻址
  • 目的:跨网段通信,局域网无法直接找到远端主机 MAC。
  • 流程
    1. 主机 A 想发送数据到不同网段 IP B。
    2. A 检查目标 IP,不在同一子网。
    3. A 将数据发送给 默认网关(路由器)的 MAC)
    4. 路由器负责转发到目标网段,再通过目标局域网的 ARP 获取目标主机 MAC。

总结

  • 同一局域网:ARP 广播直接找到目标 MAC。
  • 跨局域网:ARP 只找到网关 MAC,由网关负责转发到目标。