题目
初始序列号是固定的吗,为什么
答案
**三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据**。 **ISN 不是固定的,而是动态生成的**,这么做主要是**防止重放攻击**: 如果每次连接时使用的随机 ISN 都是一样的,那么如果历史报文被攻击者截获并存储,当下一个使用相同四元组(源 IP,目的 IP,源端口,目的端口)的连接建立时,攻击者就可以伪造 IP 地址和端口号,并使用之前记录的序列号和确认号等信息来发送 TCP数据包,从而让接收方误以为这是合法的数据包,导致数据包被重复传输,这就是重放攻击。 简单来说就是,当使用相同的 ISN 时,由于 ISN 作为初始化序列号,如果历史连接的初始序列号与新连接的初始序列号相同,则新连接接收的报文序列号可能与历史连接接收的报文序列号重叠,导致数据混乱。 > 举个例子,如下图所示,假设主机 A 向主机 B 发送了一个 ISN 为 100 的数据包 1,但由于网络原因,该数据包丢失了。后来,主机 A 再次向主机 B 发送了一个 ISN 为 100 的数据包 2,此时,如果之前的数据包 1 还在网络中存在,那么就可能被错误地传递给主机 B,导致数据混乱。因此,为了避免这种情况发生,每次建立连接时应该使用随机的 ISN。 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324223325693.png) 因此,使用随机的 ISN 可以使每个连接的初始序列号都是随机的,从而降低了攻击者进行重放攻击的可能性。