我所热衷的编程生涯 连载(7)
在讲P2P的应用和实际问题前, 我先说说我为什么会研究与实现P2P模式. 原因其实蛮简单的, 我希望搭建一个网络平台出来, 这点第3篇文章的时候已经提及到了, 我希望的是用一种网络通讯手段将灵活多变的多种网络应用集合在一个平台内, 而通过这个平台可以给用户提供尽可能完善的网络服务. 而涉及到的端对端通讯也是需要实现的功能点, 当然端对端也不是可以在任何网络情况下都可以实现的(这个我们后面再说). 但是作为一种简便廉价的网络通讯手段还是有很多好处的. 其实P2P说简单点就是利用穿透路由器门禁加上外网服务器的协助完成不同域之间内部终端的直接通讯. 相信很多通讯应用都需要这样的状态, 比如互传文件, 信息交流, 远程桌面等.
决定应用P2P模式进行整个平台的搭建还是在实现UDP可靠通讯后才开始的, 很巧的是UDP协议下实现内网穿透的成功率比TCP协议要高的多, 也要简便些. 而且我预先规划的服务器架构也是基于UDP的, 这样我就可以不用改变通讯协议来实现P2P模式了.
构建的P2P模式如下图:
P2P实现的关键在于有外网的服务器进行不同NAT后(网络地址转换, 这里说的就是路由器)的协助通讯, 这个服务器起到中间人的作用, 来对需要互相通讯的两个终端进行协调和沟通, 因为他们各自在自己的NAT防火墙后面是无法和对方直接通讯的. 而这个服务器除了协助内网穿透其实还可以附加很多的功能, 比如验证用户身份, 协调数据库服务器...
其实在我实现P2P模式的过程中才发现, 原本简单的原理在实际应用上还是会存在很多偏差的, 而且都是很正常的偏差, 导致这些产生的原因也是根本性的. 无论是B/S模式还是C/S模式, 其实通讯在整个平台中的地位还是很明显的. 要想有个稳定可靠的通讯通道, 那么就需要很多的技术手段来确保各个环节的技术难点都被打破或者控制的很好, 这其实还是蛮难的. 自从开发完成自创数据库工具后, 这是我遇到的最大的挑战, 通讯说简单的就是收发数据, 但是稳定可靠确实很庞大很高深的一个话题, 虽然我自认为在这方面还是做了不少的研究和实践, 不过真正说起来也不算是精通. 只是勉强的把整个网络平台搭建起来了, 而且还只是实现了其中的聊天功能. 关于Silk平台的事情, 我们后续再说, 还是继续说P2P模式吧.
了解这种模式的人都应该知道, 内网穿透就是整个模式的核心, 如果无法实现内网穿透, 那么P2P通讯也就无从谈起了. 所以要做到P2P畅通无阻, 还需要根据很多种不同的网络状况来进行评估和测试, 确认可行性, 确认效率. 很庆幸我这样做了, 在后来的实际应用中就避免了对称NAT在某些情况下无法实现内网穿透的尴尬. 为此, 我专门去了解了各种类型的路由器, 大家都知道NAT设备类型大概有7种:
1. Opened: 即主机拥有公网IP,并且没有防火墙,可自由与外部通信.
2. Full Cone NAT:主机前有NAT设备,NAT规则如下:从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,并且从任意外部地址发送到该NAT设备UDP端口B的包都会被转到主机端口A.
3. Restricted ConeNAT:主机前有NAT设备,NAT规则如下:从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP发出到该NAT设备UDP端口B的包才会被转到主机端口A.
4. Port RestrictedCone NAT:主机前有NAT设备,NAT规则如下:从主机UDP端口A发出的数据包都会对应到NAT设备出口IP的端口B,但只有从之前该主机发出包的目的IP/PORT发出到该NAT设备UDP端口B的包才会被转到主机端口A.
5. Symmetric UDPFirewall:主机出口处没有NAT设备,但有防火墙,且防火墙规则如下:从主机UDP端口A发出的数据包保持源地址,但只有从之前该主机发出包的目的IP/PORT发出到该主机端口A的包才能通过防火墙.
6. Symmetric NAT:主机前有NAT设备,NAT规则如下:即使数据包都从主机UDP端A发出,但只要目的地址不同,NAT设备就会为之分配不同的出端口B.
7. Blocked: 防火墙限制UDP通信.
这些类型在互相进行内网穿透的时候并不是都能顺利成功的. 还是得看情况...
未完待续....