Skip to content
Hoping White edited this page Aug 21, 2020 · 11 revisions

关于gracefully shutdown问题

trojan-rs在写完之后,使用中经常感觉会有一些比较奇怪的问题出现,当时没仔细想,今天在用iperf3测试的时候终于想明白问题出在哪里了。我在服务器端直接运行iperf3的时候会提示iperf3: error - the server is busy running a test. try again later,但是在路由器上运行时,却会提示control socket has closed unexpectedly。用strace追踪了一下发现,前一个提示会返回\377之后再close,而后一个直接读了个空字符串,也就是说直接断开连接了。那这个时候结论已经很明确了:当目标地址断开连接的时候,如果还有数据没从代理链路回来,那代理链路应该等到结果回到客户端之后再断开连接;同理,对于代理端也是一样。简而言之,如果数据已经收到了,那么就要发出去之后再跟对端断开连接,这样才表现的像个真正的透明代理。 那么写完之后怎么测试呢?其实也很简单,随便找一个比较大的文件,如果能一次下载完成,说明连接完美断开了,如果不能,那说明有问题。新版本修改之前,测试下载文件总会在最后几十k的时候断开连接;新版本修改之后,这个问题就再也没出现了。

TODO

  1. BytesMut使用上有个问题,现在是split了之后又调用了extend,但是这个时候新的BytesMut还没销毁,所以旧的内存没有被复用,这会导致buffer比实际要的大
Clone this wiki locally