gpt4 book ai didi

python - Twisted Conch - 流量控制

转载 作者:太空狗 更新时间:2023-10-30 01:23:27 25 4
gpt4 key购买 nike

我有一个 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 进行流量控制的盲目明显的东西? *

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

最佳答案

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

作为一般原则,您可能希望在网络中间尽可能少地缓冲。 (Jim Gettys 关于“缓冲区膨胀”的笔记很有启发性。)很明显,您在问一个明智的问题。

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

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

如果您在更高层建立隧道,通过执行 git push 到中间服务器,然后使用 post-receive Hook 将对象推送到服务器的其余部分方式,然后你得到最大的缓冲(它都被假脱机到磁盘)和更快的客户端响应时间,虽然更长的总延迟。它具有实现起来简单得多的明显优势。

关于python - Twisted Conch - 流量控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13117502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com