当前位置:首页 > 代码 > 正文

tcp穿透nat代码(tcp nat)

admin 发布:2022-12-19 03:47 107


本篇文章给大家谈谈tcp穿透nat代码,以及tcp 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(卡耐基梅隆)牛人们的研究:

××××××××××××××××

原文:

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

摘要

防火墙和网络地址转换(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在其中是被信任的。

如何让IdTCPServer&IdTCPClient的应用穿透NAT

让IdTCPServerIdTCPClient的应用穿透NAT?

2007-03-15 22:35:28| 分类: delphi程序备忘 |字号 订阅

IdTCPServer拥有公网IP和开放的端口,

IdTCPClient位于NAT之后,没法端口映射,

但是由IdTCPClient主动发起连接,连接之后互相传递文件.

在IdTCPClient的属性里BoundIP和BoundPort不用填,使用如下代码就能穿透NAT连接IdTCPServer:

IdTCPClient.Host := ‘0.0.0.0’;//IdTCPServer公网IP

IdTCPClient.Port := 0; //IdTCPServer的端口

try

IdTCPClient.Connect();

except

IdTCPClient.Disconnect;

exit;

end;

要注意的是,IdTCPServer一定要在拥有公网IP的机子上运行,这样可以使得世界任何地方的电脑用上述代码就能跟IdTCPServer相连接,

连接上后,可以用IdTCPServer的OnConnect取得IdTCPClient经过NAT转换后的IP和Port,代码如下:

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);

begin

IP := AThread.Connection.Socket.Binding.PeerIP ;

Port := AThread.Connection.Socket.Binding.PeerPort;

end;

使用IdTCPServer的OnConnect获得的IP和Port才能与IdTCPClient通讯。

你会发现OnConnect里获得的IP和Port和未经过NAT转换后的IdTCPClient的机子的IP和Port大不一样。

TCP、UDP穿透NAT

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

A与B的IP不相同的话,

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

A - 发送打洞请求给C

C - 发送命令给B,B接到命令后

B - 发送打洞回应消息给A,一直尝试N次

如果A能接受到B的回应,就通了。

不知道描述的对不对。

Java实现TCP穿透NAT技术该怎么实现

貌似tcp是不能穿透nat的。所谓的实现都是模拟实现的,而且也不稳定。想穿透,除非采用客户端发起长连接请求的方式。

tcp穿透nat代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于tcp nat、tcp穿透nat代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/1910.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载