2

会尽量简短

我使用 c# .net 3.5 编写了一个自定义 FTP 实现。系统使用 TcpClient(主动模式为 TcpListener)来管理连接。在一个实例中出现奇怪的行为,我想询问可能的原因。

客户本身在内部工作得很好,我们很大一部分客户对此感到满意。但是,我们有一个我无法弄清楚。我被发送了wireshark的踪迹来探查,但没有真正的快乐。客户端机器是我认为(从客户端描述)成为大型网络基础设施的背后。从网络外部,与同一台服务器的连接就像一个魅力。这就是我所看到的。

对于我的客户端,在被动模式下运行,发送 tcp 握手请求以进行数据连接(服务器进入被动模式并指定端口),但从未得到确认。这会导致重试和最终超时。

使用 Filezilla(以及 Windows 资源管理器和 IE ...)客户端,再次使用被动模式,连接没有问题。令人讨厌的是,这导致客户和我的老板指责代码。

通过wireshark 跟踪,我看不到TCP 帧之间的任何差异。所有控制连接都命中端口 21 并在两种情况下都得到确认。标志是相似的。同样适用于数据连接,除了在这种情况下它是一个高数字端口 52000+(但在我拥有的跟踪中不一样)。

当我们开始处理较低级别的协议问题时,我不是网络编程方面的专家,而且我对更大的网络警告的理解非常有限。作为开发人员,我立即大喊“防火墙问题”,但这并不能真正为任何人解决任何问题。

最后,有谁知道什么样的硬件/防火墙会导致这种行为?我怀疑某些东西会阻塞应用程序级别的流量,但你永远不知道。

谢谢阅读。

4

1 回答 1

0

好好擦亮我的鞋子。你会相信吗,事实证明这毕竟可能是用户错误。

悬在这上面的一个大问题是“为什么 filezilla 和 windows 可以工作,而你的软件却不能”。好吧,我终于从服务器端得到了跟踪,告诉我发生了什么。

似乎 filezilla 和 windows 回退到活动模式,但没有告诉你。由于端口 20(被动模式,控制主机端口)和 21(主动模式,客户端数据端口)是众所周知的,网络硬件可能会允许它(并且经常这样做,无论防火墙设置如何)。

但是,我们的软件不会自动退回到活动模式,因为 FTP 圈不推荐它作为一项功能。相反,活动模式是设置连接时选择的单独选项。奇怪的是,防火墙阻止了传出的客户端握手请求,但发生了奇怪的事情。我要洗掉这个,并可能会自动退回到我们的客户身上。

编辑:是的,用户在他们的网络上有一个他们没有告诉我们的代理。敲响pebcak警报!

于 2011-11-18T14:39:11.073 回答