構造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狀態泄密的危機。