Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828249
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: LINUX

2014-05-12 21:38:25


可以通过调试或者抓包看到,当TCP建立连接的时候,三次握手过程中最初的序号一般并不是我们认为的从1开始的序号。

一般都是一个比较大的数字,eg .1415531521。为什么会出现这么大的数字?

其实序号是一个不断循环的数字,它有自己的算法控制。一般会有每隔半秒增加64000,并每隔9.5小时又回到0。而且一般新增一个连接的时候序号还另外会加上64000.

这样选择序号的好处是在于防止网络中被延迟的分组在以后又被传送,而导致连接的一方对它做出错误的解释。

比如当一个分组在网络中被延迟了,并且这个连接有可能也被断开了,而当连接的一方收到这个延迟的分组的时候,可能这时已经有新的连接在通信了,这个时候如果该分组序号恰好满足新连接的序号则会把它当作新连接中的一个分组进行解析,这样就会导致一些未知的错误。

在linux中一般是采用RFC 1948来进行序号的生成的,主要的算法公式是:

ISN = M + F(sip, sport, dip, dport, )
  其中
   ISN 32位的初始序列号
   M 单调增加的计数器
   F 单向散列哈希函数 (例如 MD4 or MD5)
   sip 源IP地址
   sport 源端口
   dip 目的IP地址
   dport 目的端口
   哈希函数可选部分,使远程攻击者更难猜到ISN.
它每5分钟计算一次值,把泄漏的风险降到了最低。
还有一种加强的:
取M = M + R(t)
   ISN = M + F(sip, sport, dip, dport, )
   其中
   R(t) 是一个关于时间的随机函数

阅读(2041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~