关于内网NAT打洞的问题

learnmfc 2008-12-27 10:35:53
我想问问,为什么TCP和udp编程,会遇到内网打洞的问题?
我用java编写了一个聊天程序,基于UDP,突然发现了问题,就是外网机无法与内网机通信,后来才发觉原来是需要打洞的,但是发觉,打洞不是什么很容易的事情,C++的代码老长老长的。。。。。。,java的相关代码没找到
问题1:
既然内网的是需要打洞才能通信的,那QQ,msn,甚至是瑞星的升级程序,要TCP通信的,它们都会打洞的?
问题2:
ping包,既ICMP包,发出去,能够收回,为什么ping包不需要打洞?很奇怪啊,还有http,ftp它们为什么就不需要打洞?
问题3;
实现TCP打洞,或者让内网的用户能和外网的完全正常通信,有没有稍微简单点的方法?


大家挑自己知道的问题答吧,谢谢
...全文
569 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
技术传播 2009-03-19
  • 打赏
  • 举报
回复
我现在想实现:
两个不同局域网的两台主机之间点对点通讯 请问如何实现?
不打洞能行不?
无间兔 2009-01-03
  • 打赏
  • 举报
回复
问题1:
既然内网的是需要打洞才能通信的,那QQ,msn,甚至是瑞星的升级程序,要TCP通信的,它们都会打洞的?
------------------------------------------------------------------------------------
回答:不是内网需要打洞,是在非同一路由的局域网之间通信需要打洞。

问题2:
ping包,既ICMP包,发出去,能够收回,为什么ping包不需要打洞?很奇怪啊,还有http,ftp它们为什么就不需要打洞?
-------------------------------------------------------------------------------------------------
回答:ping包能收回是因为在和公网固定IP通信或同一局域网内机器通信,http和ftp也是同理,这些都不满足需要打洞的条件,因此根本不需要打洞。

问题3:
实现TCP打洞,或者让内网的用户能和外网的完全正常通信,有没有稍微简单点的方法?
-------------------------------------------------------------------
回答:打洞的原理并不复杂,在弄懂原理后用什么语言和什么方法实现根本不成问题。

附带提醒:如果路由不支持UPNP的话,软件实现了打洞也没用。
yygkko5 2009-01-02
  • 打赏
  • 举报
回复
呵呵 学习了,期望有朋友与我交流 QQ 474373786。
wwwhhb4001 2009-01-01
  • 打赏
  • 举报
回复

学习了
Rain7758 2008-12-31
  • 打赏
  • 举报
回复
理解了 NAT 的转换机制就好了
Rain7758 2008-12-31
  • 打赏
  • 举报
回复
问题1:
既然内网的是需要打洞才能通信的,那QQ,msn,甚至是瑞星的升级程序,要TCP通信的,它们都会打洞的?
升级程序是内网TCP发起链接连公网 IP 不需要打洞!
问题2:
ping包,既ICMP包,发出去,能够收回,为什么ping包不需要打洞?很奇怪啊,还有http,ftp它们为什么就不需要打洞?
ICMP UDP TCP 内网发起通信通向公网 IP 都不需要打洞,应为服务端收到包里你的地址是 NAT 装换后的虚公网地址

问题3;
实现TCP打洞,或者让内网的用户能和外网的完全正常通信,有没有稍微简单点的方法?
你的服务器跑在公网上,客户端连上来,服务端使用客户端的公网地址转发消息即可
hurryboylqs 2008-12-30
  • 打赏
  • 举报
回复
java也有socket吧,TCP打洞看下那个开源代码XSTUN ,是C++写的,可以转换过来的
scq2099yt 2008-12-30
  • 打赏
  • 举报
回复
1.他们有打洞
2、http,ftp都在tcp/IP上层.
learnmfc 2008-12-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hurryboylqs 的回复:]
java也有socket吧,TCP打洞看下那个开源代码XSTUN ,是C++写的,可以转换过来的
[/Quote]
还是要通过C++的代码转过来?java没有自己的吗?
leon7909 2008-12-29
  • 打赏
  • 举报
