区块链技术博客
www.b2bchain.cn

Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题求职学习资料

本文介绍了Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

    • 1. 什么是TIME_WAIT状态?
    • 2. 为什么需要TIME_WAIT状态?
      • ①可靠地实现TCP全双工连接的终止
      • ②允许老的重复分节在网络中消逝
      • 保活计时器的引入

1. 什么是TIME_WAIT状态?

Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题

在TCP连接中四次挥手关闭连接时,主动关闭连接的一方(上图中时Client)会在发送最后一条ACK报文后维持一段时长2MSL(MSL指数据包在网络中的最大生存时间)的等待时间后才会真正关闭连接,切换到CLOSED状态,该时间段内主动关闭方的状态为TIME_WAIT。在TIME_WAIT状态时,定义这个连接的四元组(源/目的IP、源/目的端口)不能被使用。

注1:唯一连接确认方式为四元组:源IP地址、目的IP地址、源端口、目的端口。也有一种说法叫五元组:即多包含一个协议。

注2:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。

2. 为什么需要TIME_WAIT状态?

这个问题另一种问法就是:time_wait状态的作用。

①可靠地实现TCP全双工连接的终止

  • 第一个理由可以通过查看TCP的分组交换图,我们假设最终的ACK丢失了,服务器将重新发送它的最终那个FIN,**因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应以一个RST(另外一种类型的TCP分节),该分节将被服务器解释成一个错误。
  • 当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并持续两倍于最大生存期的时间。这样就能够让TCP重新发送最终的ACK以避免出现丢失的情况。重新发送最终的ACK并不是因为TCP重传了ACK(它们并不消耗序列号,也不会被TCP重传),而是因为通信另一方重传了它的FIN(它消耗一个序列号)。事实上,TCP总是重传FIN,直到它收到一个最终的ACK
  • 如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端:因为可能不得不重传最终那个ACK的就是那一端

②允许老的重复分节在网络中消逝

  • 为理解存在TIME_WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和 206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现, 从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃
  • 通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了
  • 当TCP处于等待状态时,通信双方将该连接(客户端IP地址、客户端端口号、服务器IP地址、服务器端口号)定义为不可重新使用。只有当2MSL等待结束时,或一条新连接使用的初始序列号超过了连接之前的实例所使用的最高序列号时,或者允许使用时间戳选项来区分之前连接实例的报文段以避免混淆时,这条连接才能被再次使用。不幸的是,一些实现施加了更加严格的约束。在这些系统中,如果一个端口号被处于2MSL等待状态的任何通信端所用,那么该端口号将不能被再次使用。

保活计时器的引入

  尽管维护了TIME_WAIT状态,双方也并非一定能正确关闭连接,

  情况一:若被动关闭连接的一方没有收到对方的最后一条ACK,而重发FIN+ACK,而FIN+ACK也丢失了,并且在TIME_WAIT等待时间内,一直丢包,导致等待时间过后一方关闭连接,而被动关闭的一方因始终没有收到最后一个ACK而无法关闭连接。

    • 1. 什么是TIME_WAIT状态?
    • 2. 为什么需要TIME_WAIT状态?
      • ①可靠地实现TCP全双工连接的终止
      • ②允许老的重复分节在网络中消逝
      • 保活计时器的引入

1. 什么是TIME_WAIT状态?

Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题

在TCP连接中四次挥手关闭连接时,主动关闭连接的一方(上图中时Client)会在发送最后一条ACK报文后维持一段时长2MSL(MSL指数据包在网络中的最大生存时间)的等待时间后才会真正关闭连接,切换到CLOSED状态,该时间段内主动关闭方的状态为TIME_WAIT。在TIME_WAIT状态时,定义这个连接的四元组(源/目的IP、源/目的端口)不能被使用。

注1:唯一连接确认方式为四元组:源IP地址、目的IP地址、源端口、目的端口。也有一种说法叫五元组:即多包含一个协议。

注2:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。

2. 为什么需要TIME_WAIT状态?

这个问题另一种问法就是:time_wait状态的作用。

①可靠地实现TCP全双工连接的终止

  • 第一个理由可以通过查看TCP的分组交换图,我们假设最终的ACK丢失了,服务器将重新发送它的最终那个FIN,**因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应以一个RST(另外一种类型的TCP分节),该分节将被服务器解释成一个错误。
  • 当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并持续两倍于最大生存期的时间。这样就能够让TCP重新发送最终的ACK以避免出现丢失的情况。重新发送最终的ACK并不是因为TCP重传了ACK(它们并不消耗序列号,也不会被TCP重传),而是因为通信另一方重传了它的FIN(它消耗一个序列号)。事实上,TCP总是重传FIN,直到它收到一个最终的ACK
  • 如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端:因为可能不得不重传最终那个ACK的就是那一端

