保持活动状态并请求超时

Poo*_*ven 1 c# asp.net tcp keep-alive

据我了解,该keep-alive消息旨在防止底层 TCP 连接关闭,以便可以通过同一 TCP 连接发送多个请求。

然而,尚不清楚这如何影响已超时的请求:

  • 如果通过同一个 TCP 连接处理多个请求,当客户端超时时,ASP.NET 如何知道?我不确定如何正确地提出这个问题,但我怀疑HttpWorkerRequest.IsClientConnected如果底层 TCP 连接关闭,这是错误的?如何判断客户端是否超时?肯定不能再发送响应了吗?
  • 既然客户端可以发送keep-alive消息,那么它对请求有什么影响(如果有的话)?我预计它不会产生任何影响,并且超时等机制将照常工作。

感谢您的时间和帮助。

Ste*_*ich 5

HTTP keep-alive(不应与 TCP keep-alive 混淆)要求服务器在 HTTP 响应完全发送后不要关闭连接。因此,HTTP 保持活动状态仅与发送 HTTP 响应之后和接收下一个 HTTP 请求之前的时间相关。

...当客户端超时时,ASP.NET 如何知道?

服务器正在尝试读取数据。如果客户端关闭连接,服务器将收到通知(例如读取 0 字节),并且也会关闭连接。

...肯定不能再发送响应了吗?

重复一遍,HTTP 保持活动状态仅在发送完整响应后才相关。所以这个问题与HTTP keep-alive无关。

既然客户端可以发送保持活动消息,那么它对请求有什么影响(如果有的话)?

对当前请求没有影响。但客户端必须意识到,服务器可能会在发送 HTTP 响应之后、服务器收到新请求之前随时关闭连接。因此,服务器可能会在客户端尝试发送新请求的同时关闭连接。在这种情况下,客户端必须在新连接中重试幂等请求 (GET),而其他请求将失败。

  • @Pooven:是的,你正在混合 HTTP 和 TCP keep-alive。HTTP keep-alive 仅在 HTTP 标头内发送,它是客户端向服务器发出的请求,请不要在响应完成后关闭连接。TCP 保持活动状态用于确保空闲连接(即无数据流)不会因防火墙等超时而关闭,并且端点将检测由于路由器损坏、服务器关闭等原因导致的连接丢失。 TCP keepalive 可以用于任何类型的 TCP 连接,而不仅仅是 HTTP。 (2认同)