Web 服务器如何知道连接何时断开?

How does a web server know when a connection is dropped?

我无法将这三个事实(??)归为一类:

  1. 了解连接是否断开的唯一方法是通过它发送数据是否失败

  2. 知道发送数据是否失败的唯一方法是您没有收到确认

  3. 服务器发送的事件没有确认。他们是单向推

那么,服务器如何知道连接是否断开?

如果我导航到一个网站并启动 WebSocket/SSE 连接(永久数据流),如果我随后很快离开该页面,服务器如何知道连接是否断开?

这些技术是否 对发送的每条消息都有确认,但用户无法访问?

如果是这样,那为什么不呢?在服务器代码中知道消息是否已成功发送不是很有用吗?

但是如果根本没有确认,服务器怎么知道连接是否断开?

很简单,当它不再收到来自客户端的任何消息时。例如,如果服务器在确定的时间内没有收到数据包,则会发生超时事件,使 Web 服务器关闭 connection/socket。 connection-oriented protocols就是这样,比如TCP.

其他的协议,比如UDP,是connectionless,也就是说它们没有确认事件。数据包发送出去,客户端不关心服务端是否收到。

回答您的以下问题:

If I navigate to a website and initiate a WebSocket / SSE connection (a permanent data-stream), how does the server know if the connection is ever dropped if I then leave the page shortly afterwards?

当您离开网站时,客户端(您的浏览器)很可能会开始一个 connection-termination 阶段,它将向服务器发送一些数据包,服务器将通过关闭连接。

Is it the case that these technologies do have an acknowledgement for each message sent, except it's not user-accessible?

查看之前的回答。 HTTP,最流行的 Web 协议确实有确认数据包,用于启动连接和终止连接(同时确保 server/client 获得数据)。

If that is the case, then why not? Couldn't it be useful in server-code to know if a message was successfully sent?

只要是connection-based协议,服务器就知道消息是否发送成功。

But if there's no acknowledgement at all, how can a server ever know if a connection is dropped?

如果没有使用确认,则没有建立连接。它是一种无连接协议(例如 UDP)。在这种情况下,服务器将接收(或不接收)消息并在不建立连接的情况下发送数据。发送数据后,套接字将立即关闭。

最后,你好像把事实搞混了。这完全取决于所使用的协议。一些建立连接,要求 client/server 显式终止连接,否则会超时。其他人只会发送数据并希望得到响应。