问题描述:TCP是否可以选择相同的初始序列号
对这一问题,王道书的解释是主机A与主机B若采用相同的初始序号,在频繁连接断开的情况下,主机B可能在与主机A新的TCP连接中接收到旧的报文段,导致数据的接收错误,因此必须采用不同初始序号。
但是,众所周知,TCP在连接断开的时候需要进行四次挥手,其中TIME_WAIT状态等待2MSL使所有旧报文段从网络中消失,因此从这一角度来说,TCP应可以选择相同的初始序号。
但在实际应用中,依据网络状况,TCP并不能保证每次连接都能通过四次挥手来正常关闭连接,所以在这种情况下,王道的解释是对的,在不能四次挥手断开连接的时候,是有可能收到旧报文段的。
总结:TCP在应用中需采用随机初始序列号
- 可能接收到旧报文段导致数据接收错误
- 出于安全性的考虑,比如黑客攻击,使用不同的初始序列能够提高TCP的安全性
补充:
初始序列号如何设置
- RFC793 初始化序列号 ISN 随机生成算法:ISN = M + F(localhost, localport, remotehost, remoteport)。M是一个计时器,这个计时器每隔4毫秒加1。F 是一个 Hash 算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。
- MD5算法
以下内容来自:https://blog.youkuaiyun.com/qq_38988226/article/details/117417330
TCP 引入序号机制原因如下:
- 保证接收端数据有序接收;
- 可以根据序号判断是否以前接收过该数据,用于去除重复;
- 判断数据的合法性;
- 序号机制结合 ACK 可以完成数据重传。
不可以从 0 开始确定序号,原因如下:
防止黑客知道序列号后伪造数据包制造攻击;
TIME_WAIT 主要有以下两个作用:
- 可靠实现 TCP 连接关闭;
假设 TCP 四次挥手中最后一次挥手 ACK 传输失败,那么服务器端则会重传 FIN ,预留 TIME_WAIT
时间则可以保证客户端收到重传的 FIN 。
- 保证该连接的持续时间所产生的报文段都从网络中消失,不会影响到下一连接。
TIME_WAIT 长度为 2MSL 原因如下:
MSL 是一个网络层数据报能在网络中存在的最长时间,考虑到 TIME_WAIT 作用1,在最坏情况下 , 客户端最后一次挥手ACK(失败的挥手) 加上服务端重传 FIN 的时间也不会超过 2MSL,因此采用 2MSL 作为 TIME_WAIT 时间能尽量保证TCP 连接可靠关闭。