estorm
===========================================================
使用UDP通信穿透NAT/Firewall
===========================================================

转载,作为笔记

一篇分析P2P软件,使用UDP通信穿透NAT/Firewall的文章;重点分析了NAT和Firewall的区别。


P2P 是 Peer to Peer 的缩写, 意即点对点。这个点可以理解为电脑或者其它网络终端, 例如 headcall 网络电话机和无线手机. P2P 通讯不经过服务器, 直接通讯,无疑减少了服务器负担,降低了运营成本. 有一点需要指出的是, P2P 通讯初始化阶段是需要服务器协助的, 服务器开始有点象媒婆的角色, 两个人相亲见了面就没有媒婆什么事了.






P2P 有一个技术问题是如何穿透 NAT. 因为公网IP不足, 所以许多内部网, 或者企业网都使用私有IP地址, 形如 10.x.x.x 172.x.x.x 192.168.x.x 的都是私有IP地址. 私网出口处有一个路由器, 这个路由器负责将私网IP映射到一个公网IP地址上, 例如从主机端口 192.168.1.2:1234 出去的数据可能被映射到 12.34.56.78:10223 端口. 这个地址转换就叫 NAT. 所有私网出口路由器都有这个功能.



有的私网下面还有私网, 例如一个小区使用私网, 而小区内的一个公司可能又有自己的小私网这样就构成了多层 NAT 的问题. 如何穿透这一层又一层的 NAT, 是 P2P 通讯软件首先要面对的问题. 由于各种 NAT 不同, 各个时期的 NAT 产品标准不同, 所以要穿透这些成分复杂的 NAT 并非易事. 就目前 headcall 在全球的使用来看, 还没有发现 headcall 穿透不了的 NAT. 而我们却经常发现有些流行的 P2P 软件对于某些 NAT 无可奈何, 只好通过服务器中转.

P2P 为什么能够穿越 NAT, 这与P2P使用的通讯协议有极大关系. P2P 都使用 UDP 通讯.



互联网协议称为 TCP/IP, 有时也称为 IP 网. 因为互联网最底层的协议是 IP 协议. 而在 IP 之上有两个最主要的协议即 TCP(可靠传输)和 UDP(用户报,不可靠传输). P2P 使用了 UDP, 这个协议仅仅在 IP 包上打了一个 UDP 标签, P2P 程序在这个不可靠协议上建立了可靠的传输, 象 TCP 一样地可靠. 这个构造过程其实也象通过 IP 构造 TCP 一样.

NAT 参与了 TCP 的连接建立过程, 而 UDP 是无连接的通讯, 不需要 NAT 参与. 所以 UDP 可以穿越 NAT. 这就是为什么 P2P 程序为什么使用 UDP 的原因, 因为太多的用户在 NAT 后面.

所以几乎所有的 P2P 软件都声称能够穿透防火墙, 这里防火墙实际指的是路由器 NAT. 因为普通用户不知道 NAT, 只知道出口处有一个网关, 那里经常会布置一个防火墙.

P2P 并不能穿透防火墙. 否则, 那还叫什么防火墙 ?

防火墙, 不防火只防数据. 通过设置, 只允许某些数据包通过, 而不让另外一些通过. 那么防火墙如何能让谁通过而又不让谁通过呢? 可能设置防火墙, 例如, 只允许跟外面的 80( HTTP 服务 ) 端口通讯. 80 端口是标准的 Web 服务端口, 如果不让它通过, 你就不能浏览网页. 不能浏览网页还能叫互联网吗? 是的. 有些公司的防火墙就是这样设置的, 不让 80 端口通过 ! 就是不让你浏览网页.



防火墙的选择性通过数据, 也就选择了允许在互联网可以进行的通讯类型. 例如有些只让你浏览网页, 有些只让你收发 email. 总之防火墙, 不防火只防数据. 连病毒也防不了. 你不知道许多成嫌胁《韭? 一不心瞎点一下, 病毒就钻到你的电脑里了. email 里的病毒就更多了. 病毒制造商都知道再严厉的防火墙也会让人收发 email , 所以都喜欢把病毒放到 email 里面. 所以笔者我已经不大相信 email 了. 一周下来, 我的 email 信箱里面满满的 2000多封广告信和不知道是什么内容的信件, 鬼知道那一封有病毒, 所以不敢瞎开封, 如此一来 email 算是功能减退了.

一般防火墙并不关闭 UDP 通讯. 但近来 P2P 程序越来越多, 象 MSN QQ ICQ 等等, 又以聊天和游戏居多, 象 headcall 这样干"正事"的很少, 所以招致许多网管干脆连 UDP 一起封掉.

结果是, P2P 通讯转不起来了. 聊天聊不成了, 游戏玩不成了, 象 headcall 这样免费的电话也打不成了. 这不关 P2P 的事. 这是网管的事, 或者准确地说, 是网管的"上级"决定的事.

如果你的 headcall 登录不上, 可能就是防火墙关闭了 UDP 通讯. 这个时候, 你只能通过代理服务器上网. headcall 支持 SOCKS 5 代理服务器. 如果网管没有提供 SOCKS 5 帐号的话, 免费电话也就打不成了.

如果你从某 ISP 处获得网络通道, 例如 ADSL, 拔号上网, 有线宽频等, 也就是说你就是那个最大的"上级", 如果还碰到 headcall 登录不上的情况, 你可以向你的 ISP 反应情况, 如果 ISP 不解决这个问题, 你可以换一个 ISP, 并且告诉你的朋友, 千万不要购买那个 ISP 的宽带.


http://www.headcall.com/zh/doc/p2p.htm

estorm 发表于:2005.02.06 20:51 ::分类: ( 笔记 ) ::阅读:(2068次) :: 评论 (0)

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)




自我介绍
切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
Blog信息
网站链接...