TCP是一个面向连接的协议。无论哪一方想另一方发送数据之前,都必须现在双方之间建立一条连接。这种两端间连接的建立与无连接协议如UDP不同。一端使用UDP想另一端发送数据报时,无需任何预先的握手。
连接建立与终止的时间系列
发送第一个SYN的一端将执行主动打开(active open)。接收这个SYN并发回下个一SYN的另一端执行被动打开(passive open)
建立一个连接需要三次握手,而终止一个连接要经过四次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接时全双工,因此每个方向必须单独的进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。
收到一个FIN只意味着在这一方向上没有数据流动,一个TCP连接在收到一个FIN后任能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的TCP应用程序这样做。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。通常一方完成主动关闭而另一方完成被动关闭。
发送FIN将导致应用程序关闭它们的连接,这些FIN的ACK是由TCP软件自动产生的。
当一端为建立连接发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。RFC 793 【Postel 1981c】指出ISN可看作时一个32比特的计数器,每4ms加1.这样选择序号的目的在于防止网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它作错误的解释。
初始化序列号(ISN),在开机的时候,它就有一个函数,每个操作系统不一样,来不断的增加初始序列号的值。因为它的最大值为2的32次方,所以当达到最大值后,会又从0开始计数。
当在T1时间客户端要向服务器建立TCP,发送三次握手,就需要发一个SYN包。这时客户端就会截取T1时间的ISN作为SYN包的序列号,当服务器收到SYN包,在T2时间要回送SYN,ACK的时候,它就会截取T2时间的ISN作为SYN的序列号。ACK序列号为T1时间的ISN+1.
ASA的一个功能,随机初始化序列号扰乱。为什么需要扰乱初始化序列号,
1.一台PC它的ISN有自己的增长规律,如果它在ASA里面,有些攻击者他会不断的去连接PC,PC这时候就会不断的回复SYN,ACK。攻击者就能得到不同节点时间段的ISN,然后用这些不同时间段的ISN来计算出PC的ISN增长规律,通过判断ISN增长规律,攻击者就有可能判断出你的操作系统。
2.一台PC和某个主机已经建立了TCP连接,攻击者想做一个会话劫持,它需要伪装PC的IP地址、端口号、协议号。这些伪装了还是不行,还得知道你的序列号在什么范围。所以攻击者这时候也会通过多次探测来猜测ISN的增长规律,当得到ISN的增长规律会就会把PC干掉,攻击者自己连接到相应的主机。
所以ASA就要防止这些攻击者通过多次试探来获取PC的ISN增长规律,因为一旦PC的ISN增长规律被获取后,攻击者就可以对我的操作系统进行判断,而且还有可能造成更严重的会话劫持。所以ASA会对初始化序列号进行扰乱。
当PC在T1时刻发送SYN的时候,经过ASA,ASA会把T1时刻的ISN随机加一个数发走,在T2时刻发送SYN的时候,经过ASA,ASA又会把T2时刻的ISN随机加一个会减去一个数发走。由于ASA总是会在ISN的数上随机加上一个或者减去一个数,这样的话,攻击者在看你的ISN的时候就会觉得没有规律可寻。