【问题标题】:Is TCP output queue blocking keep alive?TCP输出队列阻塞是否保持活动状态?
【发布时间】:2018-09-27 03:50:01
【问题描述】:

我有以下情况: 建立 TCP 连接。客户端(运行 linux)已激活 keep-alive 并按要求工作。

现在的问题是:当我在来自服务器的请求和来自客户端的回答之间拔下客户端的以太网电缆时,keep-alive 停止工作。

我从 netstat 看到 Send-Q 已填满。 send-q 是否与 TCP keep-alive 有关?有没有办法清除这个队列?

问候, 青蛙时间

【问题讨论】:

  • 定义“停止工作”。

标签: c++ linux tcp keep-alive


【解决方案1】:

TCP keep-alive 只是一种奇特的说法,即“如果没有数据,则发送 0 字节数据包以保持连接处于活动状态”。由于您仍在发送标头,而另一方仍然必须确认它,因此在 IP 级别您仍在通信,但不是在套接字级别。

显然 unpluggint 会停止 IP 数据包和保持活动状态。此外,只要有一个 send-Q,就没有必要发送空的 keep-alive 数据包,所以它们显然是相关的——相反。当队列为空时,会创建 Keep-alive 数据包。

【讨论】:

  • 好的,谢谢。那正是我所想。有没有办法清空 send-Q?
  • @Frogtime:如“取消发送”数据?
  • 是的。例如:如果 send-q 的大小有一段时间没有改变,则“未发送”数据,因此 TCP keep alive 再次工作。
  • @Frogtime:这没有意义。别再把保命想成魔法了,看看我写的吧。 由于有 TCP 数据,发送空 TCP 数据包(即 keep-alive)毫无意义
  • 我明白你在说什么。关键是:客户端永远不会关闭其套接字,因为它不知道连接在较低级别上消失了。关闭套接字的唯一方法是在链接断开时手动关闭它吗?我试图在 TCP 层本身上解决这个问题。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 2022-01-10
  • 2022-06-28
  • 2010-11-19
相关资源
最近更新 更多