2

我是一位经验丰富的 C++ 套接字级程序员,但我不明白当套接字连接保持打开状态close时 IP 网络级别会发生什么(与通过从代码中调用套接字上的函数关闭)。

我研究了 IP 标头,并试图了解让套接字打开是否对 IP 级别有任何影响。

在 TCP 级别,让套接字保持打开状态对我来说是有意义的,因为这可能意味着 TCP 标头中的“序列号”字段会继续增加。然而,这将是一个纯粹基于端点的实现,因此无法减少 TCP 数据包的传输时间。据我了解,保持连接打开通常意味着数据包在互联网上的端点之间的传输时间会减少。

问题是,让套接字连接保持打开状态在 IP 级别是否意味着什么?

我的最佳猜测是,如果套接字连接保持打开状态,则沿完整 IP 网络路径的中间网关将尝试在其映射表中留下一个条目,以便可以立即执行下一跳,而无需进行广播所有连接的网关,以确定下一跳。

(也许这种方式也避免了 DNS 查找的开销。)

我是否正确猜测“保持连接打开”对应于中间 IP 网关上保留的映射条目(这会加快数据包传输)?

4

3 回答 3

4

直接回答:没有。

你的问题说明你没有完全理解 TCP 的目的,就是在两台主机之间建立数据流。记住这一点,保持连接打开的目的应该很明显:如果关闭连接,流将结束。

TCP 连接的状态在 IP 级别上是不可见的;它仅与 TCP 有关。除 NAT 网关外,中间主机通常不会跟踪通过它们的 TCP 连接的状态。(在许多情况下,他们不可能这样做——大型路由器通过它们运行的​​连接比他们可能跟踪的要多得多。)

我的最佳猜测是,如果套接字连接保持打开状态,则沿完整 IP 网络路径的中间网关将尝试在其映射表中留下一个条目,以便可以立即执行下一跳,而无需进行广播所有连接的网关,以确定下一跳。

这个猜测是不正确的。路由器将具有某种算法,用于根据目标 IP 选择路由,基于它内部保存的一组路由表。阅读BGP以了解有关如何在大型路由器上确定这一点的详细信息;在较小的路由器上,路由表通常由管理员定义。

于 2013-03-17T04:57:33.737 回答
1

首先,让我们澄清一个误解:

沿完整 IP 网络路径的中间网关将尝试在其映射表中留下一个条目,以便可以立即执行下一跳,而无需向所有连接的网关广播以确定下一跳。

路由器从不“广播到所有连接的网关”以确定下一跳。如果一个数据包到达并且路由器还不知道如何路由它,则该数据包被简单地丢弃(可能带有一个 ICMP 错误消息被发送回源)。在路由器上运行的路由协议的工作是使用从对等方学习到的路由预先填充路由器的路由表,以便它们准备好接收数据包并路由它们。

此外,“完整的 IP 网络路径”也没有明确定义。当网络上的链接出现故障或新链接可用时,网络路径可以随时更改。由于负载平衡,它甚至可以在没有路由更改的情况下从一个数据包更改为下一个数据包。

回到你的问题:不,套接字是否关闭对 IP 没有影响。IP 是无状态的,因为每个数据包都是自包含和独立路由的。

套接字是否关闭确实会对 TCP 产生影响,但是,正如您所注意到的,这仅涉及连接端点处的两个节点。

于 2013-03-17T04:59:36.737 回答
1

“保持连接打开”对速度的影响是,在 TCP 中建立连接需要往返。但更重要的是,连接对大多数运行在 TCP 上的协议也具有语义意义。在同一连接上发送的两位数据相关,而在不同连接上发送的两位数据则不相关。

于 2013-03-17T05:02:08.900 回答