互联网(复杂网络环境) 语音视频 文字 文件传输 原理,P2P

终于放假结束了,又回到学校了

之前一直在做WinForm窗体 现在终于完善了,然后是准备做互联网上的应用,经过长久的探索和学习查阅资料,心里终于有了大致的轮廓 ,明白了大致原理

这里以一个类似于QQ的即时通讯软件为例

网上有很多的聊天程序源码可以下载,包括实现了文件传输和视频语音的仿QQ系列源代码,但是基本上有一个共同的特点,只适用于局域网 服务端也较少使用异步方式处理

但是在实际的网络环境中 很多的计算机通过内网的网关上网,网关具有一个公网的IP地址

在互联网中两台计算机通信必然情况复杂

以即时通讯为例可以这样做 软件分为客户端和服务器端 其实是一个混合型的P2P架构

服务端位于一台具有公网IP地址的计算机中(服务器)

客户端位于其它计算机,包括内网中和公网中的计算机

如果所有的信息都通过服务器中转 则不能实现P2P,服务器的压力也非常大。对于客户端和服务端的通信 由于服务端位于公网上,只要连接是从客户端请求的 则可以无视NAT,双方之间的通信不会受到网络环境的限制,无论客户端位于内网还是公网都一样。

但是如果两个客户端之间要传输语音 视频 文件 这种大量的信息,如果都通过服务者中转势必服务器难以承受,最佳方式是通过点对点连接

以下是即时通讯几个主要模块:

1.文字消息 指令传输

2.视频语言传输

3.文件传输

显然 视频语音文件应该通过P2P方式传输比较好 文字消息通过服务器中转,方便服务器记录聊天信息

这里关键问题就到了P2P了

假设有客户端A 和客户端B ,如果建立AB直接的连接?有一下几种情况

1, AB都位于公网上 双方监听 任意一方发送的数据或连接请求都能准确到达,可以确保AB直接的点对点数据输出

2, AB其中一台位于公网 一台位于内网 由于在内网中的计算机只要知道另外一台计算的IP地址 从内网中发出请求也能穿透NAT实现点对点通信

3, AB位于不同的内网中 如果是UDP协议则通过UDP打洞的方式来确保P2P通信 如果是TCP打洞,由于各种复杂的NAT设备,如各种型号的路由器,让AB实现P2P连接的成功率并不高

 

可以看出实现P2P的关键在于第3点

文字消息通过服务器中转,所有不涉及P2P。 视频语音可采用UDP打洞实现点对点的传输 ,UDP虽然是不可靠的传输 在传输过程中即使发生了丢包,误码或者错误等 也只是少部分,这里我们不用管那些错误的 视频和语音即使发生了少部分的丢失或者错误,总体上讲依然是流程的。

所以对于互联网上的即时通讯(包括远程视频会议等)在查阅相关不少资料后,针对即时通讯的主要模块,个人觉得应当设置以下策略:

1.文字消息传输 包括用户登录 状态修改 表情传递这些都以文字(指令)的形式通过中央服务器转发

2.视频语言传输 采用UDP协议,以点对点的方式传输 必要时需要通过UDP打洞的方式穿透NAT设备(如路由器)

3.文件传输 对于文件不能要确保完整地传输,采用TCP协议 如果两台机器位于不同的内网之中,服务器协助TCP打洞 如果AB直接建立TCP连接成功,则直接传输 如果无法建立TCP连接则通过服务器中转。

这样的策略 可以适应复杂网络环境中的即时通讯,对于一个分布式系统来说 这样的策略应该是普遍适用的

想.NET平台下 虽然主要有Remoting和Socket两种主要技术来进行网络编程 不过也可以看书Remoting还是有很多的不足 没有Socket灵活,两者都有不同的优势,应该根据不同的需求情况下选择使用不同的技术 甚至两者混合使用。

你可能感兴趣的:(文件传输)