大厂计算机网络高频八股文面试题及参考答案
请简述 HTTP 和 HTTPS 的区别?
HTTP 与 HTTPS 的核心差异在于安全性,两者在数据传输方式、加密机制和信任体系上存在显著不同:
- 加密传输:HTTP 以明文形式传输数据,请求和响应内容可被中间人轻易截获和篡改。HTTPS 通过 SSL/TLS 协议对通信内容进行混合加密——先用非对称加密(如RSA)交换密钥,再用对称加密(如AES)加密数据流,确保传输过程不可被窃听。
- 端口与协议:HTTP 默认使用 80 端口,而 HTTPS 使用 443 端口。HTTPS 并非独立协议,而是在 HTTP 下层增加了 TLS/SSL 安全层,形成HTTP over TLS的架构。
- 证书与身份验证:HTTPS 必须部署由 CA(证书颁发机构) 签发的 数字证书,验证服务器身份的真实性。例如,访问银行网站时,浏览器会检查证书中的域名是否匹配,防止钓鱼攻击。
- 性能影响:HTTPS 的加密过程会引入额外计算开销,如 TLS 握手阶段的非对称加密运算。现代优化手段(如 TLS 1.3 的简化握手、会话复用)已显著降低延迟,差距通常在 100ms 以内。
- SEO 与合规性:搜索引擎(如Google)将 HTTPS 作为排名信号,未加密网站的搜索排名可能下降。此外,GDPR 等法规要求敏感数据必须加密传输。
混合加密示例:
- 客户端发起 HTTPS 请求,服务器返回公钥证书。
- 客户端生成随机对称密钥,用服务器公钥加密后发送。
- 双方使用对称密钥加密后续通信内容。
HTTP 协议的工作原理是什么?
HTTP 是基于请求-响应模型的无状态协议,其核心流程可分解为以下步骤:
- 建立 TCP 连接:客户端(如浏览器)通过 TCP 三次握手 与服务器建立连接。HTTP/1.1 默认启用 持久连接(Keep-Alive),允许复用同一连接发送多个请求。
- 发送 HTTP 请求:客户端构造包含 方法(GET、POST)、路径(如/index.html)、头部(User-Agent、Accept)和 可选正文 的请求报文。例如:
- 服务器处理请求:服务器解析请求,定位资源(如静态文件或动态脚本),执行逻辑(如数据库查询),并生成响应数据。
- 返回 HTTP 响应:服务器发送状态码(如200 OK)、响应头(Content-Type、Cache-Control)和正文(HTML、JSON)。例如:
- 关闭连接或复用:非持久连接下,服务器主动关闭 TCP 连接;持久连接则等待后续请求。
关键特性:
- 无状态性:每个请求独立处理,需借助 Cookie 或 Token 维持会话状态。
- 缓存机制:通过
Cache-Control
头部定义资源缓存策略(如max-age=3600
)。 - 内容协商:客户端通过
Accept
头部声明支持的格式(如Accept: text/html
),服务器返回适配内容。
HTTP 状态码有哪些常见的类型及其含义?
HTTP 状态码按首位数字分为五类,用于快速标识请求处理结果:
1xx | 信息响应 | 100(继续)、101(切换协议) |
2xx | 成功响应 | 200(OK)、201(已创建) |
3xx | 重定向 | 301(永久移动)、302(临时重定向) |
4xx | 客户端错误 | 400(错误请求)、404(未找到) |
5xx | 服务器错误 | 500(内部错误)、503(服务不可用) |
详细说明:
- 100 Continue:客户端应继续发送请求正文,常见于大文件上传前的确认。
- 200 OK:标准成功响应,正文包含请求的资源。
- 301 Moved Permanently:资源永久迁移至新 URL,浏览器自动更新书签。
- 404 Not Found:服务器无法找到请求的资源,可能因 URL 拼写错误或资源删除。
- 503 Service Unavailable:服务器过载或维护,通常伴随
Retry-After
头部提示重试时间。
HTTP 状态码 301 和 302 的区别,都有哪些用途?
301 与 302 均用于重定向,但语义和后续行为存在关键差异:
SEO 影响 | 搜索引擎将权重转移到新 URL | 保留原 URL 权重,不传递到新地址 |
缓存行为 | 浏览器长期缓存重定向结果 | 临时缓存,可能频繁向服务器验证 |
客户端处理 | 自动更新书签指向新 URL | 书签保留原 URL,每次访问时执行重定向 |
典型场景:
- 301:网站域名更换(如 http:// 升级到 https://)。页面永久迁移(如产品详情页路径重构)。
- 302:临时维护页面跳转(如活动页暂时下线时指向公告页)。A/B 测试中随机分配用户到不同版本页面。
技术实现:
HTTP/1.1 301 Moved Permanently Location: https://new-domain.com/path
客户端收到响应后,后续请求直接访问新 URL,减少中间跳转开销。
解释 HTTP 的缓存机制?
HTTP 缓存机制是提升性能的核心手段,通过存储资源副本减少重复请求,显著降低带宽消耗和延迟。其核心逻辑分为强缓存与协商缓存两阶段:
1. 强缓存(本地缓存)
- 触发条件:浏览器直接使用本地副本,不发送请求到服务器。
- 控制字段: Cache-Control: max-age=3600:资源有效期(秒)。no-cache:强制跳过强缓存,直接进入协商缓存。no-store:禁止任何缓存(如敏感数据)。Expires:绝对过期时间(HTTP/1.0 遗留,可能因时区误差失效)。
2. 协商缓存(条件请求)
- 触发条件:强缓存过期后,浏览器携带验证信息询问服务器资源是否变更。
- 关键头字段: Last-Modified / If-Modified-Since: 基于文件修改时间戳验证,精度为秒级。ETag / If-None-Match: 基于内容哈希值(如"5d8c72a4e"),解决时间戳精度不足问题(如文件内容未变但修改时间更新)。
缓存决策流程:
- 检查
Cache-Control
或Expires
,判断是否命中强缓存。 - 若未命中,发送请求并附加
If-Modified-Since
或If-None-Match
。 - 服务器返回 304 Not Modified 或 200 OK + 新内容。
实战优化策略:
- 静态资源:设置长
max-age
(如一年),通过文件名哈希(app.a1b2c3.js
)实现内容更新后 URL 变更。 - 动态接口:使用
no-cache
配合ETag
,确保数据实时性。 - Vary 头:指定缓存键(如
Vary: User-Agent
),区分不同设备版本的响应。
什么是 HTTP 协议的长连接和短连接?
HTTP 连接的复用策略直接影响网络效率,主要分为两种模式:
短连接 | 每个请求后关闭 TCP 连接 | 默认于 HTTP/1.0 |
长连接 | 复用同一连接处理多个请求 | 默认于 HTTP/1.1 及以上 |
短连接工作流程:
- 客户端发起请求 → 服务器响应 → 关闭连接。
- 下次请求需重新建立 TCP 连接(三次握手)。
长连接工作流程:
- 客户端发送请求 → 服务器响应 → 保持连接空闲。
- 后续请求复用现有连接,减少握手开销。
- 超时或主动关闭后终止连接(通过
Connection: close
)。
性能对比:
- 延迟:长连接减少握手次数,尤其利于小文件频繁请求场景。
- 服务器负载:长连接需更多内存维持空闲连接,可能引发资源耗尽。
什么是 HTTP 长连接?
HTTP 长连接(Persistent Connection) 是复用 TCP 连接处理多个请求的机制,通过以下方式实现:
协议支持:
- HTTP/1.1:默认启用长连接(除非显式设置
Connection: close
)。 - HTTP/2:引入多路复用(Multiplexing),单连接并行处理多个请求,彻底解决队头阻塞。
控制参数:
- Keep-Alive 头(HTTP/1.0 扩展):timeout:空闲连接保持时间(秒)。max:最大请求数限制。
管理挑战:
- 僵尸连接:客户端异常退出导致连接未正常关闭,需服务器设置超时回收。
- 负载均衡:长连接可能导致请求集中到同一后端服务器,需策略优化。
HTTP 长连接短连接使用场景是什么?
连接策略需根据业务特征选择,平衡性能与资源消耗:
长连接适用场景:
- 高频请求:如实时聊天应用(WebSocket 基于 HTTP 升级)。
- 延迟敏感:移动端 API 调用,减少握手带来的额外延迟。
- 资源加载:网页加载时并行获取 CSS、JS、图片等静态资源。
短连接适用场景:
- 低频访问:如每日一次的报表生成请求。
- 无状态服务:服务器需快速释放资源应对突发流量。
- 兼容旧系统:对接仅支持 HTTP/1.0 的遗留系统。
混合策略示例:
- Nginx 配置:
HTTP 常见方法有哪些?
HTTP 方法定义了对资源的操作类型,RESTful API 设计中的核心方法包括:
GET | 是 | 是 | 获取资源(如查询用户信息) |
POST | 否 | 否 | 创建资源(如提交订单) |
PUT | 是 | 否 | 替换整个资源(如更新用户所有字段) |
DELETE | 是 | 否 | 删除资源(如移除商品) |
PATCH | 否 | 否 | 部分更新资源(如修改用户邮箱) |
HEAD | 是 | 是 | 获取响应头(如检查文件是否存在) |
OPTIONS | 是 | 是 | 查询服务器支持的通信选项 |
方法详解:
- GET 与 POST:GET 参数通过 URL 传递(有长度限制),POST 通过请求体传输(适合敏感数据)。
- PUT 与 PATCH:PUT 要求客户端提供完整资源,缺失字段会被置为默认值;PATCH 仅传递需修改的字段。
安全性与幂等性:
- 安全性:不修改资源的操作(GET、HEAD、OPTIONS)。
- 幂等性:多次调用效果相同(如 DELETE 同一资源仅首次生效)。
扩展方法:
- CONNECT:建立隧道(用于 HTTPS 代理)。
- TRACE:回显请求(用于诊断,存在安全风险,通常禁用)。
请简述 TCP 和 UDP 的区别?
TCP(传输控制协议)和 UDP(用户数据报协议)是传输层的两大核心协议,它们在数据传输方式、可靠性及适用场景上存在本质差异:
核心差异对比
- 连接性:TCP 是面向连接的协议,通信前需通过三次握手建立可靠连接,确保双方准备好数据传输。UDP 无连接,直接发送数据包,无需预先协商,适合快速传输场景。
- 可靠性:TCP 提供全可靠性保障,包含以下机制:数据包排序:通过序列号重组乱序到达的报文。确认重传:接收方返回 ACK 确认,超时未确认则重发。拥塞控制:动态调整发送速率(如慢启动、拥塞避免算法)。UDP 不保证可靠性,数据可能丢失、重复或乱序,需应用层自行处理。
- 传输模式:TCP 是字节流传输,数据被视为连续流,无明确边界。UDP 基于数据报,每个报文独立处理,保留发送时的边界。
- 头部开销:TCP 头部较大(通常 20 字节),包含控制字段(如窗口大小、校验和)。UDP 头部仅 8 字节(源端口、目标端口、长度、校验和)。
- 适用场景:TCP:要求高可靠性的场景(网页浏览、文件传输、电子邮件)。UDP:容忍部分数据丢失但追求低延迟的场景(视频流、在线游戏、DNS 查询)。
性能权衡
- 延迟敏感型应用:UDP 因无连接建立和重传机制,通常延迟更低。
- 资源消耗:TCP 的复杂控制机制占用更多 CPU 和内存资源。
TCP 和 UDP 分别对应的常见应用层协议有哪些?
不同传输层协议承载的应用层服务差异显著,以下是典型协议映射:
TCP | HTTP/HTTPS(80/443) | 网页内容传输 |
FTP(20/21) | 文件上传下载 | |
SMTP(25) | 电子邮件发送 | |
SSH(22) | 安全远程登录 | |
UDP | DNS(53) | 域名解析(多数查询使用 UDP) |
DHCP(67/68) | 动态 IP 地址分配 | |
SNMP(161/162) | 网络设备监控 | |
TFTP(69) | 简单文件传输 |
混合使用案例
- QUIC 协议:基于 UDP 实现类似 TCP 的可靠性,用于 HTTP/3 提升性能。
- 实时通信:VoIP(如 SIP)和视频会议(如 WebRTC)常结合 UDP 与自定义纠错机制。
UDP 的优缺点是什么?它适用于哪些场景?
UDP 以简洁高效的设计满足特定需求,其特性决定了独特的应用场景:
优势分析
- 低延迟:省去连接建立和确认过程,数据传输更迅速。
- 开销小:精简的头部结构减少网络带宽占用。
- 无状态性:服务端无需维护连接状态,适合大规模并发场景。
局限性
- 不可靠传输:不保证数据完整到达,可能丢失或乱序。
- 无拥塞控制:网络拥堵时持续发送数据,可能加剧问题。
- 易受攻击:缺乏握手过程,易受 DDoS 攻击(如 UDP 洪水攻击)。
典型应用场景
- 实时音视频传输:如直播推流(RTMP)、视频会议(Zoom),可容忍偶发包丢失。
- 高频状态更新:在线游戏中的玩家位置同步(每秒数十次更新)。
- 广播/组播通信:IPTV 多播、网络时间协议(NTP)。
风险规避策略
- 应用层补丁:在 UDP 上层实现重传逻辑(如 DTN 协议中的延迟容忍)。
- 流量整形:限制 UDP 数据发送速率,避免网络过载。
UDP 如何实现可靠传输?
在 UDP 基础上实现可靠性需在应用层引入额外机制,常见方案包括:
关键技术点
- 序列号与确认机制:为每个数据包添加唯一序列号,接收方返回 ACK 确认。若超时未收到 ACK,触发重传。
- 数据包重组:接收端缓存乱序到达的包,按序列号排序后提交给应用层。
- 流量控制:通过滑动窗口限制发送速率,匹配接收方处理能力。
现有实现案例
- QUIC 协议:由 Google 提出,整合 TLS 加密与多路复用,用于 HTTP/3。
- RUDP(可靠 UDP):自定义协议,常用于金融交易系统。
挑战与妥协
- 复杂度提升:自行实现可靠性可能引入与 TCP 相似的开销,失去 UDP 的轻量优势。
- 场景适配:需根据业务特点选择重传策略(如严格有序或部分容忍乱序)。
请简述 OSI 参考模型有几层?
OSI(开放系统互连)七层模型是网络通信的理论框架,各层分工明确:
物理层 | 传输原始比特流(电压、光信号) | 网线、光纤、中继器 |
数据链路层 | 帧传输、MAC 地址寻址、差错检测 | 交换机、MAC 协议、PPP |
网络层 | 路由选择、IP 地址管理 | 路由器、IP 协议、ICMP |
传输层 | 端到端连接管理(TCP/UDP) | TCP、UDP、端口号 |
会话层 | 建立/维护/终止会话 | NetBIOS、RPC |
表示层 | 数据格式转换、加密/解密 | SSL/TLS、JPEG 编码 |
应用层 | 用户接口、网络服务访问 | HTTP、FTP、SMTP |
与 TCP/IP 模型对比
- TCP/IP 四层模型: 网络接口层(对应 OSI 物理层 + 数据链路层)网络层传输层应用层(融合 OSI 会话层、表示层、应用层)
实际应用意义
- 故障排查:分层定位问题(如网络层检查 IP 配置,传输层分析端口状态)。
- 协议设计:明确各层职责(如 HTTP 协议无需关心底层路由细节)。
历史局限性
- 会话层与表示层:现代协议通常将这两层功能合并到应用层实现。
- 严格分层:实际协议栈(如 TCP/IP)常跨层优化性能。
三次握手过程中可以携带数据吗?
TCP 三次握手的核心目标是建立可靠连接,其数据携带能力在不同阶段存在差异:
- 第一次握手(SYN):客户端发送 SYN 报文(同步标志位为1),不允许携带应用层数据。此时连接尚未建立,服务器若收到数据也无法正确处理。
- 第二次握手(SYN-ACK):服务器回复 SYN-ACK 报文(SYN 和 ACK 标志位均为1),同样禁止携带数据。此阶段双方仅协商初始序列号和窗口大小。
- 第三次握手(ACK):客户端发送确认报文(ACK=1),允许携带应用层数据。此时连接已建立,数据可立即传输。
技术细节:
- 快速传输优化:通过第三次握手捎带数据,减少一次往返延迟(RTT),提升如 HTTP 请求的响应速度。
- 协议规范:RFC 793 明确允许第三次握手携带数据,但实际实现中部分操作系统可能因安全策略限制此行为。
风险考量:
- 资源预分配:服务器在未完成握手时需预留缓冲区,可能成为 DDoS 攻击的载体(如 SYN 洪水攻击)。
TCP 的四次挥手过程是什么?
TCP 使用四次挥手(Four-Way Handshake)安全终止连接,确保双方数据完整传输:
流程分解:
- 主动关闭方发送 FIN:客户端(假设为主动关闭方)发送 FIN 报文(FIN=1),进入 FIN_WAIT_1 状态。
- 被动关闭方回复 ACK:服务器收到 FIN 后返回 ACK 报文(ACK=1),进入 CLOSE_WAIT 状态。客户端收到后切换至 FIN_WAIT_2 状态。
- 被动关闭方发送 FIN:服务器完成数据发送后,发送自己的 FIN 报文(FIN=1),进入 LAST_ACK 状态。
- 主动关闭方回复 ACK:客户端回复 ACK 报文(ACK=1),进入 TIME_WAIT 状态。服务器收到后彻底关闭连接,客户端等待 2MSL 后关闭。
关键状态解析:
- CLOSE_WAIT:被动关闭方等待应用程序调用
close()
发送 FIN。 - TIME_WAIT:主动关闭方确保最后一个 ACK 到达,防止旧连接数据干扰新连接。
为何需要四次挥手?
TCP 连接是全双工的,每个方向需独立关闭。被动关闭方可能在 ACK 后仍有数据待发送,因此 FIN 的发送需延迟至数据处理完毕。
为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
TIME-WAIT 状态是 TCP 可靠性的最后一道防线,等待 2 倍 MSL(Maximum Segment Lifetime) 的时长设计基于以下考量:
MSL 的定义:
MSL 是报文段在网络中的最大生存时间(通常 30 秒到 2 分钟),超过该时间的报文将被丢弃。
等待 2MSL 的核心原因:
- 确保 ACK 到达对端:若主动关闭方的最终 ACK 丢失,被动关闭方会重传 FIN。2MSL 时间窗口允许客户端处理重传的 FIN 并重新发送 ACK。
- 消除旧连接报文干扰:等待 2MSL 确保网络中所有属于该连接的报文失效,避免相同四元组(源 IP、源端口、目标 IP、目标端口)的新连接收到旧数据。
影响与优化:
- 服务器端口耗尽:高并发场景下,大量连接处于 TIME-WAIT 状态可能导致端口资源不足。解决方案: 开启 SO_REUSEADDR 选项,允许重用 TIME-WAIT 状态的端口。调整内核参数减少 MSL 时间(需权衡网络可靠性)。
协议设计权衡:
- 主动关闭方的代价:TIME-WAIT 状态由主动关闭方承担,服务器若频繁主动关闭连接(如爬虫服务器)可能成为性能瓶颈。
说一下 DNS 的解析过程?
DNS 解析是将域名转换为 IP 地址的核心过程,涉及多级查询与缓存机制:
递归查询与迭代查询:
- 递归查询:客户端要求 DNS 服务器必须返回最终结果(常见于本地 DNS 查询)。
- 迭代查询:上级 DNS 服务器返回下一级服务器的地址,由客户端继续查询(根域名服务器通常使用此模式)。
解析步骤详解:
- 浏览器缓存检查:浏览器首先检查自身缓存(如 chrome://net-internals/#dns)。
- 系统缓存查询:查询操作系统 Hosts 文件及本地 DNS 缓存(如 Windows 的 ipconfig /displaydns)。
- 本地 DNS 服务器查询:向配置的本地 DNS 服务器(如 ISP 提供的 8.8.8.8)发起请求。若缓存命中则直接返回。
- 根域名服务器查询:本地 DNS 服务器向根域名服务器(全球 13 组)查询顶级域(如 .com)的 NS 记录。
- 顶级域服务器查询:根服务器返回 .com 域的权威服务器地址,本地 DNS 继续向该服务器查询二级域(如 example.com)。
- 权威域名服务器查询:顶级域服务器返回 example.com 的权威 DNS 地址,本地 DNS 向该服务器请求主机记录(如 www)。
- 结果返回与缓存:权威服务器返回 www.example.com 的 A 记录(IPv4)或 AAAA 记录(IPv6),本地 DNS 缓存结果并返回客户端。
示例解析流程:
用户输入 www.example.com -> 浏览器缓存未命中 -> 系统 Hosts 未命中 -> 本地 DNS 未命中 -> 查询根服务器获得 .com 的 NS -> 查询 .com 服务器获得 example.com 的 NS -> 查询 example.com 的权威服务器获得 93.184.216.34 -> 本地 DNS 缓存结果并返回
特殊记录类型:
- CNAME:别名记录(如将 www 指向 lb.example.com)。
- MX:邮件服务器记录。
- TXT:文本验证记录(如 SPF 反垃圾邮件配置)。
为了 DNS 解析更多,你觉得可以用到哪些优化手段?
DNS 性能优化是提升网络体验的关键环节,常见策略包括:
缓存机制 | 浏览器/操作系统设置更长 TTL | 减少重复查询次数 |
负载均衡 | DNS 轮询或基于地理位置的智能解析 | 分流请求至最近服务器 |
协议升级 | 使用 DNS-over-HTTPS (DoH) 或 DNS-over-TLS (DoT) | 加密查询防劫持,提升安全性 |
预取策略 | 页面加载时异步解析页面中的域名链接 | 提前获取资源域名 IP |
CDN 整合 | 结合 CDN 的边缘节点 DNS 解析 | 加速静态资源分发 |
高级技术方案:
- Anycast DNS:同一 IP 地址部署多个 DNS 服务器,路由器根据 BGP 路由选择最近节点,降低延迟。
- DNS 分片:将大量域名分散到多个子域名服务器,避免单一服务器过载。
客户端优化示例:
<!-- DNS 预取标签 --> <link rel="dns-prefetch" href="//cdn.example.com">
风险控制:
- TTL 设置权衡:过长的 TTL 可能导致故障时切换延迟(如服务器宕机需等待缓存过期)。
- 安全防护:部署 DNSSEC 防止 DNS 欺骗攻击,确保解析结果真实性。
DNS 负载均衡是如何实现的?
DNS 负载均衡是通过域名解析分散请求到不同服务器的技术,核心原理是为同一域名配置多个 IP 地址,根据策略返回不同的解析结果。其实现方式可分为基础策略与智能策略两类:
基础负载均衡策略
轮询(Round Robin) | 按顺序返回预配置的 IP 地址列表 | 简单易实现,但无法感知服务器实际负载 |
随机分配 | 随机选择 IP 地址返回 | 避免轮询的顺序性,均衡性依赖随机算法 |
权重分配 | 为不同 IP 设置响应比例(如性能强的服务器权重更高) | 结合服务器硬件差异实现资源合理分配 |
智能负载均衡策略
- 地理定位解析(GeoDNS):根据用户 IP 的地理位置返回最近的服务器 IP。例如,美国用户访问 example.com 解析到美西机房,亚洲用户解析到新加坡节点。
- 延迟探测:DNS 服务器主动测量到各后端服务器的网络延迟,选择延迟最低的 IP 返回。
- 健康检查联动:结合监控系统剔除故障节点。当检测到某服务器宕机时,DNS 服务器停止返回其 IP,确保用户请求仅到达健康节点。
技术实现示例
; BIND 配置示例 webcluster IN A 192.168.1.10 webcluster IN A 192.168.1.11 webcluster IN A 192.168.1.12
客户端查询 webcluster.example.com
时,DNS 服务器按策略返回其中一个 IP。
局限性
- 缓存影响:客户端或本地 DNS 缓存可能导致流量无法实时切换。
- 会话保持缺失:同一用户多次请求可能被分配到不同服务器,不适合需要状态保持的应用(可通过全局负载均衡器解决)。
请简述 IP 地址和 Mac 地址有啥区别?
IP 地址与 MAC 地址是网络通信中不同层级的寻址标识,其差异体现在五个关键维度:
层级归属 | 网络层(OSI 第三层) | 数据链路层(OSI 第二层) |
地址结构 | 32位(IPv4)或 128位(IPv6) | 48位(如 00:1A:2B:3C:4D:5E) |
分配方式 | 动态分配(DHCP)或手动配置 | 出厂时固化在网卡 ROM 中 |
可变更性 | 随网络环境变化(如切换 Wi-Fi) | 物理设备唯一标识,通常不可修改 |
作用范围 | 全局路由(跨网络通信) | 局域网内设备识别(同一广播域) |
功能协同案例:
当设备 A(IP: 192.168.1.2, MAC: AA:BB:CC:DD:EE:FF)访问互联网时:
- 检查目标 IP 是否在同一子网。若不在,数据包发送至默认网关(路由器 MAC)。
- 通过 ARP 协议获取网关 MAC 地址,封装帧头后传输。
- 路由器剥离 MAC 头,根据 IP 地址进行路由决策,重新封装下一跳 MAC 地址。
特殊场景:
- NAT 转换:IP 地址在公网与私网间映射,MAC 地址仅在局域网有效。
- VPN 隧道:原始 MAC 地址被隧道协议封装,外层 IP 地址用于穿越公共网络。
ARP 协议的工作原理?
ARP(地址解析协议)解决 IP 地址到 MAC 地址的映射问题,其工作流程分为请求-响应两个阶段:
核心流程
- ARP 请求广播:当主机 A 需要与 IP 为 192.168.1.3 的主机 B 通信时:检查本地 ARP 缓存表是否存在对应条目。若不存在,构造 ARP 请求帧(目标 MAC 为 FF:FF:FF:FF:FF:FF),包含:交换机泛洪该帧至局域网所有设备。
- ARP 响应单播:主机 B 识别自身 IP,回复 ARP 响应帧(单播):主机 A 接收响应后更新 ARP 缓存,有效期通常为 2-20 分钟。
协议特性
- 局域网依赖:ARP 仅在本地网络生效,跨网段通信需通过路由器 MAC。
- 无认证机制:易受 ARP 欺骗攻击(解决方案:静态 ARP 绑定或 802.1X 认证)。
缓存管理命令
arp -a # 查看 ARP 缓存表 arp -d 192.168.1.3 # 删除特定条目
什么是 ICMP 协议?
ICMP(互联网控制报文协议)是网络层的诊断与错误报告协议,主要功能包括:
核心功能分类
- 错误报告:当数据包无法到达目标时,向源端发送错误消息。例如:目标不可达(Type 3):路由失败或端口未监听。超时(Type 11):TTL 值归零(Traceroute 原理)。
- 查询与诊断:主动发起探测以检测网络状态:回显请求/应答(Type 0/8):即 ping 命令的基础。路由器通告(Type 9):帮助主机发现本地路由器。
协议特点
- IP 层附属协议:ICMP 报文封装在 IP 数据包内(协议号 1)。
- 无连接性:无需预先建立连接,直接发送报文。
- 不携带应用数据:仅传递控制信息,不影响上层应用通信。
ICMP 有哪些实际应用,举几个例子?
ICMP 协议的网络诊断能力使其成为运维核心工具,典型应用场景包括:
基础网络测试
- 连通性测试(Ping):发送 ICMP Echo Request 并等待 Reply,计算往返时间(RTT)。
- 路径追踪(Traceroute):利用 TTL 递增触发中间路由器的 ICMP Time Exceeded 消息,逐步构建路径拓扑。
网络优化与维护
- PMTU 发现(Path MTU Discovery):通过接收 ICMP Fragmentation Needed 消息动态调整数据包大小,避免分片。
- DDoS 攻击检测:监控异常 ICMP 流量(如 Smurf 攻击利用 ICMP 回放放大流量)。
故障排查案例
- 目标不可达分析:若收到 Type 3 Code 3 消息,表示目标端口无服务,提示检查防火墙或应用状态。
- 路由环路检测:连续收到多个 TTL 超时消息且 IP 地址重复,表明存在路由配置错误。
安全注意事项
- ICMP 过滤:企业防火墙常禁止外部 Ping 探测以降低攻击面。
- 隐蔽信道风险:恶意软件可能利用 ICMP 数据字段进行数据传输(如 ICMP 隧道)。
IPV4 地址不够如何解决?
IPv4 地址枯竭问题通过多种技术协同解决,核心方案围绕地址复用与协议升级展开:
核心解决方案分类
- 网络地址转换(NAT):允许多个设备共享单一公网 IP,通过端口映射区分内部设备。家用路由器典型场景: 局域网设备使用私有地址(如 192.168.1.0/24),路由器维护 NAT 表项:局限性: 破坏端到端连接性,影响 P2P 应用(如视频会议需 STUN 穿透)。
- IPv6 普及:128 位地址空间提供 3.4×10³⁸ 个地址,彻底解决数量问题。过渡阶段采用双栈技术(同时支持 IPv4/IPv6)。
- 无类别域间路由(CIDR):消除传统 A/B/C 类地址划分,允许灵活分配(如分配 203.0.113.0/23 而非固定 /24)。
- 动态地址分配(DHCP):按需分配 IP 地址,空闲地址可回收重用,提升地址池利用率。
辅助优化手段
- 私有地址空间扩展:除经典 10.0.0.0/8 外,利用 172.16.0.0/12 和 192.168.0.0/16 满足大型内网需求。
- 严格路由聚合:减少全球路由表条目(从 90 万条优化至 80 万条),缓解路由器内存压力。
行业实践案例
- 运营商级 NAT(CGNAT):ISP 对用户二次 NAT,单个公网 IP 服务数千用户,但加剧应用层协议兼容性问题。
- 地址交易市场:未使用的 IPv4 地址段通过拍卖流转(如微软 2020 年以 700 万美元购买 666,624 个地址)。
保活计时器的作用?
TCP 保活计时器(Keepalive Timer)用于检测连接有效性,主要应对以下场景:
核心功能解析
- 检测半开连接:当一方异常断开(如断电)而未发送 FIN 时,另一方持续占用资源。保活探测包可识别此类“僵尸连接”。
- 维持长连接活性:在 HTTP 长连接或数据库连接池中,定期发送保活包防止中间设备(如防火墙)因超时断开连接。
工作机制细节
- 参数配置:tcp_keepalive_time(默认 7200 秒):空闲多久后发送探测包。tcp_keepalive_intvl(默认 75 秒):探测包重试间隔。tcp_keepalive_probes(默认 9 次):最大探测次数。
- 探测过程:连接空闲超时后,发送 ACK 包(序列号为当前接收序列减 1)。若收到 RST 响应,确认对端崩溃,关闭连接。若连续探测无响应,判定连接失效并释放资源。
应用场景与争议
- 适用场景: 银行交易系统确保会话实时性。移动网络应对 NAT 超时(通常 5-30 分钟)。
- 争议点: 部分应用(如 HTTP/2)依赖业务层心跳包,避免 TCP 保活干扰应用逻辑。
什么是滑动窗口协议?它在 TCP 中如何工作?
滑动窗口协议是流量控制与高效传输的核心机制,通过动态窗口调整平衡发送速率与接收能力:
协议核心原理
- 窗口定义:发送窗口:允许连续发送的数据范围,无需等待确认。接收窗口:接收方缓冲区剩余空间,通过 ACK 包告知发送方。
- 滑动机制:随着数据确认,窗口向前“滑动”,允许发送新数据。例如:
TCP 中的实现细节
- 窗口大小协商:建立连接时通过 Window Scale 选项(RFC 1323)扩展 16 位窗口至 30 位,支持高速网络。
- 零窗口处理:当接收方窗口为 0 时,发送方启动 持续计时器,定期探测窗口恢复情况。
- 流量控制联动:接收方通过 ACK 包中的 Window 字段动态调整发送方窗口,防止缓冲区溢出。
性能优化特性
- 累积确认: ACK 号为连续接收的最大字节序,允许中间数据丢失时触发快速重传。
- 窗口合并: 多个小数据段可一次性确认,减少协议开销。
什么是拥塞控制?TCP 如何实现拥塞控制?
拥塞控制是防止网络过载的关键机制,通过动态调整发送速率匹配路径容量:
核心算法四阶段
- 慢启动(Slow Start):初始拥塞窗口(cwnd)为 1 MSS,每 RTT 翻倍(指数增长)。达到慢启动阈值(ssthresh)后进入拥塞避免阶段。
- 拥塞避免(Congestion Avoidance):cwnd 每 RTT 增加 1 MSS(线性增长)。发生超时重传时,ssthresh 设为当前 cwnd/2,重置 cwnd 为 1。
- 快速重传(Fast Retransmit):收到 3 个重复 ACK 时立即重传丢失包,无需等待超时。
- 快速恢复(Fast Recovery):cwnd 减半并线性增长,避免回到慢启动。
现代改进算法
- TCP CUBIC: 使用三次函数调整 cwnd,更适合高带宽延迟积(BDP)网络(Linux 默认)。
- BBR(Bottleneck Bandwidth and RTT): 基于带宽和 RTT 测量动态建模,避免传统基于丢包的缺陷(Google 提出)。
拥塞信号识别
- 显式拥塞通知(ECN): 路由器标记 IP 头中的 ECN 位,接收方通过 ACK 反馈,提前降速避免丢包。
谈谈你对 ARQ 协议的理解?
ARQ(自动重传请求)是保障数据可靠传输的核心机制,通过确认与重传机制解决数据传输中的丢包、乱序和错误问题。其核心思想可以概括为:发送方发送数据后等待确认,若超时未收到确认则触发重传。
ARQ 的三大核心类型
停止等待 ARQ | 每发送一个数据包就停止并等待 ACK | 实现简单 | 信道利用率极低 |
回退 N 帧 ARQ | 允许连续发送多个包,出错时回退重传后续所有包 | 提升吞吐量 | 错误累积导致大量重传 |
选择性重传 ARQ | 仅重传特定丢失或损坏的数据包 | 重传效率最高 | 接收端缓存管理复杂 |
关键技术细节
- 确认机制:肯定确认(ACK) 用于通知成功接收,否定确认(NAK) 用于请求重传(部分协议使用冗余 ACK 替代 NAK)。
- 超时计时器: 动态计算 RTT(往返时间)以设定合理超时阈值,避免过早或过晚触发重传。
- 窗口滑动: 在连续 ARQ 中通过滑动窗口控制未确认包的数量,平衡传输效率与资源占用。
实际应用场景
- TCP 协议: 采用累积确认与快速重传结合的方式,例如当收到三个重复 ACK 时立即重传而不等待超时。
- 卫星通信: 长延迟环境下使用选择性重传 ARQ 减少无效重传。
性能优化挑战
- 信道利用率与延迟的权衡: 窗口大小设置需匹配网络带宽延迟积(BDP),过大导致拥塞,过小限制吞吐量。
- 错误检测能力: 依赖校验和或 CRC 检测错误,无法纠正错误数据(需前向纠错技术补充)。
什么是流量控制?
流量控制是协调发送方与接收方速率匹配的机制,核心目标是防止发送方数据发送过快导致接收方缓冲区溢出。其本质是基于接收方处理能力的动态速率调节。
关键实现要素
- 接收窗口(RWND): 接收方通过 TCP 报文头中的窗口字段通告剩余缓冲区空间,单位是字节。
- 动态调整: 窗口值随数据处理实时变化,例如应用程序读取数据后窗口增大。
- 零窗口处理: 当接收方窗口为 0 时,发送方启动持续计时器定期发送探测报文,避免死锁。
与拥塞控制的区别
关注点 | 接收方处理能力 | 网络链路承载能力 |
信号来源 | 接收方窗口通告 | 丢包、延迟测量 |
调整依据 | 缓冲区剩余空间 | 网络拥塞程度评估 |
典型问题场景
- 糊涂窗口综合征(SWS): 当接收方频繁通告小窗口,导致发送方传输大量小数据段,降低效率。解决方案: 接收方等待缓冲区半满后再通告窗口更新。发送方积累足够数据再发送。
TCP 是如何实现流量控制的?
TCP 通过滑动窗口协议实现动态流量控制,其核心是接收方主导的窗口通告机制。具体实现可分为四个关键环节:
1. 窗口通告机制
- 接收方计算: 窗口大小 = 接收缓冲区大小 - 已占用空间
- 报文携带: 通过 TCP 头部的 Window Size 字段告知发送方(16 位,经 Window Scaling 扩展后可达 1GB)。
2. 发送方窗口限制
发送窗口 = min(接收方通告窗口, 拥塞窗口)
发送方仅允许发送窗口内的数据,超出部分需等待窗口滑动。
3. 零窗口探测
当接收方窗口为 0 时:
- 发送方暂停发送并启动持续计时器(默认 5 秒)。
- 定时发送 ZWP(零窗口探测包) 包含 1 字节数据,触发接收方更新窗口通告。
4. 窗口更新策略
- 延迟确认: 接收方延迟发送 ACK(通常 200ms),合并窗口更新与数据确认,减少报文数量。
- 窗口缩放选项: 在三次握手阶段协商 Window Scale Factor,支持窗口值左移 0-14 位,突破 65KB 限制。
性能优化案例
- 大容量文件传输: 接收方逐步扩大窗口,发送方根据带宽延迟积(BDP)调整发送节奏。
- 实时视频流: 结合应用层速率控制与 TCP 窗口管理,避免缓冲区膨胀。
什么是 TCP 粘包和拆包?
粘包与拆包是应用层数据边界处理不当引发的现象,本质源于 TCP 面向字节流的特性:
- 粘包:发送方多次写入的数据被接收方一次性读取,多个应用层报文粘连。
- 拆包:单个应用层报文被拆分成多个 TCP 段接收,需重组才能解析。
根本原因分析
- 协议无边界:TCP 不保留写入操作的边界信息,连续发送的数据在接收缓冲区合并。
- 缓冲区动态调整:网络 MTU 分片、Nagle 算法延迟发送等机制加剧数据重组复杂度。
关键影响因素
发送方缓冲区堆积 | 高 | 中 |
Nagle 算法启用 | 高 | 低 |
接收方读取延迟 | 高 | 低 |
TCP 粘包是怎么产生的?
TCP 粘包的根源在于字节流无消息边界,具体产生条件包括:
发送端因素
- Nagle 算法优化: 合并小数据包(如 1 字节数据等待 40ms 组合发送),减少网络报文数量。
- 缓冲区批量写入:
应用层连续调用
send()
写入多个包,内核缓冲区合并后一次性发送。
接收端因素
- 缓冲区读取不及时: 应用层未及时读取数据,导致多个报文在接收缓冲区累积。
- MTU 分片重组: 超过 MTU 的数据包被分片传输,接收端重组后表现为单个数据块。
协议设计缺陷案例
- HTTP/1.1 的 Keep-Alive:
多个请求复用同一 TCP 连接时,若未使用
Content-Length
或分块编码,可能引发粘包。
解决方案对比
固定长度协议 | 每个报文填充至固定长度 | 实时音视频流 |
分隔符协议 | 使用特殊字符(如
)标记报文结束 | 文本协议(如 Redis) |
长度字段协议 | 报文头部包含长度字段 | 二进制协议(如 Protobuf) |
代码示例:长度字段解码器
// Netty 的 LengthFieldBasedFrameDecoder 实现 public class MyDecoder extends LengthFieldBasedFrameDecoder { public MyDecoder() { super(1024, 0, 4, 0, 4); // 长度字段偏移量0,长度4字节 } }
性能权衡
- 固定长度:浪费带宽但解析高效。
- 动态长度:节省空间但增加解析复杂度。
浏览器对同一 Host 建立 TCP 连接的数量有没有限制?
浏览器对同一 Host 的并发 TCP 连接数存在明确限制,这是出于网络资源公平性和服务器负载均衡的考量。现代浏览器的默认策略通常遵循以下规则:
HTTP/1.1 | 6 | Chrome、Firefox 等主流浏览器统一标准 |
HTTP/2 | 1 | 多路复用技术允许单连接并行传输多个请求 |
移动端浏览器 | 4-6 | 受限于移动网络环境和设备性能 |
限制的核心原因
- 防止服务器过载:避免单个客户端耗尽服务器资源。
- 减少网络拥塞:控制同一域名下的请求洪水,优化网络带宽分配。
- 协议设计约束:HTTP/1.1 的队头阻塞问题迫使浏览器通过多连接提升性能。
突破限制的技术手段
- 域名分片(Domain Sharding):
将资源分散到多个子域名(如
static1.example.com
、static2.example.com
),每个子域名独立计算连接数上限。 - 升级至 HTTP/2 或 HTTP/3: 利用多路复用(Multiplexing)特性,在单个连接上并行传输多个请求,减少连接数需求。
实际影响与权衡
- 资源加载速度:过多的连接可能导致 TCP 握手开销增加,反而降低性能。
- 服务器成本:域名分片需额外配置 DNS 和服务器资源,增加运维复杂度。
如何使用 ping 命令检查网络连通性?
ping
是网络诊断的基础工具,通过发送 ICMP Echo Request 包检测目标主机的可达性与延迟。
基础用法与参数解析
# 基本命令格式 ping [选项] 目标地址 # 常用参数示例 ping -c 4 google.com # 发送4个包后停止(Linux/macOS) ping -t 10.0.0.1 # 持续ping直到手动停止(Windows) ping -s 1500 example.com # 指定数据包大小为1500字节
输出关键指标解读
64 bytes from 172.217.160.110: icmp_seq=1 ttl=115 time=25.3 ms --- google.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms rtt min/avg/max/mdev = 24.123/25.456/26.789/0.923 ms
- TTL(Time To Live):数据包经过的路由器跳数(初始值通常为 64 或 128)。
- RTT(Round-Trip Time):往返延迟,反映网络响应速度。
- 丢包率(Packet Loss):连续丢包可能指示网络拥塞或链路故障。
高级诊断场景
- 大包测试:使用
-s
参数发送接近 MTU 的包(如 1500 字节),检测分片问题。 - 长连接监控:持续 ping 用于排查间歇性网络中断(如
ping -i 5 example.com
每 5 秒发送一次)。
限制与注意事项
- 防火墙屏蔽:部分服务器禁用 ICMP 响应,导致
ping
失败但服务实际可用。 - 网络优先级:某些网络设备对 ICMP 流量限速,延迟数据可能不反映真实应用性能。
如何使用 traceroute 命令查看数据包的路由路径?
traceroute
(或 tracert
于 Windows)用于追踪数据包从源到目标的路径,揭示网络拓扑中的每一跳节点。
工作原理
- TTL 递增探测: 发送 UDP 或 ICMP 包,初始 TTL 为 1,逐跳增加直至到达目标。
- ICMP Time Exceeded 响应: 每跳路由器在 TTL 减至 0 时返回错误报告,包含自身 IP 地址。
命令使用示例
# Linux/macOS traceroute -n -w 2 example.com # -n 禁用反向解析,-w 设置超时秒数 # Windows tracert -d example.com # -d 不解析主机名
输出解析与常见问题
1 192.168.0.1 1.234 ms 2 10.10.0.1 5.678 ms 3 * * * 4 203.0.113.45 20.123 ms
- 星号(*):表示该跳路由器未响应或响应超时。
- 高延迟跳点:可能指示网络拥塞或跨境链路(如海底光缆)。
技术变体与替代工具
- MTR(My TraceRoute):结合
ping
和traceroute
,实时刷新路径状态。 - TCP Traceroute:使用 TCP SYN 包绕过 ICMP 过滤(如
tcptraceroute example.com 80
)。
如何使用 tcpdump 或 Wireshark 进行网络数据包分析?
tcpdump
和 Wireshark 是网络抓包与协议分析的核心工具,适用于故障排查、安全审计和协议学习。
tcpdump 基础用法
# 抓取所有经过 eth0 网卡的数据包 tcpdump -i eth0 # 过滤特定目标端口(如 HTTP) tcpdump -i any port 80 # 保存抓包数据到文件 tcpdump -w capture.pcap
Wireshark 图形化分析
- 实时捕获:选择网卡并启动抓包,应用显示过滤器(如
http
或ip.src == 192.168.1.1
)。 - 文件分析:导入
.pcap
文件,使用统计工具(如 I/O 图表、流量图)可视化通信模式。
常见分析场景
- TCP 握手异常:过滤
tcp.flags.syn == 1
检查 SYN 包重传。 - DNS 解析问题:查找
dns
响应码(如NXDOMAIN
表示域名不存在)。 - HTTP 性能调优:分析请求响应时间与 TCP 窗口大小变化。
高级技巧
- 捕获过滤器(BPF 语法):减少抓包数据量(如
host 8.8.8.8 and udp
)。 - 解码自定义协议:使用 Wireshark 的 Lua 脚本扩展解析能力。
如何使用 netstat 查看网络连接的状态?
netstat
是监控网络连接与统计信息的经典工具,适用于诊断端口占用、连接状态异常等问题。
常用参数组合
# 显示所有 TCP 连接及其进程信息(需 root 权限) netstat -antp # 仅显示监听端口 netstat -lntu # 统计各状态连接数 netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c
输出字段解析
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx tcp 1024 0 192.168.1.2:22 10.0.0.3:65432 ESTABLISHED 5678/sshd
- Recv-Q/Send-Q:接收/发送队列积压数据量,持续非零值可能指示应用阻塞。
- State:连接状态(如
TIME_WAIT
表示等待关闭)。
替代工具与升级方案
ss
(Socket Statistics):更快速的现代替代工具(如ss -tulwn
)。lsof
:通过进程视角查看打开的文件与端口(如lsof -i :80
)。
典型应用场景
- 端口冲突排查:检查
LISTEN
状态端口,确认服务绑定冲突。 - DDoS 攻击识别:大量
SYN_RECV
状态连接可能指示半开攻击。 - 连接泄漏检测:监控
CLOSE_WAIT
数量,定位未正确释放连接的应用程序。
什么是带宽和吞吐量?
带宽与吞吐量是衡量网络性能的两个关键指标,但两者关注的角度截然不同:
带宽(Bandwidth)
- 定义:物理链路的最大理论传输速率,通常以 bps(比特每秒) 为单位,例如千兆以太网的带宽是 1 Gbps。
- 类比:如同高速公路的车道数量,决定了同时能容纳多少车辆通行。
- 技术限制: 受限于传输介质(光纤 > 双绞线)调制技术(如 QAM-256 比 QAM-64 承载更多数据)
吞吐量(Throughput)
- 定义:实际测量的有效数据传输速率,反映 终端用户可获得的数据量。
- 影响因素: 协议开销:TCP/IP 头、加密开销(如 TLS 增加 10-15% 负载)网络拥塞:丢包导致重传降低有效速率设备性能:路由器转发能力、服务器处理速度
对比表格
测量对象 | 物理链路理论极限 | 实际应用层数据速率 |
决定因素 | 硬件与传输标准 | 网络状况与协议效率 |
优化手段 | 升级网络设备 | 压缩数据、减少协议层级 |
实际场景分析
- 视频会议:即使带宽为 100 Mbps,由于 QoS 优先级调整和 UDP 协议选择,吞吐量可能稳定在 20 Mbps。
- 文件传输:受窗口大小和 RTT 影响,吞吐量 ≈ (窗口大小)/RTT,例如窗口 64 KB、RTT 50 ms 时,理论最大吞吐量为 1.28 MB/s。
什么是延迟和丢包?
延迟与丢包是影响网络质量的核心问题,两者常相互关联但成因不同:
延迟(Latency)
- 组成分解: 传输延迟:数据从设备发送到线缆的时间,与数据大小和带宽相关。传播延迟:信号在介质中传输的时间,光速限制(光纤中约 200,000 km/s)。处理延迟:路由器检查包头、NAT 转换等操作耗时。排队延迟:网络拥塞时数据包在缓冲区等待转发的时间。
丢包(Packet Loss)
- 主要原因: 网络拥塞:路由器缓冲区满时主动丢弃新到达的数据包(如 RED 随机早期检测)。硬件故障:损坏的网线、交换机端口错误导致数据损坏。策略丢弃:防火墙规则拦截或 QoS 策略丢弃低优先级流量。
关联与差异
- 高延迟 ≠ 高丢包:卫星链路延迟高但丢包率可能很低。
- 拥塞的连锁反应:丢包引发重传,进一步加剧延迟和拥塞,形成恶性循环。
行业标准容忍阈值
在线游戏 | < 100 ms | < 1% |
语音通话 | < 150 ms | < 3% |
视频流 | < 5s 缓冲 | < 5% |
什么是数字证书?
数字证书是网络身份认证的电子凭证,核心作用是 绑定公钥与实体身份,其结构遵循 X.509 标准:
证书核心组件
- 主体信息: 域名(Common Name 或 SAN)组织名称、地理位置
- 公钥数据:证书持有者的 RSA/ECC 公钥
- 颁发机构(CA):签发证书的权威机构(如 DigiCert、Let's Encrypt)
- 有效期:起止时间(通常 1-2 年)
- 数字签名:CA 用私钥对证书哈希值加密生成,用于验证证书完整性
验证流程
- 客户端获取证书后,用 CA 的公钥解密签名得到哈希值 H1。
- 客户端计算证书内容的哈希值 H2。
- 对比 H1 与 H2,若一致则证明证书未被篡改。
信任链机制
- 根证书:预装在操作系统或浏览器中的顶级 CA 证书(约 100-300 个)。
- 中间证书:由根证书签发,用于实际颁发终端证书,增强安全性(根证书离线保存)。
证书类型对比
DV(域名验证) | 验证域名所有权 | 个人博客、测试环境 |
OV(组织验证) | 验证企业合法性 | 企业官网 |
EV(扩展验证) | 严格企业背景调查 | 银行、支付平台 |
HTTPS 是如何保证通信安全的?
HTTPS 通过三位一体机制保障安全:加密、完整性校验 与 身份认证,具体实现依赖 SSL/TLS 协议:
1. 混合加密体系
- 非对称加密: 用于密钥交换(如 RSA 或 ECDHE),客户端用服务器公钥加密会话密钥。
- 对称加密: 后续通信使用 AES-256 等算法,效率高且适合大数据量加密。
2. 完整性保护
- 哈希函数: 对数据计算 SHA-256 等摘要,防止传输中被篡改。
- HMAC: 结合密钥的哈希算法,确保数据来源可信。
3. 身份认证
- 数字证书: 客户端验证服务器证书的真实性与有效性,防止中间人攻击。
- 证书吊销检查: 通过 OCSP 协议或 CRL 列表确保证书未被撤销。
攻击防护能力
- 窃听防御:加密使嗅探工具无法解析明文。
- 重放攻击:通过随机数(Nonce)和时间戳使旧数据包失效。
- 降级攻击:TLS 握手使用扩展协议(如 SCSV)阻止强制使用弱加密套件。
请简述 HTTPS 大概过程流程?
HTTPS 通信是 TCP 连接与 TLS 握手的协同过程,主要分为五个阶段:
1. TCP 三次握手
- 客户端发送 SYN 到服务器 443 端口。
- 服务器回复 SYN-ACK。
- 客户端发送 ACK 完成连接建立。
2. TLS 握手协商
- ClientHello: 客户端发送支持的 TLS 版本、加密套件列表、客户端随机数。
- ServerHello: 服务器选择加密套件(如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256),发送服务器随机数及证书。
- 证书验证: 客户端验证证书链,检查吊销状态。
- 密钥交换: 客户端生成预主密钥,用服务器公钥加密发送(RSA 方案)或协商 ECDHE 参数生成共享密钥。
- 会话密钥生成: 客户端与服务器通过随机数及预主密钥计算得到对称会话密钥。
3. 加密通信
- Finished 消息: 双方发送加密的 Finished 消息验证密钥正确性。
- 应用数据传输: 使用会话密钥加密 HTTP 请求与响应。
4. 连接终止
- Alert 消息: 发送 close_notify 警报通知安全关闭连接。
- TCP 四次挥手: 正常关闭 TCP 连接。
性能优化技术
- 会话复用: 通过 Session ID 或 Session Ticket 恢复之前协商的会话参数,减少握手延迟。
- OCSP Stapling: 服务器在握手时附带证书状态信息,避免客户端额外查询 OCSP 服务器。
什么是对称加密、非对称加密?
加密技术是信息安全的基石,核心分为对称加密与非对称加密两大体系,它们在密钥管理和应用场景上有本质区别:
对称加密
- 核心机制: 加密与解密使用同一密钥,算法执行速度快,适合大数据量加密。
- 典型算法: AES(高级加密标准):支持 128/256 位密钥,采用分组加密(如 CBC、GCM 模式)ChaCha20:流式加密,移动设备性能优化
- 应用场景: 文件加密(如 ZIP 密码保护)HTTPS 通信中的数据传输阶段
非对称加密
- 核心机制: 使用公钥加密、私钥解密,解决密钥分发难题但计算开销大。
- 典型算法: RSA:基于大数分解难题,常用于数字签名和密钥交换ECC(椭圆曲线加密):相同安全强度下密钥更短(256 位 ECC ≈ 3072 位 RSA)
- 应用场景: SSL/TLS 握手阶段的密钥协商数字证书签名
对比与协作
密钥数量 | 单一共享密钥 | 公钥+私钥对 |
性能 | 快(适合大数据) | 慢(适合小数据) |
安全性依赖 | 密钥保密性 | 数学难题复杂度(如离散对数) |
混合加密实践
现代协议(如 HTTPS)结合两者优势:
- 非对称加密交换临时会话密钥
- 对称加密加密实际传输数据
# 伪代码示例:TLS 密钥交换 client_random = generate_random() server_random = generate_random() pre_master_key = generate_with_ECDHE() master_key = PRF(pre_master_key, client_random, server_random)
什么是 Cookie?
Cookie 是网站存储在用户浏览器中的小型文本数据,用于跟踪会话状态和个性化用户体验。其核心属性包括:
工作机制
- 创建流程:
服务器通过 HTTP 响应头
Set-Cookie: name=value; attributes
设置 Cookie。 - 携带方式:
浏览器后续请求自动在
Cookie
头部附加匹配条件的数据。
关键属性控制
- 作用域限制: Domain:指定生效域名(如 .example.com 包含子域名)Path:限制路径范围(如 /api)
- 安全增强: HttpOnly:禁止 JavaScript 访问,防范 XSS 攻击Secure:仅通过 HTTPS 传输SameSite:控制跨站请求携带(Strict/Lax/None)
存储形态与限制
- 浏览器实现: 各浏览器对 Cookie 的存储有数量(约 50 个/域名)和大小(4KB/条)限制。
- 持久化选项: 会话 Cookie:浏览器关闭后失效持久 Cookie:通过 Expires 或 Max-Age 设置生命周期
典型应用场景
- 用户身份标识:存储会话 ID 实现登录状态保持
- 偏好记录:保存语言设置、主题选择等个性化参数
- 行为追踪:广告平台跨站跟踪用户访问路径(需符合隐私法规)
什么是 Session?
Session 是服务器端维护的用户会话状态机制,通过临时存储用户相关数据实现跨请求的状态保持。
核心运作原理
- 会话创建: 用户首次访问时,服务器生成唯一 Session ID 并创建关联存储结构。
- ID 传递:
通过 Cookie(常见)或 URL 重写(如
;jsessionid=xxx
)将 ID 返回客户端。 - 状态维护: 后续请求携带 ID,服务器检索对应 Session 数据完成业务逻辑。
存储后端选型
- 内存存储: 快速但重启丢失,适合单机应用(如 Tomcat 默认方式)。
- 分布式存储: 使用 Redis 或数据库共享 Session,支持水平扩展(需序列化数据)。
安全考量
- 会话固定攻击: 强制用户使用已知 Session ID,需在登录后重置 ID。
- 超时管理: 设置闲置超时(如 30 分钟)自动销毁敏感数据。
- 加密内容: 敏感信息(如权限级别)应加密存储而非明文保存。
性能优化策略
- 数据最小化: 仅存储必要信息(如用户 ID),避免大型对象拖慢检索速度。
- 缓存策略: 高频访问的 Session 数据可缓存在本地内存,减少后端查询。
Cookie 和 Session 是怎么实现用户的登录状态的?
登录状态维护依赖 Cookie 与 Session 的协同工作,整体流程可分为五个阶段:
1. 认证请求提交
用户提交登录表单,包含用户名与密码:
POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=user&password=pass123
2. 服务器验证
服务器校验凭证,成功后:
- 生成 Session: 创建用户数据存储结构,包含用户 ID、角色、登录时间等。
- 设置 Cookie: 返回响应头携带 Session ID:
3. 状态保持
浏览器后续请求自动附加 Cookie:
GET /dashboard HTTP/1.1 Cookie: SESSIONID=abc123
4. 服务端检索
服务器通过 Session ID 查询存储后端:
- 缓存查询:检查 Redis 中
session:abc123
是否存在且未过期。 - 数据加载:反序列化用户权限、个性化设置等上下文信息。
5. 超时与销毁
- 主动注销:用户点击退出,服务器删除 Session 数据。
- 被动过期:超过闲置时间或绝对有效期后自动清理。
安全增强措施
- Token 绑定: 记录客户端指纹(如 IP+User-Agent),防止 Session 劫持。
- 定期轮换: 敏感操作后更新 Session ID,减少暴露窗口。
Cookie 和 Session 有什么区别?
Cookie 与 Session 在状态管理中各司其职,主要差异体现在数据存储位置、安全性和扩展能力等方面:
核心差异对比
存储位置 | 客户端浏览器 | 服务器端存储系统 |
数据安全性 | 较低(可被篡改或窃取) | 较高(仅 ID 暴露) |
存储容量 | 受限(约 4KB/条) | 理论无限制(依赖服务器配置) |
生命周期 | 可设置长期有效 | 通常随会话结束或超时终止 |
性能影响 | 每次请求自动携带增加带宽 | 服务器查询带来数据库/缓存压力 |
技术选型场景
- 选用 Cookie: 存储非敏感配置(如主题偏好)、跟踪匿名用户行为。
- 选用 Session: 管理登录状态、存储临时验证码、处理多步骤表单数据。
互补协作模式
- Session 依赖 Cookie: 大多数实现通过 Cookie 传递 Session ID,禁用 Cookie 时需 URL 重写。
- 混合存储: 敏感数据存 Session,频繁访问的非敏感数据(如用户昵称)可缓存至 Cookie 减少服务端负载。
隐私与合规
- GDPR 影响: Cookie 用于追踪需获得用户明确同意,而 Session 属于功能必要性范畴通常豁免。
- 跨域限制: Cookie 的 SameSite 属性限制第三方上下文携带,Session 则天然隔离于不同域名。
什么是 SQL 注入?举个例子?
SQL 注入是通过构造恶意输入篡改数据库查询逻辑的攻击手段,本质是将用户输入直接拼接到 SQL 语句而未做过滤。攻击者可通过此漏洞绕过认证、窃取数据甚至删除数据库。
典型攻击流程
- 输入点探测:寻找未过滤的用户输入字段(如登录表单、搜索框)。
- 恶意构造:在输入中嵌入 SQL 片段改变原语句结构。
- 执行攻击:触发非预期查询(如
OR 1=1
绕过密码验证)。
经典案例:万能密码登录
假设登录验证的 SQL 语句为:
SELECT * FROM users WHERE username='$user' AND password='$pass'
攻击者输入用户名为 admin' --
,密码任意:
SELECT * FROM users WHERE username='admin' --' AND password='xxx'
--
注释掉后续条件,直接以 admin 身份登录。
防御策略对比
参数化查询 | 分离 SQL 结构与参数,阻止拼接 | 根本性解决 |
输入过滤 | 过滤单引号等特殊字符 | 简单易实现 |
最小权限原则 | 数据库账户仅授予必要权限 | 限制攻击影响范围 |
ORM 框架 | 自动转义输入,避免手动拼接 SQL | 开发效率高 |
实际漏洞场景
- 排序字段注入:
/products?sort=price; DROP TABLE users
- 批量删除绕过:
DELETE FROM logs WHERE id=1 OR 1=1
谈一谈 XSS 攻击,举个例子?
XSS(跨站脚本攻击)是将恶意脚本注入到可信网页中的漏洞,核心危害是窃取用户会话 Cookie 或伪造页面内容。根据攻击持久性分为三类:
存储型 XSS
- 攻击路径:恶意脚本存入数据库 → 其他用户访问时触发。
- 案例:论坛评论区插入
<script>stealCookie()</script>
,用户浏览评论时自动执行。
反射型 XSS
- 攻击路径:诱导用户点击含恶意参数的 URL → 服务端返回未过滤的内容。
- 案例:钓鱼邮件链接
https://example.com/search?q=<script>alert(1)</script>
。
DOM 型 XSS
- 攻击路径:前端 JavaScript 动态操作 DOM 时注入恶意内容。
- 案例:
eval(window.location.hash.slice(1))
执行 URL 片段中的代码。
防御技术矩阵
输入过滤 | 转义
,
等 HTML 敏感字符 | 阻断脚本标签注入 |
输出编码 | 根据上下文选择 HTML/URL/JS 编码 | 防止解析为可执行代码 |
CSP 策略 | 设置
头 | 限制外部脚本加载源 |
HttpOnly | Cookie 设置 HttpOnly 属性 | 阻止 JavaScript 窃取 |
高级攻击手法
- 图片标签载荷:
<img src=x onerror=maliciousCode()>
- SVG 矢量图注入:SVG 文件内嵌 JavaScript 代码
什么是 DDos 攻击?
DDoS(分布式拒绝服务)攻击通过海量请求耗尽目标资源使其瘫痪,具备多源协同、流量洪泛的特点。攻击类型主要分为:
流量层攻击
- 原理:耗尽网络带宽或设备处理能力。
- 代表类型: UDP 洪水:伪造源 IP 发送大量 UDP 包。ICMP 洪水:Ping 请求淹没目标。
协议层攻击
- 原理:利用协议漏洞消耗服务器资源。
- 代表类型: SYN 洪水:发送大量半开连接耗尽 TCP 连接表。Slowloris:保持大量慢速 HTTP 连接占用线程池。
应用层攻击
- 原理:模拟合法请求消耗计算资源。
- 代表类型: HTTP 洪水:高频访问动态页面(如搜索接口)。CC 攻击:针对登录、验证码等 CPU 密集型接口。
防御体系分层
网络层 | BGP 黑洞路由 | 丢弃攻击流量 |
基础设施 | CDN 分流 | 分散请求至边缘节点 |
应用层 | WAF(Web 应用防火墙) | 识别并拦截恶意请求 |
资源限制 | 连接速率限制 | 抑制异常流量 |
攻击趋势
- IoT 僵尸网络:利用摄像头、路由器等设备组建 Botnet。
- 脉冲式攻击:短时间爆发躲避流量清洗检测。
forward 和 redirect 的区别?
forward(转发)与 redirect(重定向)是服务端控制页面跳转的两种方式,核心差异在于请求响应流程的控制权。
工作机制对比
请求次数 | 1 次(服务器内部处理) | 2 次(客户端重新发起) |
URL 变化 | 不变化 | 变为新 URL |
数据共享 | 可通过 request 属性共享 | 需通过 URL 参数或 Session 传递 |
性能 | 更高(无额外请求) | 较低(多一次往返) |
典型使用场景
- forward: 用户提交表单后跳转至结果页(保持 POST 数据)。MVC 框架中控制器将请求转发至视图层。
- redirect: 用户登录后重定向至主页(防止表单重复提交)。OAuth 授权流程中跳转至第三方认证页面。
技术实现示例
// Forward 示例(Servlet) RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp"); dispatcher.forward(request, response); // Redirect 示例 response.sendRedirect("https://example.com/new-page");
浏览器行为差异
- 历史记录:redirect 会新增历史条目,用户可后退至原页面。
- 书签影响:redirect 后的 URL 可被收藏,forward 无法直接收藏结果页。
Cookie 和 Session 有什么区别?
Cookie 与 Session 是 Web 开发中状态管理的两种互补方案,主要差异体现在数据存储位置与安全性上。
核心特性对比
存储位置 | 客户端浏览器 | 服务器内存/数据库/Redis |
数据可见性 | 用户可查看并修改 | 仅服务端可访问 |
生命周期 | 可设置长期有效(如 1 年) | 通常随会话结束或超时(如 30 分钟) |
存储容量 | 单个域名约 4KB | 受服务器内存限制(通常 1MB 以上) |
性能影响 | 每次请求自动携带增加带宽 | 服务器查询消耗资源 |
安全风险对比
- Cookie: 跨站脚本(XSS)窃取 Cookie。跨站请求伪造(CSRF)滥用 Cookie。
- Session: Session 固定攻击(强制使用已知 ID)。服务器存储泄露导致数据暴露。
协作模式
- Session ID 传递:多数框架通过 Cookie 存储 Session ID(如
JSESSIONID
)。 - URL 重写:当浏览器禁用 Cookie 时,可将 ID 附加到 URL(如
;jsessionid=xxx
)。
技术选型建议
- 敏感数据存储:用户权限、交易凭证等必须存 Session。
- 客户端状态:语言偏好、主题设置等非敏感数据可存 Cookie。
隐私合规影响
- GDPR 要求:追踪类 Cookie 需用户明确同意,而功能性 Session ID 通常豁免。
- 日志审计:Session 日志需脱敏处理,避免记录个人隐私信息。
什么是 SQL 注入?举个例子?
SQL 注入是通过构造恶意输入篡改数据库查询逻辑的攻击手段,本质是将用户输入直接拼接到 SQL 语句而未做过滤。攻击者可通过此漏洞绕过认证、窃取数据甚至删除数据库。
典型攻击流程
- 输入点探测:寻找未过滤的用户输入字段(如登录表单、搜索框)。
- 恶意构造:在输入中嵌入 SQL 片段改变原语句结构。
- 执行攻击:触发非预期查询(如
OR 1=1
绕过密码验证)。
经典案例:万能密码登录
假设登录验证的 SQL 语句为:
SELECT * FROM users WHERE username='$user' AND password='$pass'
攻击者输入用户名为 admin' --
,密码任意:
SELECT * FROM users WHERE username='admin' --' AND password='xxx'
--
注释掉后续条件,直接以 admin 身份登录。
防御策略对比
参数化查询 | 分离 SQL 结构与参数,阻止拼接 | 根本性解决 |
输入过滤 | 过滤单引号等特殊字符 | 简单易实现 |
最小权限原则 | 数据库账户仅授予必要权限 | 限制攻击影响范围 |
ORM 框架 | 自动转义输入,避免手动拼接 SQL | 开发效率高 |
实际漏洞场景
- 排序字段注入:
/products?sort=price; DROP TABLE users
- 批量删除绕过:
DELETE FROM logs WHERE id=1 OR 1=1
谈一谈 XSS 攻击,举个例子?
XSS(跨站脚本攻击)是将恶意脚本注入到可信网页中的漏洞,核心危害是窃取用户会话 Cookie 或伪造页面内容。根据攻击持久性分为三类:
存储型 XSS
- 攻击路径:恶意脚本存入数据库 → 其他用户访问时触发。
- 案例:论坛评论区插入
<script>stealCookie()</script>
,用户浏览评论时自动执行。
反射型 XSS
- 攻击路径:诱导用户点击含恶意参数的 URL → 服务端返回未过滤的内容。
- 案例:钓鱼邮件链接
https://example.com/search?q=<script>alert(1)</script>
。
DOM 型 XSS
- 攻击路径:前端 JavaScript 动态操作 DOM 时注入恶意内容。
- 案例:
eval(window.location.hash.slice(1))
执行 URL 片段中的代码。
防御技术矩阵
输入过滤 | 转义
,
等 HTML 敏感字符 | 阻断脚本标签注入 |
输出编码 | 根据上下文选择 HTML/URL/JS 编码 | 防止解析为可执行代码 |
CSP 策略 | 设置
头 | 限制外部脚本加载源 |
HttpOnly | Cookie 设置 HttpOnly 属性 | 阻止 JavaScript 窃取 |
高级攻击手法
- 图片标签载荷:
<img src=x onerror=maliciousCode()>
- SVG 矢量图注入:SVG 文件内嵌 JavaScript 代码
什么是 DDos 攻击?
DDoS(分布式拒绝服务)攻击通过海量请求耗尽目标资源使其瘫痪,具备多源协同、流量洪泛的特点。攻击类型主要分为:
流量层攻击
- 原理:耗尽网络带宽或设备处理能力。
- 代表类型: UDP 洪水:伪造源 IP 发送大量 UDP 包。ICMP 洪水:Ping 请求淹没目标。
协议层攻击
- 原理:利用协议漏洞消耗服务器资源。
- 代表类型: SYN 洪水:发送大量半开连接耗尽 TCP 连接表。Slowloris:保持大量慢速 HTTP 连接占用线程池。
应用层攻击
- 原理:模拟合法请求消耗计算资源。
- 代表类型: HTTP 洪水:高频访问动态页面(如搜索接口)。CC 攻击:针对登录、验证码等 CPU 密集型接口。
防御体系分层
网络层 | BGP 黑洞路由 | 丢弃攻击流量 |
基础设施 | CDN 分流 | 分散请求至边缘节点 |
应用层 | WAF(Web 应用防火墙) | 识别并拦截恶意请求 |
资源限制 | 连接速率限制 | 抑制异常流量 |
攻击趋势
- IoT 僵尸网络:利用摄像头、路由器等设备组建 Botnet。
- 脉冲式攻击:短时间爆发躲避流量清洗检测。
forward 和 redirect 的区别?
forward(转发)与 redirect(重定向)是服务端控制页面跳转的两种方式,核心差异在于请求响应流程的控制权。
工作机制对比
请求次数 | 1 次(服务器内部处理) | 2 次(客户端重新发起) |
URL 变化 | 不变化 | 变为新 URL |
数据共享 | 可通过 request 属性共享 | 需通过 URL 参数或 Session 传递 |
性能 | 更高(无额外请求) | 较低(多一次往返) |
典型使用场景
- forward: 用户提交表单后跳转至结果页(保持 POST 数据)。MVC 框架中控制器将请求转发至视图层。
- redirect: 用户登录后重定向至主页(防止表单重复提交)。OAuth 授权流程中跳转至第三方认证页面。
技术实现示例
// Forward 示例(Servlet) RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp"); dispatcher.forward(request, response); // Redirect 示例 response.sendRedirect("https://example.com/new-page");
浏览器行为差异
- 历史记录:redirect 会新增历史条目,用户可后退至原页面。
- 书签影响:redirect 后的 URL 可被收藏,forward 无法直接收藏结果页。
Cookie 和 Session 有什么区别?
Cookie 与 Session 是 Web 开发中状态管理的两种互补方案,主要差异体现在数据存储位置与安全性上。
核心特性对比
存储位置 | 客户端浏览器 | 服务器内存/数据库/Redis |
数据可见性 | 用户可查看并修改 | 仅服务端可访问 |
生命周期 | 可设置长期有效(如 1 年) | 通常随会话结束或超时(如 30 分钟) |
存储容量 | 单个域名约 4KB | 受服务器内存限制(通常 1MB 以上) |
性能影响 | 每次请求自动携带增加带宽 | 服务器查询消耗资源 |
安全风险对比
- Cookie: 跨站脚本(XSS)窃取 Cookie。跨站请求伪造(CSRF)滥用 Cookie。
- Session: Session 固定攻击(强制使用已知 ID)。服务器存储泄露导致数据暴露。
协作模式
- Session ID 传递:多数框架通过 Cookie 存储 Session ID(如
JSESSIONID
)。 - URL 重写:当浏览器禁用 Cookie 时,可将 ID 附加到 URL(如
;jsessionid=xxx
)。
技术选型建议
- 敏感数据存储:用户权限、交易凭证等必须存 Session。
- 客户端状态:语言偏好、主题设置等非敏感数据可存 Cookie。
隐私合规影响
- GDPR 要求:追踪类 Cookie 需用户明确同意,而功能性 Session ID 通常豁免。
- 日志审计:Session 日志需脱敏处理,避免记录个人隐私信息。
17年+码农经历了很多次面试,多次作为面试官面试别人,多次大数据面试和面试别人,深知哪些面试题是会被经常问到。 在多家企业从0到1开发过离线数仓实时数仓等多个大型项目,详细介绍项目架构等企业内部秘不外传的资料,介绍踩过的坑和开发干货,分享多个拿来即用的大数据ETL工具,让小白用户快速入门并精通,指导如何入职后快速上手。 计划更新内容100篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!