大家来讨论 "P2P UDP穿透NAT的原理与实现",我觉得很有意思,参与有分

iec 2006-04-15 10:10:29
同上
...全文
663 24 打赏 收藏 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2006-04-22
  • 打赏
  • 举报
回复
破广告被删了,哈哈
limlzm 2006-04-21
  • 打赏
  • 举报
回复
mark
铖邑 2006-04-21
  • 打赏
  • 举报
回复
靠,也有这样做广告的,鄙视。
铖邑 2006-04-21
  • 打赏
  • 举报
回复
相对TCP而言,UDP实现NAPT的穿透功能还是比较容易的,如我们常用的QQ便是如此。
铖邑 2006-04-21
  • 打赏
  • 举报
回复
感觉说得比较混乱。

首先,没有中间服务器的P2P不太现实。主要是实现起来太复杂,而且稳定性也很差。入楼上所言,“直接从nat那里取得连接信息”,如何取得?恐怕没有那么容易的吧?“通过其他方式通知对端”,如何通知?email???有一种想法就是搞个页面空间,然后允许一个peer连接上去,运行一个php或者jsp,将地址、端口信息登记上去,然后对端也通过这个空间上的页面取得地址端口信息。当然这个也是比较麻烦的。

其次,有些路由器或防火墙对NAPT的限制比较严格,不是所有的进入NAPT内部的数据报都是允许通过的,只允许NAPT内部主动发出的数据报通过。比如,假设位于2个不同NAPT内部的A和B,假设A要给B发数据,由于一开始B是被动的,所以这个数据报将被过滤;但是,如果之后B给A发数据,由于A所在的NAPT记录下了当初A给B发送数据的地址端口对,所以这时A所在的NAPT并不阻止B发给A的数据;接下来A想再给B发数据的话,也是可以正常通过的。
也就是说,某些路由器或防火墙对第一个发到NAPT内部的数据报总是忽略的。这就要求2个peer都必须明确了解对方的地址端口,这个需要中间服务器才容易实现。
3996906 2006-04-20
  • 打赏
  • 举报
回复
我理解你的想法是

udp随便连接一个a类的地址

然后直接从nat那里取得连接信息

再通过其他方式通知对端。。

让对端直接udp连接这个端口,做到完全无服务器
-----------------------------------------------

理论上是可以的

只要在nat回收以前,关于你的连接一直存在,这里有个问题,就是你的nat必须提供告诉你映射端口的功能,不然是没办法的。因为点对点成功后,你实际知道的是:对方nat的ip和端口,你本机的ip和本机这个连接的端口

我没找过nat的这个功能,没做过你这样假设性的研究,因为我们的点对点要求效率高,必须用服务器来辅助连接,而且在第一次连接服务器的时候,我们还用tcp做辅助。关于这点你可以参考msn之类的im,它们一起来必定有一些tcp的端口使用的
iec 2006-04-18
  • 打赏
  • 举报
回复
视频音频传输:socketapi udp
iec 2006-04-18
  • 打赏
  • 举报
回复
我们写的是功能软件,但是绝对能实现了打洞功能.图象压缩与流畅传输功能.
特别感谢:
"
感谢P2P 之 UDP穿透NAT的原理与实现(附源代码)
原创:shootingstars
"的作者.
  • 打赏
  • 举报
回复
双方都在内网里不通过第三方的“引导”是不可能建立直接的UDP通讯的。
打电话呢,也可以吧。
iec 2006-04-18
  • 打赏
  • 举报
回复
Top
3996906(我只是建议,不提供最后的解决方法) ( )

说的有道理.我们定义udp包大小我们定义为500byte 测试发现还是有丢包现象直接把整桢丢掉不要.我们通过外网服务器运行服务程序返回来返回NAT分配的端口号,我想问一下能否直接获得NAT分配的端口,而不通过服务器返回的本NAT返回的端口号呢?那么如果知道端口我们就可以通过电话来告诉对方各自的映射端口(和公网的双方IP地址),不需要外网服务器而直接建立UDP连接呢?其实打洞我理解的是通过服务器牵线后,而建立的连接.
3996906 2006-04-18
  • 打赏
  • 举报
