【问题标题】:What is a connection timeout during a http request什么是 http 请求期间的连接超时
【发布时间】:2018-04-07 06:45:33
【问题描述】:

我找到了关于“连接超时”的两种解释:

  1. 当客户端在 [timeout] 秒内没有向服务器发送任何字节时,服务器将关闭套接字连接。它似乎与 HTTP 标头 (Connection: keep-alive) 有某种关系。

  2. 如果在此期间未建立套接字连接,则客户端会在 [timeout] 秒后停止尝试连接服务器。

所以我对定义感到困惑。什么是连接超时?客户端连接超时和服务器端连接超时有什么区别?

TimeToLive、连接超时和请求超时有什么区别?

【问题讨论】:

    标签: http timeout connection-timeout


    【解决方案1】:

    我会尽量非正式地回答。

    连接超时 - 是必须在客户端和服务器之间建立连接的时间段。假设您将浏览器(客户端)导航到某个网站(服务器)。发生的情况是您的浏览器开始侦听来自该服务器的响应消息,但由于各种原因(例如服务器离线),该响应可能永远不会到达。因此,如果 X 秒后仍然没有来自服务器的响应,您的浏览器将“放弃”等待,否则它可能会一直等待。

    请求超时 - 就像之前客户端不愿意等待服务器响应太久的情况一样,服务器也不愿意让未使用的连接保持活动太长时间。一旦建立了服务器和客户端之间的连接,客户端必须通过向该服务器发送信息来定期通知服务器它仍然存在。如果客户端未能在指定时间内向服务器发送任何信息,服务器会简单地断开此连接,因为它认为客户端不再与它通信(为什么会毫无意义地浪费资源)。

    生存时间 (TTL) - 是在创建数据包时设置的数据包内部指定的值(通常为 255),它表明数据包在网络。当此数据包通过网络时,它会到达位于数据包起点和终点之间路径上的路由器。每次路由器重新发送数据包时,它也会将其 TTL 值减 1,如果该值下降到 0,路由器不会重新发送数据包,而是简单地丢弃它,因为数据包不应该再存在了。这种机制用于防止网络被数据泛滥,因为每个数据包只能在其中存在有限的“时间”。

    【讨论】:

    • 感谢您的友好回答。我还有一个问题。 'Connection: keep-alive' 的 http 标头对连接超时和请求超时有何影响?
    • 保持活动连接允许通信方(客户端和服务器)使用相同的 TCP 连接发送和接收多个 HTTP 请求和响应。否则,每次发送新的 HTTP 消息时都会丢弃连接并创建新的连接。这可以提高性能,因为它避免了每次都建立 TCP 的三次握手(以及它的慢启动机制)。您可以指定 timeout 告诉服务器在终止连接之前它应该等待多长时间(请求超时)和 max - 可以通过此连接发送多少个请求。
    • 如果客户端没有设置任何超时值会发生什么?这会导致他们的套接字永久连接。
    • 还有更多。 “请求超时”和“408(http 状态码)请求超时”有什么区别
    • @heretoinfinity 技术上是的。请求超时由服务器发送,表明服务器要关闭连接(注意有时服务器可能会关闭连接而不发送消息)。连接超时发生在客户端,通常意味着客户端失去连接,或者由于任何原因(例如远程防火墙正在丢弃流量或服务器关闭)无法建立与服务器的连接。
    【解决方案2】:

    连接超时(客户端)VS请求超时(服务器端)

    连接超时是客户端在从任何服务器获得响应之前等待太久时发生的常见错误(对于 API 调用或浏览器请求页面)。此错误在客户端生成以终止连接,因为我们只能同时保持有限数量的打开连接。

    通常,开发人员可以在决定在内部引发此错误之前确定他们希望等待响应的“以秒为单位”多长时间。大多数 HTTP 客户端允许我们指定:

    • 打开超时:您希望等待多长时间与服务器建立连接(第一次握手)。

    • 读取超时:您希望等待多长时间才能收到任何给定请求的响应。


    另一方面,如果您是服务器而不是客户端,您可能对请求超时更感兴趣。

    请求超时与连接超时不同,客户端不愿意等待服务器响应的时间过长。服务器也不愿意将未使用的连接保持太长时间。

    一旦建立连接,客户端必须通过定期发送信息来不断通知服务器它仍然存在。如果客户端在指定时间内没有这样做,服务器将终止此连接,因为它认为客户端不再存在。

    此行为旨在避免浪费资源。当超时发生时,服务器返回一个带有408 状态码的Request Timeout 响应。

    【讨论】:

    • 如果客户端设置的超时时间(例如 5 秒)小于服务器超时时间(例如 60 秒)。如果正在处理一个长请求,如果客户端没有断开连接,服务器会在 15 秒内做出响应,那么服务器是否会提前知道客户端断开连接?
    • 发送标头数据是否符合字节?还是您需要将其作为正文数据发送?
    猜你喜欢
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多