大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
假设有两台分别处于各自的私有网络中的主机:A和B;N1和N2是两个NAT设备;S是一个使用了一个众所周知的、从全球任何地方都能访问得到的IP地址的公共服务器
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名、虚拟空间、营销软件、网站建设、沙雅网站维护、网站推广。
步骤一:A和B分别和S建立UDP连接;NAT设备N1和N2创建UDP转换状态并分配临时的外部端口号
步骤二:S将这些端口号传回A和B
步骤三:A和B通过转换好的端口直接联系到对方的NAT设备;NAT设备则利用先前创建的转换状态将分组发往A和B
源码已发送请查收
ip nat inside source list 访问列表标号 pool 内部合法地址池名字
ip nat inside destination static10.106.1.16 172.1.1.15
将外部局部地址转换为外部全局地址
nat inside destination static tcp 10.106.1.16 21 172.1.1.11 21
将外部局部端口21转换为外部全局端口21
在示例中好理解,建议结合实际操作好掌握。以下网上找的。。。
NAT 具体命令理解
1,由内向外的转换,在路由器的inside口处发生了NAT转换行为
r1-2514(config)#ip nat inside ?
destination Destination address translation
source Source address translation
从上面可以看出,在inside边可以对数据包中的源地址或者目标地址进行转换.
r1-2514(config)#ip nat inside source ?
list Specify access list describing local addresses
route-map Specify route-map
static Specify static local-global mapping
从上面可以看出,针对源地址进行转换可以使用acl 或者 route-map来表述一个本地地址,意思是数据包中源地址符合这些的都要被转换. 也可以使用static进行静态映射,指定一个静态的从本地到全局的映射.
r1-2514(config)#ip nat inside source list 1 ?
interface Specify interface for global address
pool Name pool of global addresses
从上面输出可以看出接下来要给一个全局地址,数据包中的源地址将被这个全局地址替代.
对于静态映射,还可以指定协议 端口号:
When translating addresses to an interface's address, outside-initiated connections to services on the inside network (like mail) will require additional configuration to send the connection to the correct inside host. This command allows the user to map certain services to certain inside hosts.
ip nat inside source static { tcp | udp } localaddr localport globaladdr globalport
Example:
ip nat inside source static tcp 192.168.10.1 25 171.69.232.209 25
In this example, outside-initiated connections to the SMTP port (25) will be sent to the inside host 192.168.10.1.
在inside边对目标进行转换:
r1-2514(config)#ip nat inside destination ?
list Specify access list describing global addresses
从上面输出可以看出,路由器要求输入一个表示全局地址的ACL
r1-2514(config)#ip nat inside destination list 1 ?
pool Name pool of local addresses
pool Name pool of local addresses
接着要求输入一个本地地址池
所以这是一个针对从outside向inside方向数据的NAT,凡是在这个方向数据包中目标地址符合ACL描述的全部被转换成POOL中的本地地址.这可以被用来进行TCP的负载均衡,即外部都请求同一个全局地址,而在路由器的inside边,这些请求的目标地址全部被转换成地址池中的地址,而且是循环使用地址池中的地址,从而达到负载均衡,但是这种方法只适合TCP流,同时不适宜用在WEB服务的负载均担上.详细解释看这里:
Destination Address Rotary Translation
A dynamic form of destination translation can be configured for some outside-to-inside traffic. Once a mapping is set up, a destination address matching one of those on an access list will be replaced with an address from a rotary pool. Allocation is done in a round-robin basis, performed only when a new connection is opened from the outside to the inside. All non-TCP traffic is passed untranslated (unless other translations are in effect).
This feature was designed to provide protocol translation load distribution. It is not designed nor intended to be used as a substitute technology for Cisco's LocalDirector product. Destination address rotary translation should not be used to provide web service load balancing because, like vanilla DNS, it knows nothing about service availability. As a result, if a web server were to become offline, the destination address rotary translation feature would continue to send requests to the downed server.
2.由外向内,在OUTSIDE边发生的行为:
r1-2514(config)#ip nat outside ?
source Source address translation
从上面可以看出在OUTSIDE边,只能对数据包中的源地址转换
r1-2514(config)#ip nat outside source ?
list Specify access list describing global addresses
route-map Specify route-map
static Specify static global-local mapping
从上面可以看出接下来路由器要求给定一个全局地址的描述,可以是ACL route-map 或者 静态的.
r1-2514(config)#ip nat outside source list 1 ?
pool Name pool of local addresses
从上面可以看出,路由器接着又要求给定一个本地地址,这说明 这个命令是对从外到内的数据包,进行源地址字段的替换,它将外部全局地址转换成内部地址(内部本地或者内部全局,内部本地和内部全局可以相同也可以不同)
ip nat outside source { list acl pool name | static global-ip local-ip }
The first form (list..pool..) enables dynamic translation. Packets from addresses that match those on the simple access list are translated using local addresses allocated from the named pool.
The second form (static) of the command sets up a single static translation.
一个例子:
CONFIGURATION EXAMPLES
The following sample configuration translates between inside hosts addressed from either the 192.168.1.0 or 192.168.2.0 nets to the globally-unique 171.69.233.208/28 network.
ip nat pool net-20 171.69.233.208 171.69.233.223 netmask netmask 255.255.255.240
ip nat inside source list 1 pool net-20
!
interface Ethernet0
ip address 171.69.232.182 255.255.255.240
ip nat outside
!
interface Ethernet1
ip address 192.168.1.94 255.255.255.0
ip nat inside
!
access-list 1 permit 192.168.1.0 0.0.0.255
access-list 1 permit 192.168.2.0 0.0.0.255
The next sample configuration translates between inside hosts addressed from the 9.114.11.0 net to the globally unique 171.69.233.208/28 network. Packets from outside hosts addressed from 9.114.11.0 net (the "true" 9.114.11.0 net) are translated to appear to be from net 10.0.1.0/24.
ip nat pool net-20 171.69.233.208 171.69.233.223 netmask netmask 255.255.255.240
定义一个名称为 net-20的内部全局地址池
ip nat pool net-10 10.0.1.0 10.0.1.255 netmask netmask 255.255.255.0
定义一个名称为net-10的外部本地地址池
ip nat inside source list 1 pool net-20
ip nat outside source list 1 pool net-10
注意inside /outside全部调用了list 1 这说明 内外两边的源地址是重叠地址,通过将内部的源地址转换成net-20中地址和外部的9.114.11.0网络通信。将外部的源地址转换成net-10中的地址来与内部这边的9.114.11.0网络通信
!
interface Ethernet0
ip address 171.69.232.182 255.255.255.240
ip nat outside
!
interface Ethernet1
ip address 9.114.11.39 255.255.255.0
ip nat inside
!
access-list 1 permit 9.114.11.0 0.0.0.255
Private Sub Command1_Click()
Dim b As Variant, a As Variant
b = Array(1, 3, 5, 7, 9)
For i = 0 To (5 - 1) \ 2
a = b(i)
b(i) = b(4 - i)
b(4 - i) = a
Next i
For i = 0 To 4
Print b(i)
Next i
End Sub
代码你没给全,我写了个
这个分几种情况的
先说说前提
聊天软件需要一个服务器存放客户端列表吧
只要客户端是在线的,那客户端与服务端必须是处于连接状态(这样服务器就可以作为客户端的中间人)
在这里Server(为服务端),Client A(客户端1)Client B(客户端2)
1,Client A是外网,Client B是外网 这种情况很简单,Client A只要从服务器端得到Client B的信息(IP与登记的端口)就能够建立连接
2,Client A是外网,Client B是内网 这种情况稍复杂,Client A连接Client B会失败,这时,Client A向Server发出请求,这时,Server通知Client B,让Client B连接Client A.. 因为Client A是外网机器,所以这样也就建立连接了
3,Client A与Client B都在内网,p2p关键是在这里,
当Client A连接Client B失败,Client A向Server发出请求,Server通知Client B对Client A进行连接,这时Client B他能连接上Client A!但是,如果刚才Client A没有连接Client B,那现在的Client B就连接不上Client A!反之:这里重新再来啊,Client B连接Client A失败,Client B向Server发出请求,Server通知Client A连接Client B,这时Client A也能连接上Client A!
在这里需要说一下NAT(网络地址转换),就是当内网用户连接外网时,NAT可以可以将内网地址转换成公网的IP地址与外网进行通信,但外网有数据返进入内网时,有两种可能(如果前面内网有向这个外网地址发送过数据包,那么NAT会把这个外网的连接转换为刚刚发送过数据包的内网地址)
再回来说前面的,Client A为什么会连接Client B失败?,因为Client A的数据包到达Client B的NAT时被丢弃了,而这时,Client B为什么又如何能连接Client A成功呢,因为当Client B的数据包到达Client A的NAT时,NAT检测到刚刚Client A有发送过数据包到Client B,这个时候NAT会将这个连接转换到Client A上去... 这样就连接成功了
说着我都有点晕了.不知道你看着会不会晕..- -!看着晕慢慢看吧..CSDN中有VB版的UDP打洞例子,你找下...
我们知道内网ip和外网ip可能不同,这涉及到“网络地址转换”(NAT)。
事实上,*只有*和公网联络才有可能获取外网ip地址,直接用winsock的localip属性,或者ipconfig之类的方法(在内外网ip不同的情况下)获取的都是内网ip!
获取外网ip可以用你说的ip138网页的方式,可以通过winsock、inet、xmlhttp、webbrowser等组件来获取远程服务器返回的数据,即外网ip——从服务器的角度看的你的ip地址。此外也可以使用STUN协议。总之,这些方法都需要处在外网的服务器,因为NAT设备是不会让内网主机获取其ip映射表的。
我可以实现上述提到的每一种获取外网ip的方法。如有需要请追问