回复
问题1:
既然内网的是需要打洞才能通信的,那QQ,msn,甚至是瑞星的升级程序,要TCP通信的,它们都会打洞的?
============================================================================================
首先要弄明白什么样的情况下需要打洞(这个词实在是@#$@$@!),内网里的QQ/MSN/瑞星升级等程序,一般情况下(QQ应该分开来说,他的一些功能是有做内网穿透的)是内网IP与公网IP通信,这种情况不需要我们通常所说的打洞,我们通常说的打洞,是内网IP与内网IP跨越公网直接互连时的一个动作.是两个洞,在两个内网网段各自的NAT设备上分别有一个针对自身的端口映射,而内网IP对公网IP这种情况,拥有公网IP的一端是可以直接被路由到的,不需要IP地址的转换.但是,有一点要明确,这种情况下也是有"洞"的存在的,不过只有一个,就是在内网IP这一端的NAT设备(一般就是带NAT功能的路由器)上,要知道,共享一个公网IP给内网用户上网并不是路由协议的功劳,NAT才是.

问题2:
ping包,既ICMP包,发出去,能够收回,为什么ping包不需要打洞?很奇怪啊,还有http,ftp它们为什么就不需要打洞?
===================================================================================================
ICMP也是基于IP的,他虽然没有PORT段,但是IP头内有标识字段,所以洞依旧是打了的,只是不再依端口来做映射,这也是为什么在同一台机器上,开两个DOS窗口,PING同一个IP时,同一时间只有一个PING得到返回,另一个丢包的原因.至于HTTP/FTP,他们都是基于TCP的,连的是公网IP地址,还是那句话,不是不打"洞",是只打了一个"洞"

问题3;
实现TCP打洞,或者让内网的用户能和外网的完全正常通信,有没有稍微简单点的方法?
===================================================================================================
TCP实现打洞的说法我也关注过一段时间,没见过成品,有基于端口预测的做法,太不靠谱,基于TCP的内网互连有一个最简单的问题,当内网中的SERVER端bind一个端口并ACCEPT时,并没有和本地的NAT设备有任何通信,NAT如何知道内网中有个应用需要一个端口映射,因为一直觉得要实现TCP穿透不如实现个可靠的UDP协议来穿透更实际,所以也没太关注,感觉还是老老实实的用uPNP更好吧.
CodeProject-Jerry 2008-12-28
  • 打赏
  • 举报
回复
实现TCP打洞,或者让内网的用户能和外网的完全正常通信,有没有稍微简单点的方法?
---------------
如果你的外网接受连接的机器有固定的IP或者域名,那么就直接从内网发起连接就可以了

TCP打洞不是在所有的NAT上面都是成功的
CodeProject-Jerry 2008-12-28
  • 打赏
  • 举报
回复
有没有办法用icmp来代替UDP的方法,例子?
--------
使用原始套接字


如果你需要2台都在内网的机器直连通信,那么就应该打洞。
和协议无关。

learnmfc 2008-12-28
  • 打赏
  • 举报
回复
有没有办法用icmp来代替UDP的方法,例子?
learnmfc 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xin0101 的回复:]
都是要经过打洞的,之前我也有经过使用TCP来进行打洞,不过发现很难,可以说是不行。
要想打洞的话还是使用UDP吧。
[/Quote]
可以的吧,瑞星的升级程序就是通过tcp来的
阿鑫 2008-12-28
  • 打赏
  • 举报
回复
都是要经过打洞的,之前我也有经过使用TCP来进行打洞,不过发现很难,可以说是不行。
要想打洞的话还是使用UDP吧。
oyljerry 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 learnmfc 的回复:]
其实是不是可以用icmp完全代替udp呢?这样就不用打洞了
[/Quote]
ICMP在ip层,UDP在IP之上,属于传输层
learnmfc 2008-12-28
  • 打赏
  • 举报
回复
请问各位,java的打洞方面的代码有吗?网上找到的都是C++写的。。。。。。
threebird 2008-12-28
  • 打赏
  • 举报
回复
ICMP不能代替UDP;
外网侦听,内网主动去连接,不需要打洞;
内网侦听,外网或内网主动去连接,要打洞。
learnmfc 2008-12-28
  • 打赏
  • 举报
回复
其实是不是可以用icmp完全代替udp呢?这样就不用打洞了
加载更多回复(2)
Re:CCNA_CCNP 思科网络认证 PAT NAT 端口或地址转换 与端口映射======================# 本章课程大纲        公网地址和私网地址        NAT应用场景        静态NAT  :static  地址转换        动态NAT  :dynamic地址转换        PAT        :端口地址转换        端口映射 :port map        在Windows上同时实现的NAT和端口映射 # 私网地址三类 A类:10.0.0.0                                255.0.0.0(1网段) B类:172.16.0.0 -172.31.0.0         255.255.0.0(16网段) C类:192.168.0.0-192.168.255.0  255.255.255.0(255网段) # NAT 的使用场景        NAT的最初的目的是允许把私有IP地址映射到公网地址,以减缓IP地址空间的消耗。        当一个组织更换它的互联网服务提供商ISP,但不想更改内网配置方案时,NAT同样很有用途。        以下是适于使用NAT的多种情况:         企业内网接入Internet节省公网地址         单向访问         大方向:内网访问互联网(互联网上主机不能够访问内网主机)         小方向:同单位实现两个网段之间单向访问(涉密部门能够访问其他部门,反之不可)         增加一个网段          避免在主干路由器增加到这个网段的路由         在Windows上实现的NAT和端口映射 # 网络地址转换的类型        下面介绍一下NAT的三种类型。         静态NAT 是为了在私网地址和公网地址间,允许一对一映射而设计的。         或者IPv4和IPv6之间的转换(典型)         不节省公网地址,故公网地址的利用效率不高,         无任何安全性,外网可以通过公网地址直接攻击内网主机,好像只增加路由器的工作         适用场景类似代理,可以较方便的更换主机,而无需修改路由器的配置         故应用不够广泛...         动态NAT 可以实现映射一个未注册 IP地址到注册IP地址池中的一个注册IP地址。         多对一,或多对多         比较PAT优势:避免被误认为攻击而被封ip地址         不太节省地址,应用不广泛         复用是最流行的NAT配置类型,也被称为端口地址映射(PAT)。         通过使用PAT,可实现上千个用户仅通过一个真实的全球 IP地址连接到Internet。         缺点:增加延迟,消耗路由器性能 # 端口映射(port mapping) 允许Internet上的计算机通过企业路由器的公网IP地址访问到内网的服务器------------------------------------------------         

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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