Tomb Raider游戏出了局域网版本之后我就开始研发互联网版本的联机游戏。之所以局域网版本的不能直接用在互联网上是因为未有解决局域网内主机与外部网络或者与其他局域网的内部主机之间的通信问题。按照一般的P2P程序开发流程,需要一个拥有公网IP的服务器使用UDP Hole Punching技术可以达到把两个不同局域网的主机连接起来的目的,前提是局域网必须是属于圆锥型网络(Cone)而不是对称型的(Symmatric)。
圆锥和对称有何差别呢?
这里举个简单的例子。当你在局域网内向一台服务器A发送一个数据包时,网络地址转换器(NAT)会产生一个会话,并使用一个公网IP的端口与那台服务器通信,当那台服务器返回数据的时候,NAT会根据会话里的对应关系,把数据投递到局域网内你那台主机上。如果找不到对应关系,NAT是会把数据包丢弃的!通常还可能会收到10052的错误消息(Network dropped connection on reset.)这时候有一个这样的问题,当你的在局域网的那台主机使用同一个端口向另外一台服务器B(IP或端口不同)发送数据的时候,NAT创建一个新的对应关系时是否仍然会使用上次你跟服务器A通信时用的端口?如果会,那么它是圆锥型的,不会就是对称型的。
就像下图一样,