【408】关于TCP的初始序号

问题描述:TCP是否可以选择相同的初始序列号

对这一问题,王道书的解释是主机A与主机B若采用相同的初始序号,在频繁连接断开的情况下,主机B可能在与主机A新的TCP连接中接收到旧的报文段,导致数据的接收错误,因此必须采用不同初始序号。

但是,众所周知,TCP在连接断开的时候需要进行四次挥手,其中TIME_WAIT状态等待2MSL使所有旧报文段从网络中消失,因此从这一角度来说,TCP应可以选择相同的初始序号。

但在实际应用中,依据网络状况,TCP并不能保证每次连接都能通过四次挥手来正常关闭连接,所以在这种情况下,王道的解释是对的,在不能四次挥手断开连接的时候,是有可能收到旧报文段的。

总结:TCP在应用中需采用随机初始序列号

  1. 可能接收到旧报文段导致数据接收错误
  2. 出于安全性的考虑,比如黑客攻击,使用不同的初始序列能够提高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 连接可靠关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值