SOCKET 实现NAT 穿越

本文介绍了在NAT环境中实现P2P连接的困难,重点讲解了NAT的工作原理和UDP打洞技术用于NAT穿越的过程。通过中介服务器交换NAT后的IP和端口信息,设备尝试建立连接,分析了不同情况下连接的成功与失败原因,并提供了实际的程序实现示例。
摘要由CSDN通过智能技术生成

在当前IPv4NAT盛行的网络环境下,两个用户要直接进行P2P连接是非常困难的。较好的解决办法是借助含公网的用户或是服务器中介实现P2P连接。

    NAT:Network Address Translation,网络地址转换。由于IPv4地址数量十分有限,不可能每一台网络设备都能拥有一个IP。于是NAT技术很好地解决了这个问题。路由设备被ISP分给一个公网地址,路由设备自己生成另外的局域网地址,局域网内部的信息通过路由器的网络地址转换,实现内部网络与外部网络的通信。

    对于通常的NAT,当一个内部地址向外部某个网络发送信息:当信息到达NAT设备,NAT设备会首先查询自己的地址转换表。看是否有该内部地址-端口的地址转换表,如果没有,路由器会分配给该地址-端口一个可用的外网端口,并记录在地址转换表中。发送的数据包的源地址会修改为NAT设备的公网地址,端口会变为分配的端口(注意,是直接把IP头部的内容修改了,外部网络是没办法从协议头中知道NAT内部主机的地址的), 然后发送至指定的外部地址。

    外部的数据发往内部的某个地址:刚才提到了,外部网络几乎是不知道目的内网的地址的。他只知道该公网路由器的IP和端口(这种情况都是因为内部实现联络了外网才有外部向该内网通信)。外网只关心之前路由器发给他的数据是哪个地址哪个端口。发送信息就朝着这个地址和端口发送。因为NAT设备上有相应的地址转换表。发往改端口的数据会映射到内网的对应地址和端口。

    

    当内网的设备向外网发送数据,NAT设备会使用公网IP以及自己分配的端口为内网设备转发以及接收数据。生成的转换表有会有一定的时限。大多数路由器接收数据要按照内部的地址信任表来,即:内网设备A通过NAT设备S发送至外网设备B,B可以根据S发送过来的端口发给S然后转到A。但是网络中另一个知道A在NAT上的地址与端口的设备C缺不能通过该端口通过S发送到A。因为A没有给C发送数据,路由器S并不信任C只信任B。但如果此时A再向C发送数据,此时就能使得S添加对C的信任,使得C能够通过S发送数据到A。

    通过上面的这种理论,我们就能实现不同NAT间的网络穿越。我们需要利用一个中介服务器来传递需要连接的设备在NAT设备上的IP与端口信息。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值