`
- 浏览:
326931 次
- 性别:
- 来自:
成都
-
为什么网上讲到的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了,这样打洞就无法成功。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
UDP打洞测试程序,实现点对点信息传输,C#提供了Sockets来进行套接字的编程,里面包含了TcpClient和UdpClient。用过的大家都知道Tcp发送消息更安全,而Udp传送数据容易丢包,但速度快,能穿越防火墙。目前比较流行的...
- **文件共享**:例如BT下载,利用UDP打洞技术可以提高文件传输的速度和效率。 ##### 3.2 TCP打洞的应用场景 - **即时通讯**:虽然大多数即时通讯软件使用TCP协议,但在某些情况下,TCP打孔可以提供更好的连接稳定...
TCP打洞分为两种主要类型:被动打洞和主动打洞。被动打洞依赖于服务器辅助,其中一个端点(称为客户端A)向公共服务器发送其内网NAT映射的IP和端口,然后服务器将这些信息转发给另一个端点(客户端B)。客户端B收到...
语音即时通信源码(非UDP打洞),协议TCP.
压缩包内的文件名称“TCP参考MakeTCPHole.rar”可能包含了一个关于TCP打洞的示例项目或教程,可能包括了如何构建和配置TCP打洞的步骤以及源代码。“udpp2p.rar”则可能包含了关于使用UDP进行点对点(P2P)通信的源...
TCP打洞是基于传输控制协议(TCP)的,与UDP打洞相比,TCP提供了更可靠的连接,因为它具有错误检测和纠正机制,适合于对数据完整性和顺序敏感的应用,如文件传输、语音通话或视频流。 TCP打洞的关键在于穿越NAT。...
TCP穿越NAT的方法主要分为两种:UDP打洞和TCP打洞。UDP打洞利用了UDP的无状态特性,可以在NAT设备上打开短暂的“洞”以允许数据包通过。然而,TCP打洞则更为复杂,因为TCP维护着连接状态,且NAT设备通常会对TCP连接...
本篇将深入探讨UDP和TCP打洞测试,以及与之相关的P2P(Peer-to-Peer)、Vert.x和Kotlin技术。 首先,UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序、完整性和到达。由于其轻量级特性,UDP常用于实时...
在P2P打洞中,通常有两种主要的方法:UDP打洞和TCP打洞。UDP打洞利用了UDP协议的无状态特性,通过向公网服务器发送数据包,公网服务器可以作为中继,帮助两个内网设备发现彼此的公网映射。TCP打洞则更复杂,因为TCP...
在TCP和UDP打洞中,TCP是一种面向连接的、可靠的传输协议,而UDP则是一种无连接的、不可靠的传输协议。这两种协议各有优缺点,适用于不同的应用场景。TCP适合于需要高可靠性的数据传输,如网页浏览、文件传输等;而...
TCP打洞,也称为UDP打洞或NAT打洞,是一种让两个处于NAT后的设备直接通信的技术。TCP打洞通常分为两种类型:被动模式和主动模式。在被动模式中,设备A首先尝试连接到设备B,B接收连接后,向A的公网IP和端口发送数据...
### UDP打洞原理详解 随着互联网的不断发展以及IPv4地址资源的日益紧张,NAT(Network Address Translation,网络地址转换)设备被广泛应用于解决IP地址不足的问题。然而,NAT设备的存在导致了P2P(Peer-to-Peer,...
本文档介绍了 UDP/TCP 打洞技术的实现原理和步骤,该技术用于穿越 NAT(Network Address Translation,网络地址转换),解决 P2P 通信领域中的 NAT 问题。该技术可以在 UDP 和 TCP 通信领域中应用,实现可靠的 P2P ...
超经典的TCP打洞程度源代码。目前网上的全是UDP打洞,很少有TCP方面的。
2. **UDP打洞与TCP打洞的区别**:虽然TCP打洞比UDP打洞更为复杂,因为TCP的三次握手过程需要正确完成才能建立连接。UDP是无连接的,所以打洞相对简单,但TCP提供更好的可靠性和错误校验。 3. **STUN(Session ...
在UDP打洞中,设备A向STUN/TURN服务器发送请求,服务器会返回A的公网IP和端口信息,然后设备B可以通过这个信息向A发送数据。 在Netty中,实现UDP打洞的关键步骤如下: 1. **创建Netty Channel**: 首先,我们需要...
下面将详细介绍VB中实现UDP打洞的关键步骤和技术要点。 首先,理解UDP协议的基础知识是必要的。UDP(User Datagram Protocol)是一种无连接的传输层协议,它不像TCP那样建立和维护连接,而是简单地发送数据报文。这...
TCP打洞分为客户端(TcpHoleClt)和服务器端(TcpHoleSrv)两部分。在这个场景中,`TCPHoleClt`是发起打洞请求的一方,它试图通过NAT与`TcpHoleSrv`建立连接。`TcpHoleSrv`则是一个公共服务器,它位于NAT外部,能够...
在NAT穿透过程中,主要有两种方法:TCP打洞和UDP打洞。TCP打洞相对复杂,因为TCP的三次握手和状态管理机制,而UDP打洞则相对简单,因为其无连接性。本项目采用的是UDP打洞,具体步骤如下: 1. **建立初始连接**:...