当前位置:首页 » 操作系统 » udp穿透nat源码

udp穿透nat源码

发布时间: 2022-07-27 07:34:39

‘壹’ udp协议怎么穿透Symmetric NAT

把4种类型分别标为1234,有两台主机A:portA和B:portB(port都为外网端口,是与打洞服务器通信的端口),以及打洞服务器S,情景是B拿到了A:portA的信息,要与A通信。
(1)、A为类型1;无论B为哪种类型,都可以直接与A:portA tcp连接;
(2)、A为类型2;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,所以A:portA先向B发送一个一字节的udp包,在路由器上打洞,然后等待B:portB先发送数据,A:portA接收到B:portB的数据后,即知道portB,也可互通数据了;
(3)、A为类型3;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2或3,则A:portA和B:portB各自向对方发送一个一字节的udp包,分别在自己的路由器上打下洞,从此A:portA和B:portB可进行udp通信;若B为类型4,则portB在与不同的ip:port通信时会不一样,而A又要求知道portB的才可让B:portB连进来,所以这种情况A只能猜测与A:portA通信的portB,通信概率小;
(4)、A为类型4;无论B为哪种类型,在A知道B之前都无法直接连接,B给S发一个打洞请求,S转发该请求到A。若B的类型为1,则A:portA可直接tcp连接到B:portB;若B的类型为2,则B:portB先向A发送一个一字节的udp包,在路由器上打洞,然后等待A:portA先发送数据,B:portB接收到A:portA的数据后,即知道portA,也可互通数据了;若B的类型为3,见(3)中B为类型4的描述;若B为4,双方无法知道对方的端口,无法通信。
希望可以帮到你

‘贰’ TCP、UDP穿透NAT

A与B如果IP相同,则用内网方案。

A与B的IP不相同的话,
A请求服务器让B给A发个打洞消息。如果能接收到B的应答,就说明通了。(在这里是通过线程,有一个最大尝试次数)

A -> 发送打洞请求给C
C -> 发送命令给B,B接到命令后
B -> 发送打洞回应消息给A,一直尝试N次
如果A能接受到B的回应,就通了。

不知道描述的对不对。

‘叁’ udp协议怎么穿透Symmetric NAT

http://blog.csdn.net/jq0123/article/details/840302
NAT大致分为下面四类
1)
Full
Cone
这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A.不管是不是C发过来的.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
任何发送到
NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
2)
Restricted
Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用任何端口和A通信.其他的外网机器不行.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
任何从C发送到
NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
3)
Port
Restricted
Cone
这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口.然后C可以用原来的端口和A通信.其他的外网机器不行.
例如
A:192.168.8.100
NAT:202.100.100.100
C:292.88.88.88
A(192.168.8.100:5000)
->
NAT(202.100.100.100
:
8000)
->
C(292.88.88.88:2000)
C(202.88.88.88:2000)发送到
NAT(202.100.100.100:8000)的数据都可以到达A(192.168.8.100:5000)
以上三种NAT通称Cone
NAT.我们只能用这种NAT进行UDP打洞.
4)
Symmetic
对于这种NAT.连接不同的外部目标.原来NAT打开的端口会变化.而Cone
NAT不会.虽然可以用端口猜测.但是成功的概率很小.因此放弃这种NAT的UDP打洞.

‘肆’ NAT C#,要用C#写的、UDP穿越NAT的源码、源码

UDP穿越NAT的话,需要对端配合的,否则没办法穿越,只能对方先在子网后面对公网地址发起UDP呼叫,公网计算机才能在一定时间里回应,回应的UDP包可以穿越nat到达源机器。

如果两边都在子网后面,那就需要作一个状态服务器,维护两方的NAT映射信息。

很简单。我从前做过实验。

你要是已经懂了原理,怎么会做不出程序?

‘伍’ udp协议怎么穿透Symmetric NAT

这个穿透是指,当设备检测到报文是udp时,会建立一个port mapping端口映射,以便于区分内网的用户,这个映射同样会指向外网ip的一个端口

‘陆’ C#UDP穿越NAT,UDP打洞,UDP Hole Punching源代码,该怎么处理

首先要有一个没有nat的公网服务器,
每个用户使用一个端口与服务器通讯 ,服务器在收到用户连入请求后把用户的标识符跟用户的端口号匹配保存起来
当另一个用户请求该用户时把该用户对应的端口号返回 然后用户之间互相用指定端口号联系 就是打洞了
服务器要维系连接要定时发心跳包

‘柒’ TCP穿透NAT

