区分不同的连接(包括一些历史连接)、确保数据的顺序性、防止重放攻击(时间戳)
初始化序列号 ISN = M + F(localhost, localport, remotehost, remoteport)。
- M是一个32位的计时器,这个计时器每隔 4 微秒加1,循环一次4.55小时
- F 是一个 Hash 算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值,要保证 hash 算法不能被外部轻易推算得出。
这样的算法会让初始化序列号以增长的方式生成,即使这样,当序列号快速回绕,仍然有可能出现问题
为了解决这个问题,就需要TCP时间戳,tcp_timestamps默认开启,开启后,TCP头部就会使用时间戳,便于精确计算RTT并防止序列号回绕
防回绕序列号算法要求连接双方维护最近一次收到的数据包的时间戳(Recent TSval),每收到一个新数据包都会读取数据包中的时间戳值跟 Recent TSval 值做比较,如果发现收到的数据包中时间戳不是递增的,则表示该数据包是过期的,就会直接丢弃这个数据包