建站哪家好wordpress,怎样设计app软件,东莞化工网站建设,山东省职业能力建设处网站网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术#xff0c;是一种将私有#xff08;保留#xff09;地址转化为合法IP地址的转换技术。下面介绍两类不同方式实现的NAT#xff1a;NAT(Network Address Translators)#xff1a;称为基本的NAT在客户机… 网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术是一种将私有保留地址转化为合法IP地址的转换技术。下面介绍两类不同方式实现的NATNAT(Network Address Translators)称为基本的NAT在客户机时 192.168.0.8:4000——6.7.8.9:8000在网关时 1.2.3.4:4000——6.7.8.9:8000服务器C 6.7.8.9:8000其核心是替换IP地址而不是端口这会导致192.168.0.8使用4000端口后192.168.0.9如何处理具体参考RFC 1631基本上这种类型的NAT设备已经很少了。或许根本我们就没机会见到。2. NAPT(Network Address/Port Translators)其实这种才是我们常说的 NATNAPT的特点是在网关时会使用网关的 IP但端口会选择一个和临时会话对应的临时端口。如下图在客户机时 192.168.0.8:4000——6.7.8.9:8000在网关时 1.2.3.4:62000——6.7.8.9:8000服务器C 6.7.8.9:8000网关上建立保持了一个1.2.3.4:62000的会话用于192.168.0.8:4000与6.7.8.9:8000之间的通讯。对于NAPT又分了两个大的类型差别在于当两个内网用户同时与8000端口通信的处理方式不同 2.1、Symmetric NAT型 (对称型)在客户机时 192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000在网关时两个不同session但端口号不同 1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62001——6.7.8.10:8000服务器C 6.7.8.9:8000服务器 D 6.7.8.10:8000这种形式会让很多p2p软件失灵。 2.2、Cone NAT型圆锥型在客户机时 192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000在网关时两个不同session但端口号相同 1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62000——6.7.8.10:8000服务器C 6.7.8.9:8000服务器D 6.7.8.10:8000目前绝大多数属于这种。Cone NAT又分了3种类型a)Full Cone NAT完全圆锥型从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000 192.168.0.8可以收到任意外部主机发到1.2.3.4:62000的数据报。b)Address Restricted Cone NAT 地址限制圆锥型从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000只有当内部主机192.168.0.8先给服务器C 6.7.8.9发送一个数据报后192.168.0.8才能收到6.7.8.9发送到1.2.3.4:62000的数据报。c)Port Restricted Cone NAT端口限制圆锥型从同一私网地址端口192.168.0.8:4000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:62000只有当内部主机192.168.0.8先向外部主机地址端口6.7.8.98000发送一个数据报后192.168.0.8才能收到6.7.8.98000发送到1.2.3.4:62000的数据报。 穿越NAT的实现A1在客户机时 192.168.0.8:4000——6.7.8.9:8000X1在网关时 1.2.3.4:62000——6.7.8.9:8000服务器C 6.7.8.9:8000B1在客户机时 192.168.1.8:4000——6.7.8.9:8000Y1在网关时 1.2.3.5:31000——6.7.8.9:8000两内网用户要实现通过各自网关的直接呼叫需要以下过程1、 客户机A1、B1顺利通过格子网关访问服务器C 均没有问题类似于登录2、 服务器C保存了 A1、B1各自在其网关的信息1.2.3.4:62000、1.2.3.5:31000没有问题。并可将该信息告知A1、B2。3、 此时A1发送给B1网关的1.2.3.5:31000是否会被B1收到答案是基本上不行除非Y1设置为完全圆锥型但这种设置非常少因为Y1上检测到其存活的会话中没有一个的目的IP或端口于1.2.3.4:62000有关而将数据包全部丢弃4、 此时要实现A1、B1通过X1、Y1来互访需要服务器C告诉它们各自在自己的网关上建立“UDP隧道”即命令A1发送一个 192.168.0.8:4000——1.2.3.5:31000的数据报B1发送一个192.168.1.8:4000——1.2.3.4:62000的数据报UDP形式这样X1、Y1上均存在了IP端口相同的两个不同会话很显然这要求网关为Cone NAT型否则对称型Symmetric NAT设置网关将导致对不同会话开启了不同端口而该端口无法为服务器和对方所知也就没有意义。5、 此时A1发给Y1或者B1发给X1的数据报将不会被丢弃且正确的被对方收到.综合P2P可实现的条件需要1、 中间服务器保存信息、并能发出建立UDP隧道的命令2、 网关均要求为Cone NAT类型。Symmetric NAT不适合。3、 完全圆锥型网关可以无需建立udp隧道但这种情况非常少要求双方均为这种类型网关的更少。4、 假如X1网关为Symmetric NAT Y1为Address Restricted Cone NAT 或Full Cone NAT型网关各自建立隧道后A1可通过X1发送数据报给Y1到B1(因为Y1最多只进行IP级别的甄别)但B2发送给X1的将会被丢弃因为发送来的数据报中端口与X1上存在会话的端口不一致虽然IP地址一致所以同样没有什么意义。5、 假如双方均为Symmetric NAT的情形新开了端口对方可以在不知道的情况下尝试猜解也可以达到目的但这种情形成功率很低且带来额外的系统开支不是个好的解决办法。6、 不同网关型设置的差异在于对内会采用替换IP的方式、使用不同端口不同会话的方式使用相同端口不同会话的方式对外会采用什么都不限制、限制IP地址、限制IP地址及端口。7、 这里还没有考虑同一内网不同用户同时访问同一服务器的情形如果此时网关采用AddressRestricted Cone NAT 或Full Cone NAT型有可能导致不同用户客户端可收到别人的数据包这显然是不合适的。 UDP和TCP打洞为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞难道TCP不可能打洞还是TCP打洞难于实现 假设现在有内网客户端A和内网客户端B有公网服务端S。 如果A和B想要进行UDP通信则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。 A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IPS也和A B 分别建立了会话由S发到NAT-A的数据包会被NAT-A直接转发给A由S发到NAT-B的数据包会被NAT-B直接转发给B除了S发出的数据包之外的则会被丢弃。所以现在A B 都能分别和S进行全双工通讯了但是A B之间还不能直接通讯。 解决办法是A向B的公网IP发送一个数据包则NAT-A能接收来自NAT-B的数据包并转发给A了即B现在能访问A了再由S命令B向A的公网IP发送一个数据包则NAT-B能接收来自NAT-A的数据包并转发给B了即A现在能访问B了。以上就是“打洞”的原理。为了保证A的路由器有与B的sessionA要定时与B做心跳包同样B也要定时与A做心跳这样双方的通信通道都是通的就可以进行任意的通信了。 但是TCP和UDP在打洞上却有点不同。这是因为伯克利socket标准socket规范的API造成的。 UDP的socket允许多个socket绑定到同一个本地端口而TCP的socket则不允许。 这是这样一个意思A B要连接到S肯定首先A B双方都会在本地创建一个socket去连接S上的socket。创建一个socket必然会绑定一个本地端口就算应用程序里面没写端口实际上也是绑定了的至少java确实如此假设为8888这样A和B才分别建立了到S的通信信道。接下来就需要打洞了打洞则需要A和B分别发送数据包到对方的公网IP。但是问题就在这里因为NAT设备是根据端口号来确定session如果是UDP的socketA B可以分别再创建socket然后将socket绑定到8888这样打洞就成功了。但是如果是TCP的socket则不能再创建socket并绑定到8888了这样打洞就无法成功。UDP打洞的过程大致如此 1、双方都通过UDP与服务器通讯后网关默认就是做了一个外网IP和端口号 与你内网IP与端口号的映射这个无需设置的服务器也不需要知道客户的真正内网IP 2、用户A先通过服务器知道用户B的外网地址与端口 3、用户A向用户B的外网地址与端口发送消息 4、在这一次发送中用户B的网关会拒收这条消息因为它的映射中并没有这条规则。 5、但是用户A的网关就会增加了一条允许规则允许接收从B发送过来的消息 6、服务器要求用户B发送一个消息到用户A的外网IP与端口号 7、用户B发送一条消息这时用户A就可以接收到B的消息而且网关B也增加了允许规则 8、之后由于网关A与网关B都增加了允许规则所以A与B都可以向对方的外网IP和端口号发送消息。TCP打洞技术tcp打洞也需要NAT设备支持才行。tcp的打洞流程和udp的基本一样但tcp的api决定了tcp打洞的实现过程和udp不一样。tcp按cs方式工作一个端口只能用来connect或listen所以需要使用端口重用才能利用本地nat的端口映射关系。设置SO_REUSEADDR在支持SO_REUSEPORT的系统上要设置这两个参数。连接过程以udp打洞的第2种情况为例典型情况nat后的两个peerA和BA和B都bind自己listen的端口向对方发起连接connect即使用相同的端口同时连接和等待连接。因为A和B发出连接的顺序有时间差假设A的syn包到达B的nat时B的syn包还没有发出那么B的nat映射还没有建立会导致A的连接请求失败连接失败或无法连接如果nat返回RST或者icmp差错api上可能表现为被RST有些nat不返回信息直接丢弃syn包反而更好应用程序发现失败时不能关闭socketclosesocket可能会导致NAT删除端口映射隔一段时间1-2s后未连接还要继续尝试但后发B的syn包在到达A的nat时由于A的nat已经建立的映射关系B的syn包会通过A的nat被nat转给A的listen端口从而进去三次握手完成tcp连接。从应用程序角度看连接成功的过程可能有两种不同表现以上述假设过程为例1、连接建立成功表现为A的connect返回成功。即A端以TCP的同时打开流程完成连接。2、A端通过listen的端口完成和B的握手而connect尝试持续失败应用程序通过accept获取到连接最终放弃connect这时可closesocket(conn_fd)。多数Linux和Windows的协议栈表现为第2种。但有一个问题是建立连接的client端其connect绑定的端口号就是主机listen的端口号或许这个peer后续还会有更多的这种socket。虽然理论上说socket是一个五元组端口号是一个逻辑数字传输层能够因为五元组的不同而区分开这些socket但是是否存在实际上的异常还有待更多观察。另外的问题1、Windows XP SP2操作系统之前的主机这些主机不能正确处理TCP同时开启或者TCP套接字不支持SO_REUSEADDR的参数。需要让AB有序的发起连接才可能完成。上述tcp连接过程仅对NAT1、2、3有效对NAT4对称型无效。由于对称型nat通常采用规律的外部端口分配方法对于nat4的打洞可以采用端口预测的方式进行尝试。一些现在常用的技术ALG应用层网关它可以是一个设备或插件用于支持SIP协议主要类似与在网关上专门开辟一个通道用于建立内网与外网的连接也就是说这是一种定制的网关。更多只适用于使用他们的应用群体内部之间。UpnP它是让网关设备在进行工作时寻找一个全球共享的可路由IP来作为通道这样避免端口造成的影响。要求设备支持且开启upnp功能但大部分时候这些功能处于安全考虑是被关闭的。即时开启实际应用效果还没经过测试。STUNSimple Traversalof UDP Through Network这种方式即是类似于我们上面举例中服务器C的处理方式。也是目前普遍采用的方式。但具体实现要比我们描述的复杂许多光是做网关Nat类型判断就由许多工作RFC3489中详细描述了。TURN(Traveral Using Relay NAT)该方式是将所有的数据交换都经由服务器来完成这样NAT将没有障碍但服务器的负载、丢包、延迟性就是很大的问题。目前很多游戏均采用该方式避开NAT的问题。这种方式不叫p2p。ICE(Interactive Connectivity Establishment)是对上述各种技术的综合但明显带来了复杂性。