在客户端和服务器之间的常规请求/响应中,首先是客户端向服务器发起请求,然后是服务器响应。假设服务器始终知道其客户端的 IP 地址(注意客户端具有动态 IP 地址)。服务器是否可以先发起请求?“首先发起请求”是指服务器必须能够随时向客户端发送数据。谢谢
无需请求即可向客户端发送数据
假设您想在 Internet 上的两个设备之间传输数据(可靠)。所以很有可能必须使用 TCP。我有一个具有静态 IP 地址的设备和许多没有静态 IP 地址的分布式(都连接到 Internet,不在同一个 LAN 中)设备。所有分布式设备都有中心设备的IP地址,因此它们可以向中心设备发起请求。我希望中央设备随时向分布式设备发送数据。谢谢
要建立 TCP 连接,一端(“服务器”)侦听,另一端(“客户端”)连接到它。
一旦建立 TCP 连接,任何一端都可以随时向另一端发送数据。
然而,在实践中,您的客户端可能位于防火墙或 NAT 之后,这增加了一些复杂性。
您的服务器不太可能启动与客户端上的侦听器的连接。有时可以使用一些技巧,但它们并不总是有效。
如果 TCP 连接空闲时间过长,则防火墙/NAT 可能会将其切断。
某些网络故障可能导致连接被切断,而端点并未意识到它已被切断。
结果是,如果你在任意网络上部署客户端并且你需要服务器(我们假设它在公共互联网上有一个 IP)能够向他们发送消息,客户端需要建立一个到服务器的永久 TCP 连接和他们需要定期向服务器发送测试/保持连接消息。如果他们没有得到对他们的测试/保持连接消息的回复,那么他们需要拆除 TCP 连接并尝试建立一个新的连接。
正如 Gerben 在评论中提到的,在 IP 协议中没有服务器或客户端。如果您知道客户端的 IP 和端口,则可以发送数据。
但是,客户端必须侦听某个端口,否则系统不知道数据要发送给哪个应用程序,它只会丢弃它们。
所以你的问题是否可以由服务器发起数据传输的答案是肯定的和否定的。是的,这是可能的,但是您的客户端必须先侦听某个端口,因此您需要在发送数据之前运行客户端。
编辑:这是假设您的客户端具有公共 IP 或与服务器在同一网络上。如果他们使用NAT,那么它会更复杂。
假设您在谈论 TCP/UDP,如果您知道两个连接端点(IP 和端口),您就可以对节点做任何想做的事情。但是请记住,要连接到主机,它必须等待连接(另一台主机必须在特定端口上侦听,因此它也有点像服务器)。
关于您所说的持久连接(keep-alive),它是一种接收多个 HTTP 请求和响应的 HTTP 方法,因此这不是您要寻找的。无论如何,这是一个第 4 层协议,我认为不应该在这里讨论。