C# dotnet core TCP NAT UDP P2P 穿透 小引

Mark:Linyee Jiaguoxinzhi TCP NAT UDP P2P 穿透

国内 p2p 文章偏少了。

其实不会,,只是加上C#就比较少了。其实还是很多,只是有点千篇一律。

dotnet core p2p 然后就真的很少了。

一.前言:

  P2P,即英文Peer-to-Peer的缩写,中译为对等互联或点对点技术。讲到P2P,人们就会想起Napster,Napster让人们认识到了P2P技术的威力,P2P技术也就通过Napster进入了大多数用户的视野,Napster的音乐文件交换功能是P2P的一个主要应用。P2P技术可以让用户可以直接连接到其他用户的计算机,进行文件共享与交换。同时P2P在深度搜索、分布计算、协同工作等方面也大有用途。

  简单地说,P2P就是一种用于不同PC用户之间,不经过中继设备直接交换数据或服务的技术,它允许 Internet用户直接使用对方的文件。每个人可以直接连接到其他用户的计算机,并进行文件的交换,而不需要连接到服务器上再进行浏览与下载。因为消除了中间环节,P2P技术使得网络上的沟通变得更容易、更直接。P2P改变了Internet现在的以大网站为中心的状态、重返"非中心化",并把权力交还给用户。从某种意义上讲,P2P体现了Internet的本质。在网络尚未发展成为现在的Web之前,网民就是利用所谓的"布告板"等渠道彼此直接交换信息和文件。

  目前Internet的存储模式是"内容位于中心",而P2P技术的运用将使Internet上的内容向边缘移动。这将带来以下改变:首先,客户不再需要将文件上传到服务器,而只需要使用P2P与其他计算机进行共享;其次,使用P2P技术的计算机不需要固定的IP地址和永久的Internet连接,这使得占有极大比例的拨号上网用户也可以享受P2P带来的变革。

  理解P2P技术方面的最好方法是仔细观察并理解一个实际的P2P应用程序。C#作为微软.Net战略的重要棋子,对网络编程提供了很好的支持和优化。P2P(点对点)编程以及套接口编程的一些基本知识和概念。它是建立在 TcpListener以及TcpClient这两个类基础上的,除外还有相应的输入和输出控制。实现的原理也比较简单,但是用到了P2P技术重返"非中心化"的基本原则。简言之,用这个程序可以在网络中发送、接受信息,任何一台计算机既可以作为服务器端,又可以作为客户端。

二、P2P 简介

使用P2P技术的系统分为两类:(1)单纯型P2P——没有专用的服务器。安装了P2P软件的各个计算机可以直接通信

              (2)混合型P2P——有专用的服务器,此时的服务器一般叫索引服务器,此服务器与C/S架构下的服务器不同,在C/S架构下所有资源都存储在服务器中,所有传递的信息都要经过服务器,而在混合型P2P系统中的索引服务器仅仅起到协调和扩展的功能,资源不是全部存储在服务器上,而是分布在各个电脑上,安装了P2P软件的电脑开始全部和索引服务器连接,以便告知自己监听的IP地址和端口号,然后再通过索引服务器告诉其他与自己连接的电脑,每台计算机的连接和断开都通过服务器通知网络上有联系的计算机,这样就减轻了每台计算机搜索其他计算机的负担,但是信息的传递还是通过点对点的方式来完成(这里可以以QQ为例,当我们电脑上安装了QQ这类P2P软件时,安装了QQ这类软件的计算机就会加入一个P2P网络,并且登陆的时候都会与索引服务器建立连接,通过连接来告诉服务器自己的IP地址和端口号,当我们找一个好友聊天时,此时自己的计算机和好友的计算机都会与服务器端口连接,但是要互相发送消息,自己的计算机必须知道好友计算机的IP地址和端口号才可以通信,这样的工作正是通过索引服务器来告知对方的--指的是告诉自己的计算机好友的计算机的IP地址和端口号,告诉好友的计算机自己的IP地址和端口号,这样双方就可以不通过服务器直接通信了。)

主流P2P应用分类

P2P 网络应用大致可以分为三类—— 1. 文件共享类,例如迅雷,BT等软件都是文件共享类的应用

                 2. 即时通信类,例如QQ,MSN等软件都是属于即时通信类

                 3. 多媒体传输类,例如在线视频直播软件,PPlive等软件

从上面的分类可以看出,现在网络上流行的软件都采用了P2P技术来实现的, 但是它们的实现肯定不是单纯的只采用P2P技术来实现的, 而是采用多种技术来实现的, 在下一专题中将介绍利用TCP,UDP和P2P等技术来实现类似QQ的一个即时通信程序,希望通过此程序可以综合前面专题介绍的内容以及帮助大家对QQ等软件的实现原理有了解。

三 实现

