在活动 TCP 连接中究竟是啥保持活动状态?
Posted
技术标签:
【中文标题】在活动 TCP 连接中究竟是啥保持活动状态?【英文标题】:What exactly is kept alive in Alive TCP Connection?在活动 TCP 连接中究竟是什么保持活动状态? 【发布时间】:2022-01-10 10:47:07 【问题描述】:请忍受这个问题的幼稚,因为我对网络几乎一无所知。请帮助我更清楚地理解这件事。 假设有一条河流,两端的人需要从一端到另一端来回穿梭。所以一座桥可以作为两端之间的连接,直到那时,桥是有生命的,连接被称为是有生命的,旅行是可能的。我想知道保持 TCP 连接处于活动状态是什么意思以及究竟保持活动状态是什么意思?就像河流一样,桥梁保持活力。
【问题讨论】:
【参考方案1】:与网桥相反,TCP 连接不是物理事物,而只是端点之间的逻辑关联。数据通过几个中间系统在终端之间逐跳传递。单个数据包可能会在途中丢失,甚至可能在另一端或某些中间系统崩溃,从而完全失去连接。
只要在两端之间进行定期数据交换,就可以快速检测到此类情况。如果一端发送数据,另一端必须确认这些 - 如果确认丢失,则重新传输数据包。如果重传后数据仍未得到确认,则认为连接断开。
但两端可能不会持续交换数据。如果连接是空闲的(即没有数据交换),那么就不会检测到某些东西被破坏了。 TCP keep alive 通过在空闲连接上定期交换数据包并期待确认来解决此问题。这些是没有数据负载的数据包,因为没有数据要传输。
【讨论】:
好的,我明白你的意思是通过定期发送消息来保持连接。但是在连接存在时发送数据包和建立连接之间有什么区别。毕竟建立连接还必须涉及发送数据包。是不是像,在建立连接后,确定了一个明确定义的路由,并且将在该预定义的路由上进行进一步的通信,类似这样的事情。 @GauravKandoria:“该连接通过定期发送消息来保持活动状态。” - 这不是保持连接活动,而是检查连接是否仍然活动。但是,将状态保持在中间状态防火墙或 NAT 中是一种预期的副作用。建立新的联系就像建造一座新桥,而不是再次重建完全相同的桥。在旧桥上等待的汽车不会自动使用新桥,因为它从不同的本地港口开始。【参考方案2】:在这两个端点中,一些数据(或状态变量)需要与执行 TCP 协议所需的每个连接相关联。例如,发送方需要记住序列号,维护所有已发送/但未确认的数据包的副本。接收器也需要跟踪序列号,存储乱序数据包的副本,并从接收到的数据包中重建原始流。这些状态数据结构在连接建立时创建(即分配内存),并在连接终止时(例如在交换 FIN 之后)销毁(释放内存)。此状态与每个打开的 TCP 套接字有关。一个好的做法是不要在不交换数据的情况下永远打开连接(例如,如果通信伙伴之一崩溃,它将无法正确终止连接),因此如果连接长时间空闲(这我不知道确切)套接字关闭是合理的。这个概念被称为“软状态”,这基本上意味着每个状态(内存)都有一个过期不活动时间,直到它被删除。如果套接字关闭,那么当必须发送新数据时,必须建立新连接。是的,它确实涉及发送数据包,但是在发送第一个数据之前,它会为一个 RTT 发送没有任何负载的 TCP 数据包的开销。
理论上,TCP 连接只存在于连接的端点上。然而在实际应用中,也有很多种所谓的“中间盒”,它是网络设备的总称,不是路由器也不是交换机。这些中间盒有时还需要维护与每个 TCP 连接相关的状态,因此这些 keepalive 也会刷新这些中间盒上的状态。
但在这两种情况下,这些 keepalive 基本上都会告诉重置与此连接的状态相关联的不活动计时器。
【讨论】:
以上是关于在活动 TCP 连接中究竟是啥保持活动状态?的主要内容,如果未能解决你的问题,请参考以下文章