回复
应该就是端口映射。。不过是系统自己做的,不是事先写死的

偶觉得做到这个有几点注意的

1。nat的mtu,别超过,不然包可能被扔掉
注意了这个问题后,udp的限制就满足了,我们用nmudp来做的,它自己定义包大小不能超过2048,不然就是局域网内也丢掉

2。nat回收端口的机制

个人认为穿透nat不是内网ip在做穿透

是内网ip开始一个链接申请,+上自己的端口,到nat去,nat会给这个申请分配一个端口做映射,数据包拿着nat的ip(a类的)+上新分配的端口出去到服务器,此时的这个端口是有效的,外面可以直接访问nat的ip+这个端口,nat收到数据包后会通过映射关系转到内网的ip上,这时候可以说穿透了nat,但是需要对nat分配的端口做保活,一般nat的端口在300秒内没有数据流通过就会回收端口,原先的连接就会变的不可用,连接会丢失。

不知道这样说清楚了没有,如果+上代理,在控制连接上做的好一点的话,可以做到90-95%的穿透效率,真正的udp连接

视频俺也有一个。。。用的h.263压缩处理的,质量还可以,涉及到一些商业问题,不方便公布源代码。。。欢迎交流
happyct 2006-04-18
  • 打赏
  • 举报
回复
有什么意思,没有钱,唉,白作了
sydt 2006-04-18
  • 打赏
  • 举报
回复
欢迎继续!!!
听课!
wohow 2006-04-17
  • 打赏
  • 举报
回复
如果都是自己写的,而且还处理了各种错误,那么我佩服的四脚朝天,看来我在软件这个行业是不能再混了
iec 2006-04-17
  • 打赏
  • 举报
回复
各位:写软件不是写算法,收集资料的: 打洞是利用 Hwycheng Leo 写的源码修改和功能扩展.原理很简单,代码很容易理解.音频,用API函数直接写的.图象压缩是利用:
/* Order of usage of lib263:
1. Set CParams.format to some value and call InitH23Encoder(cparams).
2. WriteByteFunction = OwnWriteFunction (1 and 2 in arbitrary order)
3. Set cparams and do CompressFrame(cparams) with INTRA encoding
4. Set cparams and do CompressFrame(cparams) with either INTRA
or INTER encoding
5. redo 4. or to stop do 6
6. Finally close with ExitH263Encoder()
*/


/* Prototypes */
int CompressFrame(CParam *params, Bits *bits);
int InitH263Encoder(CParam *params);
void ExitH263Encoder(CParam *params);
void SkipH263Frames(int frames_to_skip);

/* Procedure to detect motion, expects param->EncodeThisBlock is set to
array.
Advised values for threshold: mb_threholds = 2; pixel_threshold = 2 */
这几天服务器有问题,谁想测试留下QQ号.
netsys2 2006-04-17
  • 打赏
  • 举报
回复
的确NB啊!

要我做,光是UDP打洞就得几天,视频部分看资料就得1周。
constantine 2006-04-17
  • 打赏
  • 举报
回复
视频聊天软件基本功能开发出来了?一天一夜 ? 牛
视频部分你们自己写还是用控件,压缩算法呢?也自己写
如果都是自己写的我就要佩服的五体投地,要在“牛”字前面加多2个字才行了
呵呵
cczlp 2006-04-17
  • 打赏
  • 举报
回复
一天一夜 ? 厉害!
iec 2006-04-16
  • 打赏
  • 举报
回复
经过一天一夜的奋战和一个同事把P2p(通过UDP打洞)视频聊天软件基本功能开发出来了,以在广域网上通过测试,正在完善中...
lei001 2006-04-16
  • 打赏
  • 举报
回复
up
加载更多回复(3)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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