tcp - 如果我打开 TCP 连接但不发送数据,空闲超时似乎要长得多,为什么?
问题描述
我有两台服务器,一台服务 HTTP,另一台服务 HTTPS。
我打开了到 HTTP 服务器的 TCP 连接
nc http.server 80
它保持打开很长时间,我不得不CTRL + C。我可以验证使用打开和关闭的连接tcpdump
。
但是如果我发送一个HTTP请求,连接会在空闲10s后关闭,我也可以看到服务器发起了FIN握手。
GET / HTTP1.1
Host: http.server
我对 HTTPS 服务器做了同样的事情
openssl s_client -connect https.server:443 -servername https.server
类似的事情发生了,如果我不发送任何请求,连接将打开很长时间,一旦我发送请求,连接将在 10 秒后关闭。
所以我的问题是你如何解释这种行为?我只知道两台服务器都有 HAProxy 设置。
解决方案
在等待请求开始时有相当长的超时时间并不少见。这对于保持请求之间的 TCP 连接活动以加快对后续请求的响应非常有用。保持 TCP 连接以防万一您很快需要它是有意义的。
但是,在请求中间暂停是不常见的。这更有可能表明连接无法正常工作。如果他们不打算发送整个请求,为什么客户端会开始发送请求?此外,服务器正在使用更多资源,因为它必须存储已发送的请求部分。所以在这里使用更短的超时是有意义的。
总而言之,在新的 TCP 连接的情况下,您将获得“等待请求开始”超时,将其设置得相当长是有意义的。在部分任务的情况下,您将获得“在请求中间停止”超时,保持相当短是有意义的。
推荐阅读
- python - 如何在dict python 3.4的值列表中找到第一个唯一项
- ios - 在 Xamarin iOS 中的 UIActivityIndicatorView 中隐藏指示器
- linux - 向连接到 USB 总线的设备发送 SET_CONFIGURATION 消息的 Linux 工具
- python - Django:使用两种不同模型创建用户帐户
- java - 定义缓存时如何从自定义类中获取 QueryFields?
- python - 需要使用python在outlook中切换帐户以使用其他帐户发送电子邮件
- haskell - 如果它们在同一个目录中,是否不能从另一个模块导入模块?(哈斯克尔)
- python - 如何使用python 3从“a”中的href获取带有类名的链接
- android - 在通话记录中存储带有自定义标签的电话号码,然后使用我的应用程序调用它
- javascript - 如何将 html2pdf 库的输出存储到变量中?