首页 > 编程知识 正文

钉扎作用,打孔公式

时间:2023-05-03 08:07:13 阅读:115488 作者:4079

3358www.Sina.com/在传统的什么是打洞?网络中,与服务端通信或与其他客户端通信的一台服务器(集群)向外部提供服务。 在这种通信方式中,从一个客户端到另一个客户端的分组发送在服务端集中式,服务端压力非常大,容易因线程问题而崩溃。 因此,作为另一种通信方式,在P2P通信(peer to peer )依赖中央服务器、即P2P的网络中,所有的网络节点为进行中转一个节点3358www.Sina.com/例如BT下载工具在下载的同时也向其他节点提供下载通信模式。 即,能够在客户端间进行3358 ww P2P的通信模式理想,但需要解决一些问题1 .在客户端通信之前,必须知道对等通信的公共网IP和端口port 2 客户端的p2p通信数据包对于http://www.Sina.com/(networkaddresstranslate )网络地址翻译解决方案1 .第一个问题必须相对简单。 第二个问题是,可以通过一个具有公共网络IP的节点记录在线客户机的公共网络IP和端口,并且所有客户机都可以通过该节点读取接收客户机的IP和端口对于专用网络之间的主要通信,由于IP不足,网络上的所有节点都不能位于同一网段上。 事实上,大多数节点都位于普通网络的边缘。 如图所示,为了简单起见,即使在DNS查询范围之外,也无法直接与网络边缘的节点进行通信,因此没有画交换机。 通常公司的网络都有交换机。 a公司出口渠道IP为211.10.1.1 (公用IP ),公司有两台主机IP分别为192.168.1.1和192.168.1.2 B公司出口渠道IP分别为211.10.1.2 ) 公司出现两台主机IP分别为11.10.10.1.2的p2p,就是解决这些问题,让位于不同网段的两台主机可以直接通信! 在介绍通信之前,先介绍一下p2p通信的核心,http://www.Sina.com/(UDP )! 在上图所示的通信模式中,使用upd通信公共网主机211.10.1.2打开udp,使用端口20000 A公司主机192.168.1.2类似地打开udp,以及端口10000 192.168.1.2 发送端:192.168.1.2:10000当接收端:211.10.1.2:20000数据包通过a公司出口路线时,路由上的NAT会同等地位即,由于在NAT上有192.168.1.2:10000和211.10.10.1.2336030000的会话,所以在Server上收到的数据包,他看到的发送源为211.10.1.110 如果指定接受者也为192 .即211.10.1.1:30000,则在192.168.1.2中显示会话192.168.1.2:10000-211.10.1.1:30000

所以为了保证正常的通信,这个session必须持续存在于路由器上,所以192.168.1.2是即是服务端也是客户端,必须保证session不会以心率失效以下,说明在一个p2p时间交流软件中有三个作用。 两个客户端,一个服务器两个客户端直接的通信(企业局域网内部)服务器位于公共网络上,具有公共网络IP如下图所示。 在图中,服务器只有一个角色。 记录所有客户端的公共IP客户端1登录后,链接到服务器可以让服务器知道客户端1的公共IP,记录客户端1,然后从服务器访问客户端2的公共IP客户端

也做与client1同样的操作 这样clieint1和client2就都知道对方的公网IP 接下来进行网络打洞 为了保证client1的路由器有与client2的session,client1要定时与client2做心跳(可以发送一个空的数据包) 同样,client2也要定时与client1做心跳 这样,双方的通信通道都是通的,就可以进行任意的通信了。 P2P通信就建立了 为什么打洞基于UDP协议? 为什么网上讲到的P2P打洞基本上都是基于UDP协议的打洞?难道TCP不可能打洞?还是TCP打洞难于实现?假设现在有内网客户端A和内网客户端B,有公网服务端S。如果A和B想要进行UDP通信,则必须穿透双方的NAT路由。假设为NAT-A和NAT-B。 A发送数据包到公网S,B发送数据包到公网S,则S分别得到了A和B的公网IP,S也和威武的自行车 分别建立了会话,由S发到NAT-A的数据包会被NAT-A直接转发给A,由S发到NAT-B的数据包会被NAT-B直接转发给B,除了S发出的数据包之外的则会被丢弃。所以:现在威武的自行车 都能分别和S进行全双工通讯了,但是威武的自行车之间还不能直接通讯。 解决办法是: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则不允许。这是这样一个意思:威武的自行车要连接到S,肯定首先威武的自行车双方都会在本地创建一个socket,去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写端口,实际上也是绑定了的,至少Java确实如此),假设为8888,这样A和B才分别建立了到S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,威武的自行车可以分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。但是如果是TCP的socket,则不能再创建socket并绑定到8888了,这样打洞就无法成功。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。