Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在知识产权层面,是否;保持连接处于打开状态”;具有特定的技术含义-例如存储IP映射条目的中间网关? 我是C++中有经验的套接字级程序员,但我不理解当“强”>套接字连接被打开\ 时(在代码中,通过在套接字上调用关闭< /代码>函数)关闭IP网络级别会发生什么。_Sockets_Networking_Network Programming - Fatal编程技术网

Sockets 在知识产权层面,是否;保持连接处于打开状态”;具有特定的技术含义-例如存储IP映射条目的中间网关? 我是C++中有经验的套接字级程序员,但我不理解当“强”>套接字连接被打开\ 时(在代码中,通过在套接字上调用关闭< /代码>函数)关闭IP网络级别会发生什么。

Sockets 在知识产权层面,是否;保持连接处于打开状态”;具有特定的技术含义-例如存储IP映射条目的中间网关? 我是C++中有经验的套接字级程序员,但我不理解当“强”>套接字连接被打开\ 时(在代码中,通过在套接字上调用关闭< /代码>函数)关闭IP网络级别会发生什么。,sockets,networking,network-programming,Sockets,Networking,Network Programming,我研究了IP报头,并试图了解保持套接字打开是否会在IP级别产生任何影响 在TCP级别,保持套接字打开对我来说是有意义的,因为这可能意味着TCP头中的“序列号”字段将继续递增。然而,这将是一个纯粹基于端点的实现,因此无法减少TCP数据包的传输时间。我的理解是,保持连接打开通常意味着数据包在互联网端点之间的传输时间缩短 问题是,让套接字连接保持打开状态在IP级别是否意味着什么 我最好的猜测是,如果套接字连接保持打开状态,则沿完整IP网络路径的中间网关将尝试在其映射表中留下一个条目,以便可以立即执行下

我研究了IP报头,并试图了解保持套接字打开是否会在IP级别产生任何影响

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

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

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

(也许也可以通过这种方式避免DNS查找的开销。)

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

直接回答:否

您的问题表明您不完全理解TCP的用途,即在两台主机之间建立数据流。记住,保持连接打开的目的应该是显而易见的:如果关闭连接,流将结束

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

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


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

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

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

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

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

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


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

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

我注意到有一个“接近投票”。然而,我浏览了所有StackExchange网站,没有“联网”网站。有没有推荐另一个更合适的StackExchange站点?我知道TCP完全是在端点实现的(不是沿着网络),TCP实现全双工通信。然而,我的感觉是,“保持连接打开”也意味着IP级别的事情,而不是TCP级别的事情,这将涉及网络上的中间节点。然而,我可能错了。在IP级别,只有数据包。持久“连接”的概念仅由TCP引入。事实上,“连接”只对应于TCP。(其中
close()
仅在TCP情况下执行断开连接)。因此,
connect()
在UDP和原始IP的API中有点用词不当。也许我对连接/断开TCP连接的开销有错误的认识。在更高的层次上,HTTP“保持活动”可能会对性能产生真正的影响,但如果HTTP的开销仅在端点,它会改变我对开销所在位置的看法。这意味着什么