我是C ++中经验丰富的套接字程序员,但我不明白当套接字连接打开时
我研究了IP标头,并尝试了解是否保持套接字打开对IP级别有任何影响。
在TCP级别,保持套接字打开对我来说是有意义的,因为这可能意味着TCP标头中的“序列号”字段继续递增。但是,这将是纯粹基于端点的实现,因此无法减少TCP数据包的传输时间。我的理解是保持连接打开通常意味着数据包减少了互联网端点之间的传输时间。
问题是,它是否意味着在IP级别上保持套接字连接打开?
我最好的猜测是,如果套接字连接保持打开状态,沿着整个IP网络路径的中间网关将尝试在其映射表中留下一个条目,以便下一跳可以立即执行,而无需执行广播到所有连接的网关,以确定下一跳。
(也许以这种方式避免了DNS查询的开销。)
我是否正确地猜测“保持连接打开”对应于中间IP网关上保留的地图条目(加速数据包传输)?
答案 0 :(得分:4)
直接回答:否。
您的问题表明您并未完全理解TCP的用途,即在两台主机之间建立数据流。记住这一点,保持连接打开的目的应该是显而易见的:如果你关闭连接,流将结束。
在IP级别上看不到TCP连接的状态;它只与TCP相关。除NAT网关外,中间主机通常不会跟踪通过它们的TCP连接的状态。 (在许多情况下,他们不可能这样做 - 大型路由器通过它们的连接数量远远超过它们可能跟踪的数量。)
我最好的猜测是,如果套接字连接保持打开状态,沿着整个IP网络路径的中间网关将尝试在其映射表中留下一个条目,以便下一跳可以立即执行,而无需执行广播到所有连接的网关,以确定下一跳。
这个猜测是不正确的。路由器将根据其保留在内部的一组路由表,使用某种算法根据目标IP选择路由。阅读BGP,了解有关如何在大型路由器上确定此问题的详细信息;在较小的路由器上,路由表通常由管理员定义。
答案 1 :(得分:1)
首先,让我们澄清一个误解:
沿着完整IP网络路径的中间网关将尝试在其映射表中留下条目,以便可以立即执行下一跳,而无需对所有连接的网关进行广播以确定下一跳。
路由器永远不会“广播到所有连接的网关”以确定下一跳。如果数据包到达并且路由器还不知道如何路由它,则只丢弃数据包(可能将ICMP错误消息发送回源)。在路由器上运行的路由协议的工作是使用从对等方获知的路由预填充路由器的路由表,以便它们准备接收数据包并路由它们。
此外,“完整的IP网络路径”没有明确定义。当网络上的链路出现故障或新链路可用时,网络路径可随时更改。由于负载平衡,在没有路由更改的情况下,它甚至可以从一个数据包更改为下一个数据包。
回到你的问题:不,套接字是否关闭对IP没有影响。在每个数据包都是独立的并且独立路由的意义上,IP是无状态的。
套接字是否已关闭 会对TCP产生影响,但是,正如您所注意到的那样,它只涉及连接端点上的两个节点。
答案 2 :(得分:1)
“保持连接打开”对速度的影响是,在TCP中建立连接需要往返。但更重要的是,对于在TCP上运行的大多数协议,连接也具有语义含义。在同一连接上发送的两位数据与不同连接上发送的两位数据不相关。