美文网首页区块链系统教程
UDP打洞的由来?TCP打洞为什么不常见?

UDP打洞的由来?TCP打洞为什么不常见?

作者: 豆瓣奶茶 | 来源:发表于2018-06-14 20:33 被阅读13次

为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?
假设现在有内网客户端A和内网客户端B,有公网服务端S。
如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。

A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IP, 

S也和A B 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A,
由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发出的数据包之外的则会被丢弃。
所以:现在A B 都能分别和S进行全双工通讯了,但是A B之间还不能直接通讯。

解决办法是:A向B的公网IP发送一个数据包,则NAT-A能接收来自NAT-B的数据包 

并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则
NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。

以上就是“打洞”的原理。 

但是TCP和UDP在打洞上却有点不同。这是因为伯克利socket(标准socket规范)的 

API造成的。
UDP的socket允许多个socket绑定到同一个本地端口,而TCP的socket则不允许。
这是这样一个意思:A B要连接到S,肯定首先A B双方都会在本地创建一个socket,
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。但是如果是TCP的
socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。

相关文章

  • UDP打洞的由来?TCP打洞为什么不常见?

    为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?假设现在有...

  • TCP打洞和UDP打洞的区别

    原文地址: http://f543711700.iteye.com/blog/978887 为什么网上讲到的P2P...

  • Zfund量化套利——区块链从P2P通信开始(区块链从p2p开始

    03 3UDP打洞(UDP hole punching) 第三种P2P通信技术,被广泛采用的,名为“P2P打洞“。...

  • TCP打洞实现

    TCP穿透原理: 我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入...

  • 为什么拆墙打洞

    城市生活有别于农村生活的两个特点就是便利性和多样性。便利性可以从空间和时间两个纬度来讲。举个例子,城市的交通发达,...

  • NAT打洞

    对称型NAT相互之间也可能打洞成功 使用端口预测还有生日攻击算法:https://github.com/jflyu...

  • 关于打洞

    1基本概念 a 内网ip 局域网,网线都是连接在同一个 交换机上面的,也就是说它们的IP地址是由交换机或者路由器进...

  • NTA打洞

    只有一方处于NAT设备后 此种情况是所有P2P场景中最简单的,它使用一种被称为“反向链接技术”来解决这个问题。大致...

  • 5. 计算机指令:让我们试试用纸带编程

    早期计算机程序是通过「打孔卡」来实现的,人们在特定位置上打洞或者不打洞,来表示“0”或者“1”。 那为什么我们每天...

  • 切片法求解立方体打洞问题 - 单个面打洞

    切片法求解立方体打洞问题 - 单个面打洞。 切片法求解立方体打洞问题:5×5×5 的立方体由棱长为1的小立方体组成...

网友评论

    本文标题:UDP打洞的由来?TCP打洞为什么不常见?

    本文链接:https://www.haomeiwen.com/subject/xfdueftx.html