服务端2月21日 17:38
JWT 和 OAuth2.0 是什么关系?有什么区别?它们不在同一层面:JWT 是令牌格式标准(RFC 7519),定义 token 的结构和编码方式;OAuth2.0 是授权框架(RFC 6749),定义授权流程和角色关系。一句话:OAuth2.0 规定了"怎么授权",JWT 规定了"令牌长什么样"。两者可以组合——OAuth2.0 的 Access Token 可以采用 JWT 格式,但不是必须的。OAuth2.0 也可以用不透明的随机字符串做 token。## 追问**OAuth2.0 不用 JWT 行不行?**完全可以。OAuth2.0 对 token 格式没有约束,可以用随机字符串(opaque token),验证时需查库。用 J...服务端2月17日 13:06
Cypress 怎么拦截和模拟网络请求?用 `cy.intercept()` 拦截匹配规则的 HTTP 请求,配合 `.as()` 别名和 `cy.wait('@alias')` 实现请求等待与断言。intercept 可返回固定 stub 响应、动态构造响应、修改请求头或延迟响应,让测试脱离真实 API 依赖。注意 intercept 必须在请求发起前注册,否则无法捕获。
## 追问
**cy.intercept() 和已废弃的 cy.route() 有什么区别?**
route 只能拦截 XMLHttpRequest,intercept 同时支持 XHR 和 Fetch API。intercept 使用 RouteMa...服务端2月21日 17:32
什么是 JWT?它由哪三部分组成?JWT(JSON Web Token,RFC 7519)是一种紧凑的自包含令牌格式,用于在各方之间安全传输信息。它由三部分组成,用点号分隔:**Header.Payload.Signature**。Header 指定令牌类型和签名算法(如 HS256);Payload 承载声明(Claims),包括注册声明(iss/exp/sub)、公共声明和私有声明;Signature 用 Header 指定的算法对前两部分签名,保证完整性。注意 Payload 只是 Base64 编码而非加密,不能放敏感数据。## 追问**JWT 的 Signature 是怎么生成的?**将 Base64Url 编...服务端2月17日 13:05
Cypress 自定义命令怎么创建和复用?通过 `Cypress.Commands.add()` 在 `cypress/support/commands.js` 中注册自定义命令,将重复操作封装为可链式调用的 `cy.xxx()` 方法。自定义命令返回 `cy` 对象,与内置命令行为一致,支持重试和超时机制。定义时注意命名唯一、避免与内置命令冲突,复杂逻辑优先用普通工具函数而非自定义命令。
## 追问
**Cypress.Commands.add() 的第二个参数支持哪些选项?**
可传入配置对象 `{ prevSubject: 'element' }` 使命令接收前一个命令的 subject,实现类似 `cy.get('i...服务端2月21日 17:33
JWT 和 Session 认证有什么区别?各适合什么场景?核心区别在于状态存储位置:JWT 是无状态的,用户信息编码在 token 中由客户端持有;Session 是有状态的,用户信息存在服务端,客户端只拿一个 Session ID。这意味着 JWT 天然支持水平扩展(任何节点都能验签),但一旦签发就无法主动撤销;Session 可以随时销毁,但多节点需要共享存储(如 Redis)。选择依据:分布式系统、移动端、跨域 API 选 JWT;需要即时吊销权限、传统 Web 应用选 Session。## 追问**JWT 无法主动撤销,用户登出怎么办?**常用三种方案:黑名单(Redis 存已撤销 token,过期自动清除)、短期 access tok...计算机基础2月19日 14:43
TCP 可靠传输靠哪些机制保证?RTO 和 SACK 是怎么工作的?TCP 可靠传输靠六个机制保证:序列号+确认应答(保证有序、检测丢包)、超时重传+快重传(丢包恢复)、校验和(检测数据损坏)、流量控制(防接收方溢出)、拥塞控制(防网络过载)。其中序列号和重传是核心,其他都是辅助。
## 追问
### 超时重传的 RTO 怎么算?为什么不能固定值?
网络延迟波动大,固定值不靠谱——设小了正常延迟就触发多余重传,设大了真丢包要等很久才恢复。RTO 基于实测 RTT 动态计算:RTO = SRTT + 4 × RTTVAR,SRTT 是平滑 RTT(历史加权平均),RTTVAR 是 RTT 波动幅度。首次测量 SRTT = RTT,后续每次 SRTT ...计算机基础2月19日 14:42
TCP 四次挥手的过程是什么?为什么不能三次挥手?TCP 四次挥手是断开连接的过程:主动方发 FIN,被动方回 ACK,被动方再发 FIN,主动方回 ACK。之所以要四次而不是三次,是因为 TCP 全双工——每个方向必须单独关闭。第二次挥手时被动方可能还有数据没发完,不能把 FIN 和 ACK 合并,只能先确认,等数据发完再关自己的方向。
## 追问
### TIME_WAIT 为什么要等 2MSL?
两个原因。第一,确保最后的 ACK 能到——如果 ACK 丢了,被动方会重传 FIN,TIME_WAIT 状态的主动方可以重新回 ACK。如果主动方直接 CLOSED,收到重传的 FIN 只能回 RST,被动方会报连接异常。第二,让...计算机基础2月19日 14:42
TCP 拥塞控制的四个算法是什么?超时重传和快重传怎么区分?TCP 拥塞控制有四个算法:慢启动、拥塞避免、快重传、快恢复。核心思想是"先试探再加码"——不清楚网络能承受多少时就少发,确认没问题再加速;一旦发现拥塞就立刻降速。控制对象是 cwnd(拥塞窗口),和 rwnd 取较小值作为实际发送窗口。
## 追问
### 慢启动为什么叫"慢"?明明指数增长很快
"慢"是相对没有拥塞控制的情况——TCP 早期一上来就发满窗口,容易打爆网络。慢启动从 cwnd=1 MSS 开始,每收到一个 ACK 就 +1 MSS,一个 RTT 内翻倍(1→2→4→8→16)。看起来快,但初始只有 1 MSS,比直接发满窗口保守得多。cwnd 到达 ssthres...计算机基础2月19日 14:42
TCP 滑动窗口机制是怎么工作的?零窗口和糊涂窗口是什么?TCP 流量控制靠滑动窗口:接收方在 ACK 里通告自己还能接收多少数据(rwnd),发送方据此控制发送量,不让接收方缓冲区溢出。发送窗口 = min(rwnd, cwnd),rwnd 是接收方给的流量控制信号,cwnd 是发送方自己根据拥塞状况算的。这里只说 rwnd 的部分。
## 追问
### 零窗口是怎么回事?怎么恢复?
接收方缓冲区满了,在 ACK 里通告 rwnd=0,发送方就必须停。但接收方应用层读完数据释放缓冲区后,会发一个窗口更新报文告诉发送方可以继续了。问题在于:这个窗口更新报文丢了怎么办?发送方会一直等,死锁。解决方法是发送方启动持续计时器,定期发零窗口探测报...服务端2月17日 20:40
Python 多线程和多进程有什么区别?GIL 对多线程有什么影响?核心区别:进程是资源分配单位,有独立内存空间;线程是调度单位,共享进程内存。在 Python 里这道题的特殊之处是 GIL——全局解释器锁让同一时刻只有一个线程执行 Python 字节码,所以 CPU 密集型任务用多线程不会加速,必须用多进程。I/O 密集型任务多线程够用,因为等 I/O 时 GIL 会释放。
## 追问
### GIL 到底锁的是什么?为什么不能去掉?
GIL 保护的是 CPython 的内存管理——引用计数。CPython 的对象引用计数不是线程安全的,如果多个线程同时修改引用计数,对象可能被提前释放或泄漏。加锁是最简单的方案,代价是多线程无法真正并行。Pyth...