android p2p 学习
TCP的三次握手(建立连接)和四次挥手(关闭连接)
http://www.cnblogs.com/Jessy/p/3535612.html
C/S(客户/服务器)模型:
基于C/S的用户间通信需要由服务器中转,在C/S中的服务器故障将导致整个网络通信的瘫痪。在基于C/S的网络中,客户端可以通过向服务器注册来实现彼此之间的定位(获得IP和端口)
P2P(Peer-to-Peer 端到端)模型:
于C/S相对应的网络通讯模式,基于P2P的用户间通信则是直接通信,去掉了服务器这一层,带来的显著优点是通信时没有单一的失败点,一个用户的故障不会影响整个P2P网络。
P2P的核心是数据存储在客户本地,通过存储信息(名称、地址、分块)的查询,让终端之间直接数据传递。
P2P网络让网络上的数据流量分散化,同时管理点不仅没有服务容量的压力,而且只存储数据的索引与链接,不对数据本身负责,避免了版权与管理的麻烦
P2P网络类型:
1\ 第一代P2P网络
*控制网络体系结构,又叫集中式P2P网络:代表是Napster、QQ
全网络的节点计算机都通过网络与*控制服务器连接,所有的服务请求均发送给*服务器,由*服务器运算查找合适的节点(Peer)来确定P2P连接
有一个中心服务器负责记录共享信息(索引信息)并应答对这些信息的查询。与C/S模式的差异是在C/S结构中,客户端之间没有数据流,通过中心服务器交换数据。而P2P登录与信息查询都与中心服务器连接,但查询到数据后,就与存放数据的客户端直接建立连接
2\ 第二代P2P网络
分布式非结构化P2P网络(也即去中心化P2P网络):代表是Gnutella
没有*控制节点,所有节点平等的处于网络中。也被称为“纯P2P网络”
—采用了随机图的组织方式来形成松散的网络,没有中心服务器,采用洪泛式搜索(Flooding)和随机转发机制(TTL转发机制),每个节点功能相同,兼作服务器和客户机
分布式结构化P2P网络:代表Pastry、Tapestry、Chord、CAN
结构化是对网络解决的管理方式,是一种逻辑上可以结构化查询,而不是物理连接的变动,结构化是为了搜索算法的快捷,一般相当于折半查找。
DHT(Distributed Hash Table分布式散列表)路由算法是通过分布式散列函数将输入的关键字唯一映射到某个节点上,然后通过特定路由算法和该节点建立连接。
网络节点被分配唯一节点标识符(Node ID),资源对象通过散列运算产生唯一资源标识符(Object ID),且该资源存储在NID与之相等或相近的节点上,
查询时,同样的方法定位到存储该资源的节点
3\ 第三代P2P网络
混合式(半分布式)P2P网络,也即前两种模式的混合。即第三代P2P,代表Skype
混合式网络结构综合了纯P2P去中心化和*控制式P2P快速查找的优势。按节点能力不同(计算能力、内存大小、连接带宽、网络滞留时间等)区分为普通节点和搜索节点、索引节点
(分布式模式基础上,将用户节点按能力进行分类,使某些节点担任特殊的任务)。
用户节点:可以从索引节点处得到相临的搜索节点地址。
搜索节点:处理搜索请求,要有128k以上的速度,从子节点中搜索文件列表。
索引节点:速度快、内存大的节点,保存可以利用的搜索节点信息、搜集状态信息,并维护网络结构。
索引节点也可以同时是搜索节点。
用户节点可以选择三个搜索节点为父节点,并提交它的共享列表。一个父节点可以维护500个孩子节点
4\ 第四代P2P网络(智能P2P网络)
大体分为以下3种模式:
(1)动态口选择之一。
目前的P2P应用一般使用固定的端口,实际上可引入动态选择传输口,一般说口的数目在 1024~4000之间。甚至P2P流可以用原来用于HTTP(SMTP)的口80(25)来传输以便隐藏。
这将使得识别跨运营商网络的P2P流量计算变得更困难。
(2)双向下载。
该项技术可以多路并行下载和上载一个文件和/或多路并行下载一个文件的一部分。而目前传统的体系结构要求目标在完全下载后才能开始上载。这将大大加快文件分发速度。
(3)智能结点弹性重叠网络。
智能结点弹性重叠网络是系统应用P2P技术来调度已有的IP承载网资源的新技术,在路由器网络层上设置智能结点用各种链路对等连接,构成网络应用层的弹性重叠网
NAT(Network Address Translators)
网络地址转换,是一种广泛应用的解决IP 短缺的有效方法,它的主要目的就是为了能够地址重用,NAT将内网地址转和端口换成合法的公网地址和端口号,建立一个会话,与公网主机进行通信
,NAT同时起到隔离、防火墙的作用,NAT隐藏内部网络的拓扑结构,分隔外网(公网)和内网(私网),保护内部主机,有效地避免来自网络外部的攻击,NAT通常只允许临时的向外网的连接申请,
对于向内网的申请会拒绝,所以对于P2P应用来说,要建立端到端的连接,就必须实现NAT穿透。
NAT有三种类型:静态 NAT 、动态地址 NAT 、地址端口转换 NAPT
静态NAT :
静态地址转换将内部私网地址与合法公网地址进行一对一的转换,且每个内部地址的转换都是确定的。
动态NAT :
动态地址转换也是将内部本地地址与内部合法地址一对一的转换,但是动态地址转换是从合法地址池中动态选择一个未使用的地址来对内部私有地址进行转换。
NAPT :
它也是一种动态转换,而且多个内部地址被转换成同一个合法公网地址,使用不同的端口号来区分不同的主机,不同的进程。
NAT 分成如下几类(实现的技术角度上):
全锥NAT(Full Cone NAT):(内、外网通讯不受限制)
把所有来自相同内部IP 地址和端口的请求映射到相同的外部IP 地址和端口。任何一个外部主机均可通过该映射发送数据包到该内部主机
限制性锥NAT (Restricted Cone NAT ):
和全锥NAT不同的是:只有当内部主机先给外部主机发送数据包, 该外部主机才能向该内部主机发送数据包,限制性锥NAT会丢弃它未知的源地址发向内部主机的数据包
端口限制性锥NAT( Port Restricted Cone NAT):
比限制性锥NAT多了端口号的限制:即只有内部主机先向外部主机的地址+端口号发送数据包, 该外部主机才能使用特定的地址+端口号向内部主机发送数据包
对称NAT ( Symmetric NAT):
当同一内部主机使用相同的端口与不同地址的外部主机进行通信时, 对称NAT 会重新建立一个Session ,为这个Session 分配不同的端口号,或许还会改变IP 地址
NAT穿越技术(实现NAT 设备之后的拥有私有IP 地址的主机之间建立P2P 连接)
是利用一个公共服务器中转,使节点 A、 B都连接到中转服务器 S之后,通过 S中转 A发送到 B的数据报或者是中转连接申请,使A、B对于NATA和NATB来说都是向外申请。
1、中转数据报:
A、 B都先向外与服务器S建立接连,然后通过S中转 A、 B之间的数据报。
2、反向连接:
当 A、 B都与S建立了连接,并且只有一个节点在NAT之后(假设 A在NATA之后)。当B向A申请连接时,申请被NATA拒绝。 B可以向S提出申请要与A建立连接,然后S向A发出指令,通知A主动向B申请建立连接。
穿透锥NAT(现实中多数的NAT都是锥NAT):
NAT-A内网主机ClientA-1
NAT-B内网主机ClientB-1
NAT-A设备(集成NAT功能的路由器、防火墙等)
NAT-B设备
Server外网server
ClientA-1公网IP:端口(ClientA-1经NAT-A地址转换的公网地址:端口, 对客户端是透明的)
ClientB-1公网IP:端口(ClientB-1经NAT-B地址转换的公网地址:端口,对客户端是透明的)
UDP 穿透NAT
1、A、 B在同一个NAT之后
2、A、 B在不同的NAT之后
3、多级 NAT后面的节点: 依赖同一个NAT模块的发夹(回环)转化实现
1、ClientA-1 (ClientA-1公网IP:端口 )发送数据包给Server ,请求和ClientB-1 (ClientB-1公网IP:端口)通信。
2、Server 将ClientA-1 的地址和端口(ClientA-1公网IP:端口 )发送给ClientB-1 ,
告诉ClientB-1:ClientA-1 想和它通信。
3、ClientB-1 向ClientA-1 (ClientA-1公网IP:端口 )发送UDP 数据包,当然这个包在到达NAT-A 的时候,还是会被丢弃,
发送这个UDP 包只是为了让NAT-B 记住这次通信的目的地址:端口号,当下次以这个地址和端口为源的数据到达的时候就不会被NAT-B 丢弃,这样就在NAT-B 上打了一个从ClientB-1到ClientA-1 的孔。
4、为了让ClientA-1 知道什么时候才可以向ClientB-1 发送数据,
所以ClientB-1 在向ClientA-1(ClientA-1公网IP:端口 )打孔之后,
还要向Server 发送一个消息,告诉Server 它已经准备好了。
5、Server 发送一个消息给ClientA-1 ,内容为:
ClientB-1 已经准备好了,你可以向ClientB-1 发送消息了。
6、ClientA-1 向ClientB-1 发送UDP 数据包。
这个数据包不会被NAT-B 丢弃,以后ClientB-1 向ClientA-1发送的数据包也不会被ClientA-1 丢弃,因为NAT-A 已经知道是ClientA-1 首先发起的通信。
至此,ClientA-1和ClientB-1 就可以进行通信了
TCP 穿透NAT:
TCP协议穿透NAT的方式和使用UDP协议穿透NAT的方式几乎一样,只是将无连接的UDP变成了面向连接的TCP而已(TCP的三次握手连接)。
1、ClientB-1 在向ClientA-1 打孔时,发送的SYN 数据包,而且同样会被NAT-A丢弃。
同时,ClientB-1需要在原来的socket 上监听,由于重用socket ,所以需要将socket属性设置为SO_REUSEADDR(
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用,该选项允许将多个socket绑定到同一个本地终端) 。
2、ClientA-1 向ClientB-1 发送连接请求。
同样,由于ClientB-1 到ClientA-1 方向的孔已经打好,所以连接会成功,经过3次握手后,ClientA-1 到ClientB-1 之间的连接就建立起来了
客户A想和客户B建立TCP连接:
1、首先还是 AB分别和服务器S分别建立连接,S记录AB的互联网实际终端。然后S分别向AB发送对方的实际终端。
2、从A和B向S连接时使用的端口,AB都异步调用connect函数连接对方的实际终端(就是S告诉的终端),
同时,AB双方都在同一个本地端口监听到来的连接(也可以先监听,再connect更好)。由于双方都向对方发送了connect请求(假设各自的SYN封包已经穿过了自己的NAT),
因此在对方connect请求到达本地的监听端口时,路由器会认为这个请求是刚刚那个connect会话的一部分,是已经被许可的,本地监听端口就会用SYN-ACK响应,
同意连接。
TCP穿透NAT的点对点连接就成功了
穿透对称NAT:
对称NAT和锥NAT很不一样,当一个私网内主机和外部多个不同主机通信时,对称NAT并不会像锥(全锥,限制性锥,端口限制性锥)NAT那样分配同一个端口。
而是会新建立一个Session ,重新分配一个端口。
穿透对称NAT 的策略:
同时开放TCP ( Simultaneous TCP open )策略
UDP 端口猜测策略
STUN (Simple Traversal of UDP Through NATs )协议是一个轻量级协议,用来探测被NAT 映射后的地址:端口。
STUN 采用C/S 结构,需要探测自己被NAT 转换后的地址:端口的Client 向Server 发送请求,Server 返回Client 转换后的地址:端口