关于 NAT 打洞的问题
假如这个时候CLIENTA想与CLIENTB建立一条UDP通信直连,如果CLIENTA只是简单的发送一个UDP信息到CLIENTB的公网地址138.76.29.7:310...
假如这个时候 CLIENT A 想与 CLIENT B建立一条UDP通信直连,如果 CLIENT A只是简单的发送一个UDP信息到CLIENT B的公网地址138.76.29.7:31000的话,NAT B会不加考虑的将这个信息丢弃(除非NAT B是一个 full cone NAT),因为 这个UDP信息中所包含的地址信息,与CLIENT B和服务器S建立连接时存储在NAT B中的服务器S的地址信息不符。同样的,CLIENT B如果做同样的事情,发送的UDP信息也会被 NAT A 丢弃。
假如 CLIENT A 开始发送一个 UDP 信息到 CLIENT B 的公网地址上,与此同时,他又通过S中转发送了一个邀请信息给CLIENT B,请求CLIENT B也给CLIENT A发送一个UDP信息到 CLIENT A的公网地址上。这时CLIENT A向CLIENT B的公网IP(138.76.29.7:31000)发送的信息导致 NAT A 打开一个处于 CLIENT A的私有地址和CLIENT B的公网地址之间的新的通信会话,与此同时,NAT B 也打开了一个处于CLIENT B的私有地址和CLIENT A的公网地址(155.99.25.11:62000)之间的新的通信会话。一旦这个新的UDP会话各自向对方打开了,CLIENT A和CLIENT B之间就可以直接通信,而无需S来牵线搭桥了。(这就是所谓的打洞技术)!
我有几个疑问:
1、CLIENT A 与 CLIENT B互相向对方公网发送一条数据就可以直连了?发送的端口是什么?是CLIENTA 和 CLIENT B 发送给CLIENT S时的端口吗?
2、直连后,是不是CLIENT A和CLIENT S都可以同时使用同一个外网端口与CLIENT B 发送数据,而不被路由器丢弃呢??
3、比如 CLIENT A使用1234端口 发送数据给 CLIENT S ,再发送数据给CLIENT B ,两次发送使用的外网端口是否一致呢??
只能用UDP打洞么?TCP不可以打洞??利用UDP打洞成功后 可否使用TCP来进行传输呢?? 展开
假如 CLIENT A 开始发送一个 UDP 信息到 CLIENT B 的公网地址上,与此同时,他又通过S中转发送了一个邀请信息给CLIENT B,请求CLIENT B也给CLIENT A发送一个UDP信息到 CLIENT A的公网地址上。这时CLIENT A向CLIENT B的公网IP(138.76.29.7:31000)发送的信息导致 NAT A 打开一个处于 CLIENT A的私有地址和CLIENT B的公网地址之间的新的通信会话,与此同时,NAT B 也打开了一个处于CLIENT B的私有地址和CLIENT A的公网地址(155.99.25.11:62000)之间的新的通信会话。一旦这个新的UDP会话各自向对方打开了,CLIENT A和CLIENT B之间就可以直接通信,而无需S来牵线搭桥了。(这就是所谓的打洞技术)!
我有几个疑问:
1、CLIENT A 与 CLIENT B互相向对方公网发送一条数据就可以直连了?发送的端口是什么?是CLIENTA 和 CLIENT B 发送给CLIENT S时的端口吗?
2、直连后,是不是CLIENT A和CLIENT S都可以同时使用同一个外网端口与CLIENT B 发送数据,而不被路由器丢弃呢??
3、比如 CLIENT A使用1234端口 发送数据给 CLIENT S ,再发送数据给CLIENT B ,两次发送使用的外网端口是否一致呢??
只能用UDP打洞么?TCP不可以打洞??利用UDP打洞成功后 可否使用TCP来进行传输呢?? 展开
2个回答
展开全部
一个简单的问题,说的太复杂了,就是NAT的端口映射问题。
你没理解NAT到底什么。在IPV4协议里,使用了32位的地址,结果就是一共有4G个不同的地址,当时设计的时候觉得这个地址空间足够大了,不可能用完,但是结果是,现在居然就快消耗空了,所以就必须得想另外一个办法来控制IP地址增长过快,就有人想了一个大家共享一个IP地址,然后用端口和区分不同实际用户的方案,好了,这个就是后来产生的NAT。
NAT运作的方式很简单,一般是直接集成在路由器里了,内网的用户对外全部是一个IP地址,那就有个问题了,假如大家用同一个协议,比如HTTP,那么端口大家一样了,就产生了冲突,因为外网的接收方都会把回复发到路由器的同一个端口,那NAT就不知道这个到底是给谁的。解决办法,大家用不同端口,NAT维护一个表,不同端口对应内网不同IP地址+端口,每当NAT收到外面的包时,检查端口,然后去查询这个表,找到对应的内网机器和端口。这个端口必须由内网的机器主动来申请,意思是,内网对外访问时,NAT为内网的用户分配不同的端口号(有一个时间,超过时长就会失效,又需要重新申请,如果一直占用,就是永久的端口映射了),具体是什么连接,这个无所谓,所以你UDP和TCP这个自然都是可以的,NAT根本不关心你是什么连接,他只管根据不同端口转发数据。
说问题了
1.假如A和B在位于不同的内网下,连接不上,除非有一个机器已经占有了一个端口了(可以是端口映射,也可以是有一个台机器已经对外和某个有独立公网Ip的机器主动连接了,导致NAT里有它的项),一般这种情况下连接是需要一个中继器,即一个有公网IP的机器转发。
2.当然可以,大家机器不同的嘛
3.可以不同也可以相同,取决于你A发送给S是不是放弃掉1245端口了。
你没理解NAT到底什么。在IPV4协议里,使用了32位的地址,结果就是一共有4G个不同的地址,当时设计的时候觉得这个地址空间足够大了,不可能用完,但是结果是,现在居然就快消耗空了,所以就必须得想另外一个办法来控制IP地址增长过快,就有人想了一个大家共享一个IP地址,然后用端口和区分不同实际用户的方案,好了,这个就是后来产生的NAT。
NAT运作的方式很简单,一般是直接集成在路由器里了,内网的用户对外全部是一个IP地址,那就有个问题了,假如大家用同一个协议,比如HTTP,那么端口大家一样了,就产生了冲突,因为外网的接收方都会把回复发到路由器的同一个端口,那NAT就不知道这个到底是给谁的。解决办法,大家用不同端口,NAT维护一个表,不同端口对应内网不同IP地址+端口,每当NAT收到外面的包时,检查端口,然后去查询这个表,找到对应的内网机器和端口。这个端口必须由内网的机器主动来申请,意思是,内网对外访问时,NAT为内网的用户分配不同的端口号(有一个时间,超过时长就会失效,又需要重新申请,如果一直占用,就是永久的端口映射了),具体是什么连接,这个无所谓,所以你UDP和TCP这个自然都是可以的,NAT根本不关心你是什么连接,他只管根据不同端口转发数据。
说问题了
1.假如A和B在位于不同的内网下,连接不上,除非有一个机器已经占有了一个端口了(可以是端口映射,也可以是有一个台机器已经对外和某个有独立公网Ip的机器主动连接了,导致NAT里有它的项),一般这种情况下连接是需要一个中继器,即一个有公网IP的机器转发。
2.当然可以,大家机器不同的嘛
3.可以不同也可以相同,取决于你A发送给S是不是放弃掉1245端口了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
16875人正在获得一对一解答
合肥云端漫步2分钟前提交了问题
南京彩虹之旅3分钟前提交了问题
长春极地风情4分钟前提交了问题