大厂计算机网络高频八股文面试题及参考答案

请简述 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 等法规要求敏感数据必须加密传输。

混合加密示例

  1. 客户端发起 HTTPS 请求,服务器返回公钥证书。
  2. 客户端生成随机对称密钥,用服务器公钥加密后发送。
  3. 双方使用对称密钥加密后续通信内容。

HTTP 协议的工作原理是什么?

HTTP 是基于请求-响应模型的无状态协议,其核心流程可分解为以下步骤:

  1. 建立 TCP 连接:客户端(如浏览器)通过 TCP 三次握手 与服务器建立连接。HTTP/1.1 默认启用 持久连接(Keep-Alive),允许复用同一连接发送多个请求。
  2. 发送 HTTP 请求:客户端构造包含 方法(GET、POST)、路径(如/index.html)、头部(User-Agent、Accept)和 可选正文 的请求报文。例如:
  3. 服务器处理请求:服务器解析请求,定位资源(如静态文件或动态脚本),执行逻辑(如数据库查询),并生成响应数据。
  4. 返回 HTTP 响应:服务器发送状态码(如200 OK)、响应头(Content-Type、Cache-Control)和正文(HTML、JSON)。例如:
  5. 关闭连接或复用:非持久连接下,服务器主动关闭 TCP 连接;持久连接则等待后续请求。

关键特性

  • 无状态性:每个请求独立处理,需借助 CookieToken 维持会话状态。
  • 缓存机制:通过 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"),解决时间戳精度不足问题(如文件内容未变但修改时间更新)。

缓存决策流程

  1. 检查 Cache-ControlExpires,判断是否命中强缓存。
  2. 若未命中,发送请求并附加 If-Modified-SinceIf-None-Match
  3. 服务器返回 304 Not Modified200 OK + 新内容

实战优化策略

  • 静态资源:设置长 max-age(如一年),通过文件名哈希(app.a1b2c3.js)实现内容更新后 URL 变更。
  • 动态接口:使用 no-cache 配合 ETag,确保数据实时性。
  • Vary 头:指定缓存键(如 Vary: User-Agent),区分不同设备版本的响应。

什么是 HTTP 协议的长连接和短连接?

HTTP 连接的复用策略直接影响网络效率,主要分为两种模式:

短连接

每个请求后关闭 TCP 连接

默认于 HTTP/1.0

长连接

复用同一连接处理多个请求

默认于 HTTP/1.1 及以上

短连接工作流程

  1. 客户端发起请求 → 服务器响应 → 关闭连接。
  2. 下次请求需重新建立 TCP 连接(三次握手)。

长连接工作流程

  1. 客户端发送请求 → 服务器响应 → 保持连接空闲。
  2. 后续请求复用现有连接,减少握手开销。
  3. 超时或主动关闭后终止连接(通过 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)安全终止连接,确保双方数据完整传输:

流程分解

  1. 主动关闭方发送 FIN:客户端(假设为主动关闭方)发送 FIN 报文(FIN=1),进入 FIN_WAIT_1 状态。
  2. 被动关闭方回复 ACK:服务器收到 FIN 后返回 ACK 报文(ACK=1),进入 CLOSE_WAIT 状态。客户端收到后切换至 FIN_WAIT_2 状态。
  3. 被动关闭方发送 FIN:服务器完成数据发送后,发送自己的 FIN 报文(FIN=1),进入 LAST_ACK 状态。
  4. 主动关闭方回复 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 服务器返回下一级服务器的地址,由客户端继续查询(根域名服务器通常使用此模式)。

解析步骤详解

  1. 浏览器缓存检查:浏览器首先检查自身缓存(如 chrome://net-internals/#dns)。
  2. 系统缓存查询:查询操作系统 Hosts 文件及本地 DNS 缓存(如 Windows 的 ipconfig /displaydns)。
  3. 本地 DNS 服务器查询:向配置的本地 DNS 服务器(如 ISP 提供的 8.8.8.8)发起请求。若缓存命中则直接返回。
  4. 根域名服务器查询:本地 DNS 服务器向根域名服务器(全球 13 组)查询顶级域(如 .com)的 NS 记录。
  5. 顶级域服务器查询:根服务器返回 .com 域的权威服务器地址,本地 DNS 继续向该服务器查询二级域(如 example.com)。
  6. 权威域名服务器查询:顶级域服务器返回 example.com 的权威 DNS 地址,本地 DNS 向该服务器请求主机记录(如 www)。
  7. 结果返回与缓存:权威服务器返回 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)访问互联网时:

  1. 检查目标 IP 是否在同一子网。若不在,数据包发送至默认网关(路由器 MAC)。
  2. 通过 ARP 协议获取网关 MAC 地址,封装帧头后传输。
  3. 路由器剥离 MAC 头,根据 IP 地址进行路由决策,重新封装下一跳 MAC 地址。

特殊场景

  • NAT 转换:IP 地址在公网与私网间映射,MAC 地址仅在局域网有效。
  • VPN 隧道:原始 MAC 地址被隧道协议封装,外层 IP 地址用于穿越公共网络。

ARP 协议的工作原理?

ARP(地址解析协议)解决 IP 地址到 MAC 地址的映射问题,其工作流程分为请求-响应两个阶段:

核心流程

  1. ARP 请求广播:当主机 A 需要与 IP 为 192.168.1.3 的主机 B 通信时:检查本地 ARP 缓存表是否存在对应条目。若不存在,构造 ARP 请求帧(目标 MAC 为 FF:FF:FF:FF:FF:FF),包含:交换机泛洪该帧至局域网所有设备。
  2. 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 长连接或数据库连接池中,定期发送保活包防止中间设备(如防火墙)因超时断开连接。