谈谈我的理解:
首先,tcp不同于udp,tcp天生就是不对等的连接,因此穿透nat就显得很困难。
最为简单的一种方式:
客户端:a,b
服务器端(公网)c
a发送消息给c,同时c拿到a的ip端口等信息,将a提出的请求转发给已与c连接的b,b表示同意后发送消息给c,c将消息反馈给a,同时为a和b的通信做准备(分配端口等等),整个过程是客户端到服务器再到客户端,c起中转作用,a与b建立连接实际是a与c,b与c建立的连接。
一般对于可靠性要求较低的应用会使用udp实现。
优点:适用于所有类型网络,简单;
缺点:占用带宽,速度慢。
早期的msn就是这种方式。
第二种方式:TCP的p2p技术。
这种方式是目前最热门的,我也正在看。
转一下来自cmu(卡耐基梅隆)牛人们的研究:
××××××××××××××××
原文:http://www.andrew.cmu.e/user/ggw/WBFD.pdf

由于工作需要,在网上找了很长时间P2P的资料,好像只有《P2P 之 UDP穿透NAT的原理与实现(附源代码)》比较有实际意义,可惜又是用UDP实现的,无奈只好找了份英文资料啃,发现很有参考价值,就根据理解翻译了一部分,分享给大家,由于水平有限,有错望多多包涵。如果有人能够继续翻译下去别忘了通知我哦呵呵,[email protected],感谢。

摘要
防火墙和网络地址转换(NAT)设备对于传统的P2P协议存在一定的问题。一些中间设备抑制了来自外部网络到内部网络的TCP请求,这篇文章的目的就是寻找一个能够在两个NAT设备内部的主机间建立TCP连接的方法。我们已经在两个普通的硬件条件下实现了这个功能。

1.入门
由于32位IP地址的减少,现在出现了很多通过一个internet地址代理内部网络上网的设备,这就是NAT技术。这些设备对于INTERNET已经越来越重要了,但是它们的独立发展因为缺乏标准而对现在的internet协议造成危害。

2.技术
典型的NAT和防火墙设备都是不允许外部地址主动请求而进入内部网络的,如果用户的程序需要在两个内部网络间建立直接性的连接,那么两个内部设备之间必须是相互信任的。如果A和B两个部分都初始化了TCP连接,NAT设备就会认为它们之间是相互信任的,也就允许它们之间的连接了。
图1是一个例子,目标是能够让A和B(分别在NATA和NATB后)建立TCP连接。
我们讨论了多种在特定的NAT设备环境下的TCP连接方案。
如果我们的情况如下:
1、可预测NA的端口,可预测NB的端口,可指定源IP的特定路由
2、可预测NA的端口,可预测NB的端口,不可指定源IP的特定路由
3、随机的NA端口,可预测NB的端口,可指定源IP的特定路由
4、随机的NA端口,可预测NB的端口,不可指定源IP的特定路由
5、随机的NA端口,随机的NB端口,可指定源IP的特定路由
6、随机的NA端口,随机的NB端口,不可指定源IP的特定路由

我们必须作出这4种假设:
1、 两个主机都不受NAT设备所限制;
2、 我们可以配置网络设备使得主机看不到来自外部网络的ICMP包(TTL超过限制),因为这些ICMP数据包无论被任何一方接收到都是中断TCP连接。我们讨论的一些解决方案就依赖通过发送一个初始TTL很小的SYN包来建立TCP连接。一旦SYN包被路由器丢弃,ICMP TTL 超时包就会被传送到NAT设备,我们不允许NAT设备将这个超时TTL的返回包传送到内部网络,即使NAT会将这个包传送到内部,也需要通过配置防火墙来限制这个包到达主机;
3、 即使NAT设备看到ICMP超时的数据包,设备本身的映射表将不会作任何改动;
4、 内部网络的其它主机不会占用抢占这个端口,因为如果网络特别繁忙,这个端口可能会无效。

3.1第一种情况
我们可以通过图2表示的顺序解决问题:
1)A和B可以设定LSR(IP报头中的一个选项)通过X路由发送SYN数据包.
2)X可以缓存它们的数据包并且发送欺骗的SYN+ACKS给NA和NB.
3)A和B可以通过由X发送来的数据进行应答.
4)X丢弃这两个ACK包,因为它已经可以确定A和B相互应答成功.

图2是假设A和B都事先彼此的NAT的通信端口,A知道B的通信端口是NB:5000,B知道A的是NA:4000,并且要求X不在任何NAT设备的后面.实际中这两个端口是预测得到的,预测过程如图3:

