关于JAVA UDP无法过墙的问题(急!!!)

virginkj 2010-03-26 04:38:25
我现在遇到一个很头痛的问题,百度了很久,还是没找到原因和解决办法,所以只能求助万能的CSDN了

前提:
1.我现在做了一个通讯系统,走的是UDP协议;
2.两个节点之间谁都可以是服务端或者客户端,因为谁都可以主动向对方发送数据包,且都可以不回复;
3.两个节点是两个不同的程序,各自绑定了自己的端口,假设A节点绑定的是1000号端口,B节点绑定的是1001号端口;
4.通讯时A节点发送的数据包的源端口是1000号端口,目的端口是1001号端口,B节点反之;
5.A节点是固定的地方,所以在A节点处,防火墙会将所有指向1000号端口的数据包打到A节点上;
6.B节点可以是全国任意一台能连接到以太网的PC机,无法要求B节点的使用者将防火墙的配置也配的和A节点一样;

问题:
1.在内网通讯,一切正常;
2.如果B节点的环境没有防火墙,一切正常;
3.如果B节点的环境有防火墙,B节点发送给A节点的数据包没有问题,但是A节点返回给B节点的包,B节点却收不到(在A节点的防火墙上抓包会看到B节点的数据包进来了,且A节点的返回包也出去了,但是在B节点的PC上却抓不到A节点的返回包,由于条件有限,没办法在B节点的防火墙上抓包,所以也不能肯定是B节点的墙把数据包丢弃了,也有可能是在半路中就被丢弃了,但是从上一点看的话,被B节点防火墙丢弃的可能性最大)

不知道我这样的说明有没有很清楚,我一直在线,如果谁不明白,我会及时回复的,先谢谢啦!

如果能帮我解决这个问题,我会加分的!
...全文
131 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
virginkj 2010-03-26
  • 打赏
  • 举报
回复
问题已经找到了,现在把经验说一下,希望能帮到和我碰到同样问题的人

1.因为B节点的路由器在数据包出去之前会给数据包镜像一个另外的IP和port,所以B节点发送给A节点的数据包的源port就已经不是1001,而是一个随机的port;
2.而A节点在返回包的时候却仍然是已1001为目的端口回包,这样,B节点的路由器根本不认识这个包,所以将包丢弃;

我们现在的做法:
1.A节点将所有收到的包的源端口作为目的端口回包;
2.如果多个B节点都在与A节点通信,那么A节点会建立多个对象分别代表每一个B节点,而每一个对象里面记录该B节点发送包的源端口;
3.A节点在返回包的时候,包是发送给谁的就会调用谁的源端口作为目的端口发包。
ChDw 2010-03-26
  • 打赏
  • 举报
回复
3.如果B节点的环境有防火墙,B节点发送给A节点的数据包没有问题,但是A节点返回给B节点的包,B节点却收不到

-----
这里有几个可能,一个是防火墙已经完全禁止了外部的UDP包数据,这种无法处理

另外一种是必须B节点以portB端口为源端口向A节点的目标端口portA发送数据,这时防火墙才会打开在一定时间内允许A的以portA为源端口向portB的portB发送数据。
virginkj 2010-03-26
  • 打赏
  • 举报
回复
第一个包本来就是B发给A的啊 A的返回包没法到达B
nickycheng 2010-03-26
  • 打赏
  • 举报
回复
避免用b做服务端这样的模式。 不能隔几秒请求一下A看有没数据过来吗?
virginkj 2010-03-26
  • 打赏
  • 举报
回复
没办法 需求就必须是这样 因为两边都要监听信息 如果发现新的信息是需要及时通知对方的
nickycheng 2010-03-26
  • 打赏
  • 举报
回复
我觉得你的模型有问题导致这样的结果。
你让B也做服务端,当然就会存在B的服务端口被防火墙拦截的可能。

正常的udp模型应该只是在A节点做服务器。B始终是作为客户端请求连接A。
henry_fuzr 2010-03-26
  • 打赏
  • 举报
回复
mark
virginkj 2010-03-26
  • 打赏
  • 举报
回复
我所指的不是软件防火墙 是硬件防火墙
knightzhuwei 2010-03-26
  • 打赏
  • 举报
回复
如果是一般PC机上的个人防火墙 很多应该有通讯时是否添加例外的主动提示
如果你无法知道B节点到底用的是那种防火墙 只想改进下程序就能完全绕过B点所有可能存在的防火墙 那防火墙的存在还有什么意义
virginkj 2010-03-26
  • 打赏
  • 举报
回复
那如果是我们的一个销售拿着B节点去一个客户那里演示 还必须让客户帮他配置个例外么?
knightzhuwei 2010-03-26
  • 打赏
  • 举报
回复
允许防火墙例外很正常啊 很多软件都要求添加防火墙例外的么
virginkj 2010-03-26
  • 打赏
  • 举报
回复
我们不可能要求所有使用B节点的人都去配置一下自己的防火墙吧 这样不现实
virginkj 2010-03-26
  • 打赏
  • 举报
回复
我用的就是google 只是百度说的比较顺口 嘎嘎
xiaotian521 2010-03-26
  • 打赏
  • 举报
回复
朋友,有问题你干嘛要死查百度呢,还有Google呢,那个是学习的好网站。
以后娱乐用百度,学习用Google!!!
呵呵!!!
knightzhuwei 2010-03-26
  • 打赏
  • 举报
回复
哦 看到了 B关掉防火墙是没问题的
那不能允许防火墙例外?非要穿墙不可?这不是黑客干的事么= =
knightzhuwei 2010-03-26
  • 打赏
  • 举报
回复
叫B关掉防火墙试试嘛

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