构造TCP ISN生成器的一些更直接的方法是:简单地选取一些随机数作为ISN。这就是给定一个32位的空间,指定 ISN = R(t)。(假设R()是完全的非伪随机数生成函数)
固然,对于完全随机的ISN值,攻击者猜测到的可能性是1/232是,随之带来的一个问题是ISN空间里面的值的互相重复。这违反了许多RFC(RFC 793, RFC 1185, RFC 1323, RFC1948等)的假设----ISN单调增加。这将对TCP协议的稳定性和可靠性带来不可预计的问题。
其它一些由Niels Provos(来自OpenBSD 组织)结合完全随机方法和RFC 1948
解决方案:
ISN = ((PRNG(t)) << 16) + R(t) 32位
其中
PRNG(t) :一组随机指定的连续的16位数字 0x00000000 -- 0xffff0000
R(t) :16位随机数生成器(它的高位msb设成0)0x00000000 -- 0x0000ffff
上面的公式被用于设计OpenBsd的ISN生成器,相关的源代码可以从下面的网址获得
http://www.openbsd.org/cgi-bin/cvsweb/src/sys/netinet/tcp_subr.c
Provos的实现方法有效地生成了一组在给定时间内的不会重复的ISN的值,每两个ISN值都至少相差32K,这不但避免了随机方法造成的ISN的值的冲突,而且避免了因为哈希函数计算带来的性能上的下降,但是,它太依赖于系统时钟,一旦系统时钟状态给攻击者知道了,就存在着系统的全局ISN状态泄密的危机。