5

我有一个 Twisted Conch SSH 服务器,典型的场景是这样的:

git 通过 OpenSSH 客户端 >>--- WAN1 --->> Twisted conch svr >>--- WAN2 -->> Git 服务器

有时,“git push”通过 WAN1 发送数据的速度比我通过 WAN2 代理它的速度要快,所以我需要告诉客户端放慢速度(在任何 TCP 数据包丢失导致调整 TCP 窗口大小之前)以避免在 Twisted 服务器上缓冲过多。读取 SSH 的 RFC 是在不通过 adj 窗口确认的情况下完成的,这将导致 git push 阻止系统调用写入由 openssh 支持的管道。

查看方法 def ssh_CHANNEL_DATA(self, packet) 中的 conch/ssh/connection.py:L216:我可以通过将 localWindowSize 设置为 0 来完成此操作,并且飞行数据仍将着陆,因为 230 上的谓词仍应通过(给定 localWindowLeft) . 我想知道这是否是正确的方法,还是我错过了关于使用 Twisted SSH Conch 进行流量控制的一些明显的东西?*

注意:我承认我可以覆盖(通道)上的 stopWriting 和 startWriting 方法占位符,因此我有钩子来控制传输“git pull”的另一端,但我对另一端感兴趣。此外,IPush/IPull 生产者似乎不适用于这个级别,我看不出如何在不屠杀海螺的情况下将这些更高的抽象联系起来?

4

1 回答 1

3

我没有使用过 Twisted,根本不了解 Conch,但没有其他人回答,我会试一试。

作为一般原则,您可能希望在网络中间缓冲很少(如果有的话)。(Jim Gettys 关于“缓冲膨胀”的注释很有启发性。)所以很明显,您提出了一个明智的问题。

我假设当数据从客户端到达时,Conch 会在您的代码中调用一个函数。在您可以将数据传送到后端服务器之前,简单地不从该调用返回就足够了吗?内核仍将在入站和出站套接字中缓冲数据,因此不会立即将情况通知给下游客户端,但我希望它会进入稳定状态。

当然,作为替代方案,您可以在与 SSH 不同的层上通过此路由器进行隧道传输。如果您在较低层建立隧道,因此您有一个端到端的 TCP 连接,那么 TCP 堆栈应该计算出一个合适的窗口大小。

如果您在更高层进行隧道传输,通过git push对中间服务器执行 a 操作,然后使用post-receive钩子将对象推送到其余部分,那么您将获得最大的缓冲(全部假脱机到磁盘)和更快的客户端响应时间,虽然更长的总延迟。它具有明显的优势,即实现起来要简单得多。

于 2012-11-07T17:12:41.167 回答