UDP打孔:单机可测试性

Posted

技术标签:

【中文标题】UDP打孔:单机可测试性【英文标题】:UDP hole-punching: testability on single machine 【发布时间】:2011-05-28 05:09:54 【问题描述】:

我正在编写一个简单的 P2P 应用程序来测试在大型项目中使用 UDP 打孔的可行性。

我昨天在家中试用了我的测试应用程序,它们运行良好。

但是,我现在正在工作,但相同的代码不再适用。发送者在这里发送到我们路由器的外部 IP 地址上的适当端口,但接收者没有收到任何一个。

在调用UdpClient.Receive() 之前,接收应用程序将数据包发送到它将侦听的 IP:port。同样,这适用于我的家庭设置,但不适用于这里。无论 Windows 防火墙是打开还是关闭,结果都是一样的,所以这不是问题。

可能是路由器处理情况的方式不同吗?

EDIT1:两个应用程序在同一台机器上运行。

【问题讨论】:

您的路由器是否运行任何类型的 NAT?是否需要设置端口转发?发送方和接收方之间是否有任何类型的防火墙(在路由器或其他设备上)? 两个路由器都是典型的SOHO NAT路由器。两者都关闭了防火墙功能。这个想法是避免端口转发。 :) 我会使用wireshark查看网络级别的所有内容。 @Lazarus:UDP 打孔是一种通过 NAT 的技术 :) 【参考方案1】:

回答我自己的问题:

路由器确实表现出不同的行为。

我的家用路由器只连接到我的笔记本电脑。我认为这就是为什么当我从 port n 发送 UDP 数据包时,它也会将路由器留在 port n 上。

但是,我的工作网络由几台计算机组成,路由器在其末端随机化端口,这意味着从 端口 y 发送的数据包将离开路由器在 端口 x强>。

我已经成功地让我的家庭和工作机器通过 NAT 进行通信,而无需通过以下方式使用端口转发:

H - 将数据包从端口 a 发送到 W:b,从而为传入连接打开端口 a

W - 将数据包发送到 H:a 并切换到接收模式。它现在也有一个开放的端口。

H - 从 W 接收数据包,而不是假定知道要回复哪个端口,而是检查数据包的源端口并使用它。

H - 将数据包发送到 W:源端口

W - 接收数据包。

瞧。

实际上,H 和 W 会联系服务器以交换连接详细信息,这简化了事情,因为服务器确切地知道 H 和 W 从哪个端口发送。

【讨论】:

以上是关于UDP打孔:单机可测试性的主要内容,如果未能解决你的问题,请参考以下文章

可测试性战术分析

可测试性战术总结

设计模式简记-通过重构增强代码可测试性实战

设计模式简记-通过重构增强代码可测试性实战

如何编写具有可测试性的代码

可测试性战术