局域网内实现,通常用TcpLister TcpClient,或Sockcet 或WebSocket ClientWebSocket。大多数时间用tcp,因为Tcp可以长连接。偶尔也用udp。

至于具体实现,不汲步广域网的情况下,没什么好说的,,网络上也有码。。

四 涉及广域网时。。比较复杂。。

1、见有人用C/C++现成的Dll,再导入DLL函数,亦可。

2、现在说下C#打洞的实现。。其实,,说开了,,就是一杯水,平淡无奇。。

五、打洞实现

1、开一个云服务器,或自家的宽带,全主机映射。

2、云控制台上安全组udp打开相应的端口,打开防火墙上相应的端口。

3、两台客户端。。

4、A通过Udp访问S,S把这个记录下。B通过Udp访问S,S把这个记录下。如果还有客户端则一样的。。

5、各客户端向S发送CLIENT SET <X> 注册昵称或登录信息  (<X> 即昵称)

6、A请求跟昵称为 NickXXXX 的客户端通信。

7、服务端将昵称为 NickXXXX 的客户端(比如D)的公网IP及端口发给A。然后A直接跟D通信。

8、如果D断线,A再重新向S请求昵称为 NickXXXX 的客户端(比如D)的公网IP及端口。或着S主动通知。

            var rip51444 = new IPEndPoint(IPAddress.Parse("xxx.112.xxx.245"), 51444);
            var lip = new IPEndPoint(IPAddress.Any, 51444);
            var udps = new UdpClient(lip);
            udps.Send(new byte[] { 1, 2, 3, 4 }, 4, rip51444);
            Console.WriteLine($"向服务器发送消息");
            var aip51444 = new IPEndPoint(IPAddress.Any, 51444);
            var updr = new UdpClient(aip51444);
            new Thread(() =>{
                while (true)
                {
                    var buf = updr.Receive(ref aip51444);//这个是关键返回对方的公网ip及端口
                    Console.WriteLine($"收到{aip51444.ToString()}数据:  {buf.ToHexString()}");
                }
            }).Start();

最后就是与服务器交互了。。

六、总结:

关键点是,云服务器或路由映射主机。必须要有一个节点是暴露在公网上的。。不然,只能局域网。局域网还可以用广播。。

20200922 补充

udp穿透时,不同运营商,不同地域,手机与PC,可能存在无法穿透的现象。

七、附录

1、客户端  上传了,但在审核中,,过后再补地址,或亲们自己手动搜索“udp穿透客户端”
https://download.csdn.net/download/jiaguoxinzhi/11222422
2、Udp穿透还是有一定极限性的,,因为很多路由默认将Udp关了。所以将测试Tcp穿透

20200922 补充

3、Udp穿透,本人已完善到第6版,有需要的可以有偿服务。。目前已测试完善穿透代理3389服务

八、4种典型NAT类型

按照NAT设备在进行地址映射时行为的不同,NAT可以分为以下四种:

  1. Full Cone 

  2. Restricted Cone 

  3. Port Restricted Cone 

  4. Symmentric 

     

  目前主要的NAT类型有如下几种:

  1)Full-cone NAT, also known as one-to-one NAT

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 任何外部主机能够通过eAddr:ePort这个地址发送数据包到iAddr:iPort.

  2)Address-restricted-cone NAT

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 仅只有接收到主机(iAddr:iPort)通过eAddr:ePort发送的数据包的外部主机通过该主机的任何端口发送到eAddr:ePort的数据包才能够被正确的转发到iAddr:iPort.也就是说主机有关端口无关.

  3)Port-restricted cone NAT

  类似于address restricted cone NAT, 但是端口号有限制.

  • 一旦一个内网地址 (iAddr:iPort) 被映射到一个外部地址 (eAddr:ePort), 来自 iAddr:iPort 的任何数据包将通过 eAddr:ePort 发送.
  • 仅只有接收到主机(iAddr:iPort)通过eAddr:ePort发送的数据包的外部主机通过该主机的相同端口发送到eAddr:ePort的数据包才能够被正确的转发到iAddr:iPort.

  4)Symmetric NAT

  • 来自相同内部ip和port发送到相同目的地ip和port的请求被映射到唯一的外部ip和port地址;如果相同的内部主机采用相同的ip和port地址发送到不同的目的地,那么重新分配映射地址。
  • 只有先前收到内部主机发送的包的外部主机才能够发送返回包到内部主机。

  针对前面三种NAT类型(即cone NAT)只要通信双方彼此知道对方的内部地址和外部地址的映射关系,然后通过UDP打洞的方式就可以建立相互连接的通信;但是第四种也就是Symmetric NAT的话由于每次向不同目的地发送数据包时采用不同的外部地址,也就没办法通过直接的方式建立P2P连接。

针对Symmetric NAT需要udp中转或tcp中转

后期应该会抽个时间改善下之前的udp工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵易联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值