sockets - 在IP层面, "leave the connection open"是否具有特定的技术含义——例如存储IP映射条目的中间网关?

标签 sockets networking network-programming

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

我研究了 IP header ,并试图了解让套接字保持打开状态是否会对 IP 级别产生任何影响。

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

问题是,在 IP 级别上保持套接字连接打开意味着什么吗?

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

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

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

最佳答案

直接回答:不会。

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

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

The best guess I have is that if a socket connection remains open, that intervening gateways along the complete IP network path will attempt to leave an entry in their mapping table so that the next hop can be executed immediately, without needing to do a broadcast to all connected gateways in order to determine the next hop.

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

关于sockets - 在IP层面, "leave the connection open"是否具有特定的技术含义——例如存储IP映射条目的中间网关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15457585/

相关文章:

c - 为什么我的原始套接字没有被创建?

network-programming - 将 SO_REUSEPORT 与 Phoenix 一起使用

java - 为什么我的 boolean 值没有被改变?

node.js - nodejs 无法使用 SSL

java - 通过Socket传输大数据

networking - netstat -na : udp and state established?

networking - 从本地开发到 dockerized 微服务

Java 网络代码在对象接收之前执行

c - 如何使用Telnet 来测试我的socket 程序?

Python网络编程项目源码