所为唯一指的是在没有地址变换的前提下。比如一个内部网络拥有两个局域网,一个采用地址192.168.0.0/24,另一个采用192.168.1.0/24,两网互联后所有的电脑IP地址都不相同。但当这个内部网络连接到互联网时,这些地址却不会再互联网上出现。也就是说所有在互联网上出现的地址也是各不相同的,这些公网地址是由互联网管理部门统一分配管理。大多数内部网络大都采用类似上面的那种“保留地址”,而这种地址则是由内部网络的管理员进行规划、分配和管理的,这种地址在进入互联网(公网)之前都必须变换成公网地址。当然,如果接入商分配了足够的公网IP地址,也可以不用变换。但IPv4地址已经基本耗尽,所以多数内部网络无法从接入商那里获得足够的IP地址,因此只能采用这种地址转换技术(NAT),将数量众多的内部地址加载到有限的几个公网地址上(共享地址)。也就是说通常内部地址数量>>接入商提供的公网地址数量。而这种NAT模式存在一个问题:除非做了静态或端口映射,否则就只能由内部向外部“主动”发起连接,而外部则无法对内部主机进行“主动”访问。
网桥是一个比较古老的网络设备,用于两个运行不同协议的网络互联或者是用不同的协议将两个网链接成一个网,而不是现在意义上的局域网互联。现在几乎所有的网络都使用TCP/IP协议,所以网桥基本消失。而IP协议下的两个局域网之间,则是用路由器进行互联。这是因为IP地址被分为网络地址和主机地址两部分,所有网络地址相同的计算机组成的网络称为一个局域网,通过主机地址对这个网进行广播,就可以定位目标并交换信息。当网络地址不同时,数据包就要被送到网关,然后通过路由器将数据包送往对应的局域网进行广播。至于IP地址中网络地址和主机地址的划分,可参考相应的论述,简单说就是目前的IP地址均采用无类模式进行路由,即网络地址的长度由掩码决定,剩余的部分就是主机地址。
P2P属于端到端通讯,并非必须打洞,关键是看在什么地方用。在第1点中已经说过,NAT存在无法进行外部向内部(主动)访问的问题,所以采用了所谓打洞技术,就是在公网(外部)建立一个公共服务器,让两个处在不同内部网络的终端(比如A、B),通过对这个服务器的“主动”访问,来建立A与B之间的“被动”通讯连接,比如像ICQ、MSN、QQ、旺旺等。当然,如果双方之间不存在NAT,则可以使用无打洞技术的P2P软件进行通讯,比如像“绿色传输”这样的P2P软件。实际上,所有能使两个终端互相访问的软件都可以称为P2P,比如局域网中相互建立了许可权限的共享访问的两个终端,但共享问无法逆向跨越NAT。所以,在没有NAT的时代是不需要P2P这个概念的,只要没有防火墙,大家都可以直接互访。P2P概念的建立,使得这类软件本身就设计成必须通过一个服务器(第三方)来建立链接,也就是打洞,所以即便是在同一个局域网内,如果没有一个对应的服务器,P2P软件之间照样无法通讯。
建立穿越NAT设备的p2p的TCP连接只比UDP复杂一点点,TCP协议的"打洞"从协议层来看是与UDP的"打洞"过程非常相似的。尽管如此,基于TCP协议的打洞至今为止还没有被很好的理解,这也造成了对其提供支持的NAT设备不是很多。在NAT设备支持的前提下,基于TCP的"打洞"技术实际上与基于UDP的"打洞"技术一样快捷、可靠。实际上,只要NAT设备支持的话,基于TCP的p2p技术的健壮性将比基于UDP的技术的更强一些,因为TCP协议的状态机给出了一种标准的方法来精确的获取某个TCP session的生命期,而UDP协议则无法做到这一点。
一. 套接字和TCP端口的重用
实现基于TCP协议的p2p"打洞"过程中,最主要的问题不是来自于TCP协议,而是来自于来自于应用程序的API接口。这是由于标准的伯克利(Berkeley)套接字的API是围绕着构建客户端/服务器程序而设计的,API允许TCP流套接字通过调用connect()函数来建立向外的连接,或者通过listen()和accept函数接受来自外部的连接,但是,API不提供类似UDP那样的,同一个端口既可以向外连接,又能够接受来自外部的连接。而且更糟的是,TCP的套接字通常仅允许建立1对1的响应,即应用程序在将一个套接字绑定到本地的一个端口以后,任何试图将第二个套接字绑定到该端口的操作都会失败。
为了让TCP"打洞"能够顺利工作,我们需要使用一个本地的TCP端口来监听来自外部的TCP连接,同时建立多个向外的TCP连接。幸运的是,所有的主流操作系统都能够支持特殊的TCP套接字参数,通常叫做"SO_REUSEADDR",该参数允许应用程序将多个套接字绑定到本地的一个endpoint(只要所有要绑定的套接字都设置了SO_REUSEADDR参数即可)。BSD系统引入了SO_REUSEPORT参数,该参数用于区分端口重用还是地址重用,在这样的系统里面,上述所有的参数必须都设置才行。
p2p指的是房主作为主机,其他人跟房主直连。大部分联机游戏采用P2P网络模式,服务器只负责辅助UDP打洞,不参与后续游戏数据交换,优点服务器压力小,成本低,缺点是两个NATD设备无法联机,且联机体验较差,如果中途更换端口映射则会掉线,需要加速器辅助(加速器本质就是C/S模式)。
大多数游戏都是c/s模式 ,可以达到同时大规模人上线,但仍然会因随着玩家的增加而消耗服务器端的资源。采用C/S模式,需要部署大量的中央服务器,电脑1与电脑2不直接通信,而是统一与服务器通信,优点是对NAT类型无要求,联机体验较好,缺点是成本高。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)