打开的套接字是否允许入站流量?

Is inbound traffic allowed on open sockets?

ISP 倾向于阻止所有入站流量。如果我在与远程服务器的初始握手后保持套接字处于活动状态,并且该协议不会对套接字可以保持打开的时间施加任何限制,该怎么办。服务器是否可以在不需要客户端先发送请求的情况下向我发送流量?我在某处读到推送服务器是如何工作的。但我很困惑这怎么可能。套接字不就是两个端点(客户端和服务器)分配的资源吗?我的 ISP 应该如何知道打开的连接的任何信息以不在中间丢弃入站流量?

ISPs tend to block all inbound traffic.

这通常不是真的。但通常情况下,NAT(网络地址转换)涉及将多个内部 IP 地址映射到单个 public 可见 IP 地址。由于 NAT 的工作方式,它将隐式阻止入站流量,因为它找不到匹配的 NAT 状态。

NAT 几乎总是在家庭路由器上完成,也可能在 ISP(CGNAT - 运营商级 NAT)上完成。

How is my ISP supposed to know anything about the opened connections to not drop inbound traffic in the middle?

ISP(如果是 CGNAT)和您的家庭路由器有一个状态 table,它将内部连接(NAT 之前)与重写的连接(NAT 之后)相匹配。如果数据来自互联网,它将尝试将这些映射到状态 table 并重写数据包。如果不存在状态,则丢弃数据包。

What if I keep the socket alive after the initial handshake with a remote server, and the protocol doesn't impose any limit on how long the socket can be kept open. Can the server send traffic towards me without needing the client to first send a request?

即使端口实际上被阻止从外部发起的连接,通常也可以从内部发起任意连接。建立这些后,就可以发回任何数据。这是通过类似于 NAT 的技术实现的,但没有实际的地址转换 - 状态防火墙。

您提到的请求和响应模式实际上更特定于 HTTP 等协议,但 SSH、WebSockets 等其他协议无论如何都不使用这种方法。

无论是使用 NAT 还是使用状态防火墙,您都必须确保统计信息不会被删除。在一些(特定于设备的)不活动超时后删除状态,一旦完成,将不会转发任何入站数据。通过发送实际应用程序数据或使用 TCP keep alive(这是没有应用程序数据的心跳)来保持状态打开。