②允许老的重复分节在网络中消逝

  • 为理解存在TIME_WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和 206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现, 从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃
  • 通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了
  • 当TCP处于等待状态时,通信双方将该连接(客户端IP地址、客户端端口号、服务器IP地址、服务器端口号)定义为不可重新使用。只有当2MSL等待结束时,或一条新连接使用的初始序列号超过了连接之前的实例所使用的最高序列号时,或者允许使用时间戳选项来区分之前连接实例的报文段以避免混淆时,这条连接才能被再次使用。不幸的是,一些实现施加了更加严格的约束。在这些系统中,如果一个端口号被处于2MSL等待状态的任何通信端所用,那么该端口号将不能被再次使用。

保活计时器的引入

  尽管维护了TIME_WAIT状态,双方也并非一定能正确关闭连接,

  情况一:若被动关闭连接的一方没有收到对方的最后一条ACK,而重发FIN+ACK,而FIN+ACK也丢失了,并且在TIME_WAIT等待时间内,一直丢包,导致等待时间过后一方关闭连接,而被动关闭的一方因始终没有收到最后一个ACK而无法关闭连接。

    • 1. 什么是TIME_WAIT状态?
    • 2. 为什么需要TIME_WAIT状态?
      • ①可靠地实现TCP全双工连接的终止
      • ②允许老的重复分节在网络中消逝
      • 保活计时器的引入

1. 什么是TIME_WAIT状态?

Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题

在TCP连接中四次挥手关闭连接时,主动关闭连接的一方(上图中时Client)会在发送最后一条ACK报文后维持一段时长2MSL(MSL指数据包在网络中的最大生存时间)的等待时间后才会真正关闭连接,切换到CLOSED状态,该时间段内主动关闭方的状态为TIME_WAIT。在TIME_WAIT状态时,定义这个连接的四元组(源/目的IP、源/目的端口)不能被使用。

注1:唯一连接确认方式为四元组:源IP地址、目的IP地址、源端口、目的端口。也有一种说法叫五元组:即多包含一个协议。

注2:MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。

2. 为什么需要TIME_WAIT状态?

这个问题另一种问法就是:time_wait状态的作用。

①可靠地实现TCP全双工连接的终止

  • 第一个理由可以通过查看TCP的分组交换图,我们假设最终的ACK丢失了,服务器将重新发送它的最终那个FIN,**因此客户必须维护状态信息,以允许它重新发送最终那个ACK。要是客户不维护状态信息,它将响应以一个RST(另外一种类型的TCP分节),该分节将被服务器解释成一个错误。
  • 当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并持续两倍于最大生存期的时间。这样就能够让TCP重新发送最终的ACK以避免出现丢失的情况。重新发送最终的ACK并不是因为TCP重传了ACK(它们并不消耗序列号,也不会被TCP重传),而是因为通信另一方重传了它的FIN(它消耗一个序列号)。事实上,TCP总是重传FIN,直到它收到一个最终的ACK
  • 如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流(即全双工关闭),那么它必须正确处理连接终止序列4个分节中任何一个分节丢失的情况。本例子也说明了为什么执行主动关闭的那一端是处于TIME_WAIT状态的那一端:因为可能不得不重传最终那个ACK的就是那一端

②允许老的重复分节在网络中消逝

  • 为理解存在TIME_WAIT状态的第二个理由,我们假设在12.106.32.254的1500端口和 206.168.112.219的21端口之间有一个TCP连接。我们关闭这个连接,过一段时间后在相同的IP地址和端口之间建立另一个连接。后一个连接称为前一个连接的化身(incarnation),因为它们的IP地址和端口号都相同。TCP必须防止来自某个连接的老的重复分组在该连接已终止后再现, 从而被误解成属于同一连接的某个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的连接发起新的化身。既然TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃
  • 通过实施这个规则,我们就能保证每成功建立一个TCP连接时,来自该连接先前化身的老的重复分组都已在网络中消逝了
  • 当TCP处于等待状态时,通信双方将该连接(客户端IP地址、客户端端口号、服务器IP地址、服务器端口号)定义为不可重新使用。只有当2MSL等待结束时,或一条新连接使用的初始序列号超过了连接之前的实例所使用的最高序列号时,或者允许使用时间戳选项来区分之前连接实例的报文段以避免混淆时,这条连接才能被再次使用。不幸的是,一些实现施加了更加严格的约束。在这些系统中,如果一个端口号被处于2MSL等待状态的任何通信端所用,那么该端口号将不能被再次使用。

保活计时器的引入

  尽管维护了TIME_WAIT状态,双方也并非一定能正确关闭连接,

  情况一:若被动关闭连接的一方没有收到对方的最后一条ACK,而重发FIN+ACK,而FIN+ACK也丢失了,并且在TIME_WAIT等待时间内,一直丢包,导致等待时间过后一方关闭连接,而被动关闭的一方因始终没有收到最后一个ACK而无法关闭连接。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Linux C/C++面试之《网络编程系列》(7) time_wait状态的若干问题求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们