工作机制细节

  1. 参数配置:tcp_keepalive_time(默认 7200 秒):空闲多久后发送探测包。tcp_keepalive_intvl(默认 75 秒):探测包重试间隔。tcp_keepalive_probes(默认 9 次):最大探测次数。
  2. 探测过程:连接空闲超时后,发送 ACK 包(序列号为当前接收序列减 1)。若收到 RST 响应,确认对端崩溃,关闭连接。若连续探测无响应,判定连接失效并释放资源。

应用场景与争议

  • 适用场景: 银行交易系统确保会话实时性。移动网络应对 NAT 超时(通常 5-30 分钟)。
  • 争议点: 部分应用(如 HTTP/2)依赖业务层心跳包,避免 TCP 保活干扰应用逻辑。

什么是滑动窗口协议?它在 TCP 中如何工作?

滑动窗口协议是流量控制与高效传输的核心机制,通过动态窗口调整平衡发送速率与接收能力:

协议核心原理

  • 窗口定义:发送窗口:允许连续发送的数据范围,无需等待确认。接收窗口:接收方缓冲区剩余空间,通过 ACK 包告知发送方。
  • 滑动机制:随着数据确认,窗口向前“滑动”,允许发送新数据。例如:

TCP 中的实现细节

  1. 窗口大小协商:建立连接时通过 Window Scale 选项(RFC 1323)扩展 16 位窗口至 30 位,支持高速网络。
  2. 零窗口处理:当接收方窗口为 0 时,发送方启动 持续计时器,定期探测窗口恢复情况。
  3. 流量控制联动:接收方通过 ACK 包中的 Window 字段动态调整发送方窗口,防止缓冲区溢出。

性能优化特性

  • 累积确认: ACK 号为连续接收的最大字节序,允许中间数据丢失时触发快速重传。
  • 窗口合并: 多个小数据段可一次性确认,减少协议开销。

什么是拥塞控制?TCP 如何实现拥塞控制?

拥塞控制是防止网络过载的关键机制,通过动态调整发送速率匹配路径容量:

核心算法四阶段

  1. 慢启动(Slow Start):初始拥塞窗口(cwnd)为 1 MSS,每 RTT 翻倍(指数增长)。达到慢启动阈值(ssthresh)后进入拥塞避免阶段。
  2. 拥塞避免(Congestion Avoidance):cwnd 每 RTT 增加 1 MSS(线性增长)。发生超时重传时,ssthresh 设为当前 cwnd/2,重置 cwnd 为 1。
  3. 快速重传(Fast Retransmit):收到 3 个重复 ACK 时立即重传丢失包,无需等待超时。
  4. 快速恢复(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 或分块编码,可能引发粘包。

解决方案对比

固定长度协议

每个报文填充至固定长度

实时音视频流

分隔符协议

使用特殊字符(如

\n

)标记报文结束

文本协议(如 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.comstatic2.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)用于追踪数据包从源到目标的路径,揭示网络拓扑中的每一跳节点。

工作原理

  1. TTL 递增探测: 发送 UDP 或 ICMP 包,初始 TTL 为 1,逐跳增加直至到达目标。
  2. 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):结合 pingtraceroute,实时刷新路径状态。
  • 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 图形化分析

  • 实时捕获:选择网卡并启动抓包,应用显示过滤器(如 httpip.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 用私钥对证书哈希值加密生成,用于验证证书完整性

验证流程

  1. 客户端获取证书后,用 CA 的公钥解密签名得到哈希值 H1。
  2. 客户端计算证书内容的哈希值 H2。
  3. 对比 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)结合两者优势:

  1. 非对称加密交换临时会话密钥
  2. 对称加密加密实际传输数据
# 伪代码示例: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 是服务器端维护的用户会话状态机制,通过临时存储用户相关数据实现跨请求的状态保持。

核心运作原理

  1. 会话创建: 用户首次访问时,服务器生成唯一 Session ID 并创建关联存储结构。
  2. ID 传递: 通过 Cookie(常见)或 URL 重写(如 ;jsessionid=xxx)将 ID 返回客户端。
  3. 状态维护: 后续请求携带 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 语句而未做过滤。攻击者可通过此漏洞绕过认证、窃取数据甚至删除数据库。

典型攻击流程

  1. 输入点探测:寻找未过滤的用户输入字段(如登录表单、搜索框)。
  2. 恶意构造:在输入中嵌入 SQL 片段改变原语句结构。
  3. 执行攻击:触发非预期查询(如 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 策略

设置

Content-Security-Policy

限制外部脚本加载源

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 语句而未做过滤。攻击者可通过此漏洞绕过认证、窃取数据甚至删除数据库。

典型攻击流程

  1. 输入点探测:寻找未过滤的用户输入字段(如登录表单、搜索框)。
  2. 恶意构造:在输入中嵌入 SQL 片段改变原语句结构。
  3. 执行攻击:触发非预期查询(如 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 策略

设置

Content-Security-Policy

限制外部脚本加载源

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篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!

全部评论
讲的很全面了,赞一个
点赞 回复 分享
发布于 02-25 09:29 美国

相关推荐

Cherrycola01:0实习 0项目 约等于啥也没有啊 哥们儿这简历认真的吗
点赞 评论 收藏
分享
评论
15
123
分享

创作者周榜

更多
牛客网
牛客企业服务