TCP初始序列号(ISN)的取值经历了从简单到安全的演变,现代实现注重不可预测性和唯一性,以防止网络攻击并确保连接可靠性。以下是关键点:
1. 早期实现(存在安全隐患)
- 简单计数器:系统启动后以固定步长递增(如每4微秒+1),容易被预测。
- 时钟驱动:基于系统时间生成(如毫秒级时钟),但若攻击者知晓系统运行时间,可能推算ISN。
2. 现代安全实现
为应对TCP序列号预测攻击(伪造RST包或劫持连接),ISN生成需满足:
- 不可预测性:攻击者无法通过历史ISN推测后续值。
- 唯一性:避免短时间内同一连接的ISN重复(防止旧报文干扰新连接)。
常见方法:
-
加密哈希算法(RFC 6528):
- 结合密钥、时间戳、四元组(源/目的IP和端口)生成哈希值。
- 示例:
ISN = HMAC-SHA256(密钥, 时间戳 || 源IP || 目的IP || 源端口 || 目的端口)
- 即使部分信息泄露,无密钥仍无法预测ISN。
-
伪随机数生成器(PRNG):
- 使用安全熵源(如硬件随机数生成器)初始化种子。
- 定期更新种子,确保随机性。
-
时间戳 + 随机偏移:
- 基于系统时间(如微秒级)叠加随机数,平衡唯一性和随机性。
- 例如:
ISN = (时间戳 << 24) + (随机数 & 0xFFFFFF)
。
3. 操作系统实践
- Linux:采用
RFC 1948
建议,结合加密哈希和随机数,通过/proc/sys/net/ipv4/tcp_timestamps
控制时间戳选项(增强唯一性)。 - Windows:使用复合算法,包含系统启动时间、随机池和哈希函数(如
CNG
加密库)。 - FreeBSD:基于
Fortuna
伪随机数算法,结合网络接口的熵源。
4. 关键考虑因素
- 性能:算法需高效,避免影响连接建立速度。
- 全局唯一性:同一主机上不同连接的ISN应尽量不同。
- 抗重放攻击:确保ISN不重复周期足够长(32位序列号约4.5小时回绕)。
总结
现代ISN生成综合了加密技术、时间戳和高质量随机数,以平衡安全性与效率。其核心目标是阻止攻击者预测序列号,同时保证连接的可靠性和唯一性。