P2P原理之打洞
来源:互联网 发布:软件研发流程 编辑:程序博客网 时间:2024/06/05 03:42
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:
- Full Cone: 把所有来自相同内部的IP地址和端口请求映射到相同的外部IP地址和端口,任何一个外部主机可通过该映射发送IP包到该内部主机。
- Restricted Cone: 把所有来自相同内部的IP地址和端口请求映射到相同的外部IP地址和端口,但只有当内部主机先给IP地址为X的外部主机发送IP包,该外部主机才能向该内部主机发送IP包。
- Port Restricted Cone: 与2类似,但多了端口限制,只有当内部主机先向IP地址为add1,端口号为port1的外部主机发送IP包,该外部主机才能把源端口号为port1的IP包发送给该内部主机。
symmetric NAT:
- 重新分配端口号,即当内部主机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
还有更多的打洞技术,这只是最初使用的。
- P2P原理之打洞
- P2P UPD打洞原理
- P2P UPD打洞原理
- P2P UPD打洞原理
- p2p打洞原理
- P2P UPD打洞原理
- p2p打洞原理
- p2p打洞原理
- P2P打洞原理
- P2P打洞原理
- p2p 打洞原理
- p2p的UDP打洞原理
- p2p打洞stun的原理
- UDT之P2P打洞大法
- P2P通信 原理-UDP打洞方式
- 内网ip打洞-----p2p实现原理
- 内网ip打洞-----p2p实现原理
- 内网ip打洞-----p2p实现原理
- leetcode
- 论文阅读:Deep MANTA: A Coarse-to-fine Many-Task Network for joint 2D and 3D vehicle analysis
- 图像处理——sobel算子
- codefores544D
- 借书
- P2P原理之打洞
- 1到N中1出现的个数
- MySQL学习笔记--MySQL编程
- 函数模板与函数重载
- github用法笔记
- 解决用户的显性需求与隐性需求的SEO文章规范策略技巧
- Android入门之在子线程中更新UI
- 交直流配电网软件
- mybatis mapper映射配置时间类型对应oracle,java里的Date 类型 TIMESTAMP