3.2第二种情况
第一种情况依赖与自由设定路由,但是现在很多路由器大多都限制这样做,并且会丢弃这样的服务请求包。因此在实际应用中,这种方案失败的可能性很大。如果自由设定路由不可行,我们可以通过out-of-band通道(他们预先与X连接好的TCP连接)来传送原本必须将数据包路由到X才能看到的包。注意在图二的第二步X已经知道了TCP的序号Q和P,因为X已经收到了这两个SYN包,但是如果数据包没有路由经过X就不可能收到它们。为了初始化这个连接,两个主机发送初始SYN包,并且他们都知道是不可能到达目标的,但是它们都可以记住自己的SYN号(个人看法,通过钩子获得发送的数据SYN包)并且可以发送给X,X得到了它们的SYN包,就可以欺骗它们发送ACK包了。有两种方法可以发送无法到达目标的数据包。简单的方法就是每个主机发送一个SYN给对方,要求应答包不会到达内部网络.如果NAT(防火墙)会将应答包传回给内部网络,通常是发送TCP的reset包(RST),如果NAT生成RST包,A和B就不能简单地发送一个向图2中SYN给彼此,因为如果这样NA和NB就无法打洞了呵呵,如果NAT不发送RST包,那么这个TCP连接就不会被中断。另外一个发送无法到达目标网络的SYN包的方法是减小TTL值,使它们无法彼此到达。如果用户无法配置防火墙丢弃这个ICMP应答包,或者NAT不继续传送这个ICMP,这个TCP就不会立即关闭。这个解决方案不能使用一种简单的欺骗,因为我们必须保证源地址的SYN包发送者不会没有收到ICMP的RST包,否则会导致中间设备建立错误路由.仅仅依靠SYN包,NAT就可以建立从internet IP和端口到外部IP和端口的路由.由于欺骗的SYN包是错误的源IP(并非发出者X),这个路由将不会发送到X而是发送到NA或者NB。另外,这种方案都需要设置TTL到足够小,以便于对方的NAT不会收到到各自发出的初始SYN包,否则就无法完成打洞。(图4)

3.3第三种情况
比前两种简单,但是X将无法预见NA或者NB的端口。B将先给X发送一个SYN包告诉以便于X知道它所选用的端口号,然后X将这个信息发送到A,A就可以向这个确定的地址和端口发送SYN,图5是第一种情况的变形::
1)X向图3一样预测端口,但是它不能预测到NA的下一个端口号,但是可以预测NB的下一个端口号是5000,并且可以通知A和B这个节点已经建立了连接;
2)A和B同步节点X;
3)X可以欺骗A和B;
4)A和B相互发送ACK;
5)X丢弃发给它的ACK,因为它已经可以确认它们已经建立连接。

××××××××××××××××
第三种:实现vpn,通过安全的虚拟连接实现,而这样的话就不存在穿透问题,因为vpn是个虚拟网络,tcp在其中是被信任的。

‘捌’ UDP P2P 穿越 NAT 的问题

AB已经通了,你又把AC和BC都打通了,当然是三者都通了。
如果AB通后只把AC或者BC其中一组打通,那么根据Cone NAPT的原则:
只要本地绑定的UDP端口相同, 发出的目的地址不管是否相同, 都使用同一个Session.三者也是通的。
希望你不要碰到Symmetric NAPT

‘玖’ 广域网实现p2p文件传输 如何实现nat穿透 求java或C++源代码

假设有两台分别处于各自的私有网络中的主机:A和B;N1和N2是两个NAT设备;S是一个使用了一个众所周知的、从全球任何地方都能访问得到的IP地址的公共服务器
步骤一:A和B分别和S建立UDP连接;NAT设备N1和N2创建UDP转换状态并分配临时的外部端口号
步骤二:S将这些端口号传回A和B
步骤三:A和B通过转换好的端口直接联系到对方的NAT设备;NAT设备则利用先前创建的转换状态将分组发往A和B

源码已发送请查收

‘拾’ TCP 可以像UDP那样穿透NAT吗 为什么

tcp可靠性保证来源于它的滑动窗口

udp也可以在高层实现类似机制

tcp和udp 都是基于ip 而ip是不可靠协议(尽最大努力传输)。

所以我们在传输层看到tcp 源源不断的将数据传过来 ,其实在网络层说不定有很大一部分包都经过了重传的。

转载的!!!!!!!!!!!!!!!!!!

热点内容
php怎么反编译 发布:2025-01-19 14:10:54 浏览:590
加密货币交易平台排名 发布:2025-01-19 13:58:21 浏览:741
红绿灯的编程 发布:2025-01-19 13:57:37 浏览:113
老男孩linux教程 发布:2025-01-19 13:44:48 浏览:941
买车怎么区分车配置 发布:2025-01-19 13:44:45 浏览:242
丢失缓存视频 发布:2025-01-19 13:44:09 浏览:183
C语言tp 发布:2025-01-19 13:26:20 浏览:107
手机qq改变存储位置 发布:2025-01-19 13:25:17 浏览:83
吃解压海鲜 发布:2025-01-19 13:23:50 浏览:820
sql子表 发布:2025-01-19 13:23:11 浏览:334