P2P原理之打洞

http://www.cppblog.com/peakflys/archive/2013/01/25/197562.html
https://www.usenix.org/legacy/event/usenix05/tech/general/full_papers/ford/ford_html/

IPv4分配的地址有限,满足不了现在的需求,而IPv6又不能直接向下兼容,所以有了NAT,网络地址转换协议。
公网IP一般都是固定IP,而我们家庭一般使用的都不是固定的,也不需要,因为我们也不是无时无刻都在上网(与外网连接),所以一般运营商才有固定IP。而我们的IP地址只是子网中的一个私有地址,NAT就是负责在我们连接外网时,对地址进行转换。(路由器也内含了NAT功能)
NAT解决了IP地址不够的问题,但在P2P中,却造成了新的问题。(内网可能无法被外网的程序主动连接)
在P2P传输中,若A向B传数据,需要知道B的IP地址和端口号,而在NAT实现中,有这四种情况:
Cone NAT:

  1. Full Cone: 把所有来自相同内部的IP地址和端口请求映射到相同的外部IP地址和端口,任何一个外部主机可通过该映射发送IP包到该内部主机。
  2. Restricted Cone: 把所有来自相同内部的IP地址和端口请求映射到相同的外部IP地址和端口,但只有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才能向该内部主机发送IP包。
  3. Port Restricted Cone: 与2类似,但多了端口限制,只有当内部主机先向IP地址为add1,端口号为port1的外部主机发送IP包,该外部主机才能把源端口号为port1的IP包发送给该内部主机。

symmetric NAT:

  1. 重新分配端口号,即当内部主机A和外部B通信,对外使用端口号port1,而当内部主机A与其他外部如C通信,对外使用的端口号会更换。

在P2P传输中,若A和B都在内网中,且采用的不是Full Cone,A想发信息给B是做不到的,这时需要一个中间人C,其事先与A、B进行过通信,当A想发信息给B,A要请求C,然后C请求B向A的外网IP发送一个UDP包,这样A就能向B发信息了。这个发包的过程就是打洞。

但是如果双方采用的是symmetric NAT的实现,且更换端口号不是直接按顺序增加的,那不管是C还是A,都不知道B新分配的外网的端口号是多少,哪怕C要求B将新的端口号告知C,C再告知A,当A向B发信息时,A又用了一个新的端口号(因为B的端口是新的了,虽然IP地址没变),这时A到达B的NAT时,会因为A用了新的端口号而丢弃这个包,所以还是发不了信息,如此死循环。那么symmetric NAT怎么打洞呢?(未完待续)

上面讨论的都是双方使用相同的NAT实现,A, B分别使用不同的NAT实现也能推导出来,就不细说了。

https://www.zhihu.com/question/20436734

还有更多的打洞技术,这只是最初使用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值