NATandP2P网络地址装换(NAT)•NetworkAddressTranslation•NAT允许一个机构专用Intranet中的主机透明地连接到公共域中的主机,无需内部主机拥有注册的(以及越来越缺乏的)Internet地址。•NAT是一种把内部私有网络IP地址翻译成合法网络IP地址的技术。NAT技术NAT技术引入的原因•解决IP地址不够用的问题A类10.0.0.0——10.255.255.255B类172.16.0.0——172.31.255.255C类192.168.0.0——192.168.255.255•对内部计算机进行有效的安全保护内部网络中的所有计算机上网时受到路由器或服务器(防火墙)的保护,黑客与病毒的攻击被阻挡在网络出口设备上,大大提高了内部计算机的安全性。NAT分类•基本的NAT(BasicNAT)将私网主机的私有IP地址转换成公网IP地址,但并不将TCP/UDP端口信息进行转换。•网络地址/端口转换器(NAPT)NAPT检查、修改包的IP地址和TCP/UDP端口信息。这样,更多的内部主机就可以同时使用一个公网IP地址。NAPT•当一个内部网主机通过NAT打开一个外流的TCP或UDP会话时,NAPT分配给这个会话一个公网IP和端口,用来接收外网的响应的数据包,并经过转换通知内部网的主机。这样做的效果是,NAPT在[私网IP:私网端口]和[公网IP:公网端口]之间建立了一个端口绑定。端口绑定指定了NAPT将在这个会话的生存期内进行地址转换任务。对通信双方而言,这种IP地址和端口的转换是完全透明的。Internet10.0.0.0/1618.181.0.31138.76.29.710.0.0.254/164UNAT10.0.0.1/1610.0.0.2/1610.0.0.3/16155.99.25.11服务器S1服务器S218.181.0.31:1235138.76.29.7:1235会话1(A-S1)会话2(B-S2)18.181.0.31:1235138.76.29.7:1235155.99.25.11:62000155.99.25.11:62001NAT155.99.25.11会话1(A-S1)会话2(B-S2)18.181.0.31:1235138.76.29.7:123510.0.0.1:123410.0.0.2:1234ClientAClientBNAT地址转换表私网IP:Port外部IP:PortNAT公网IP:公网Port10.0.0.1:123418.181.0.31:1235155.99.25.11:6200010.0.0.2:1234138.76.29.7:1235155.99.25.11:62001虚拟服务器虚拟服务器:对路由器任何一个或一段协议端口的访问(从WAN口进来的访问),都可以重定位到局域网内某一台指定的网络服务器。192.168.1.1:80:80/192.168.1.3:2smtp25pop3110NAPT•如果P2P应用程序从内部网络的一个[私网IP:私网端口]对同时发出多条会话给不同的外网主机,根据NAT处理方式,分成下面两类:1.对称NAT(SymmetricNAT)2.锥形NAT(ConeNAT)对称NAT服务器S1服务器S218.181.0.31:1235138.76.29.7:1235||||+----------------------+----------------------+|^会话1(A-S1)^|^会话2(A-S2)^|18.181.0.31:1235|||138.76.29.7:1235|v155.99.25.11:62000v|v155.99.25.11:62001v|对称NAT155.99.25.11|^会话1(A-S1)^|^会话2(A-S2)^|18.181.0.31:1235|||138.76.29.7:1235|v10.0.0.1:1234v|v10.0.0.1:1234v|ClientA锥形NAT•建立在(私网IP、私网端口)和(公网IP、公网端口)之间端口的绑定之后,如果ConeNAT再次创建一个从同一(私网IP、私网端口)建立的会话时,不会新分配一个端口号,而是用原来分配的端口号,只要这个会话使绑定的端口仍然有效。锥形NAT服务器S1服务器S218.181.0.31:1235138.76.29.7:1235||||+---------------------+----------------------+|^会话1(A-S1)^|^会话2(A-S2)^|18.181.0.31:1235|||138.76.29.7:1235|v155.99.25.11:62000v|v155.99.25.11:62000v|锥形NAT155.99.25.11|^会话1(A-S1)^|^会话2(A-S2)^|18.181.0.31:1235|||138.76.29.7:1235|v10.0.0.1:1234v|v10.0.0.1:1234v|客户机A10.0.0.1:1234P2P(Peer-to-Peer)P2P概述•很多NAT的采用使通信处在一种不对称的模式下:内网的主机可以主动访问链接到外网主机上,但是外网的主机除非通过代理管理员的特定设置,否则不能主动访问链接到内网主机上。•P2P技术是一种用于不同PC用户之间、不经过中继设备直接交换数据或服务的技术。它打破了传统的C/S模式,在对等网络中,每个节点的地位都是相同的,具备客户端和服务器双重特性,可以同时作为服务使用者和服务提供者。•由于P2P技术的飞速发展,互联网的存储模式将由目前的“内容位于中心”模式转变为“内容位于边缘”模式,改变Internet现在的以大网站为中心的状态,重返“非中心化”,将权力交还给用户。P2P通信方式P2P的技术特点•(1)既是S(Server)又是C(Client),如何表现取决于用户的要求,网络应用由使用者自由驱动。•(2)信息在网络设备间直接流动,高速及时,降低中转服务成本。•(3)构成网络设备互动的基础和应用。•(4)在使网络信息分散化的同时,相同特性的P2P设备可以构成存在于互联网这张大网中的子网,使信息按新方式又一次集中。基于NAT代理设备上的P2P技术•中继转发(Relaying)•反向连接(Connectionreversal)•UDP打洞技术(UDPHolePunching)中继转发(Relaying)•穿越代理实现P2P通信,最可靠但是效率最低的的方法,将P2P通信看作一个C/S结构,通过服务器来转发消息。举例来说,假设二个客户机A和B,与一个有公网固定IP地址的服务器S各创建一个TCP或UDP连接,这两个客户机在不同的私网上,这样,他们各自的NAT代理服务器不允许他们向对方创建直接的连接。中继转发(Relaying)服务器S||+----------------------+----------------------+||NATANATB||||客户机A客户机B中继转发(Relaying)•优势:当两个客户端都与服务端保持连接的时候,它将始终如一的正常工作。•劣势:它消耗服务器不必要地处理能力和网络带宽,而且即使服务器有好的链接性,在二个客户机之间的通信反应时间比较长。反向连接(Connectionreversal)•如果只有一个客户机在NAT后,那么采用反向连接技术。如下图,假设客户机A在NAT后,而客户机B有一个公网IP地址:服务器S18.181.0.31:1235||+----------------------+----------------------+||NATA|155.99.25.11:62000|||||客户机A客户机B10.0.0.1:1234138.76.29.7:1234反向连接(Connectionreversal)•现在假设客户机B想要和客户机A创建一个P2P通信会话,B可能先尝试连接客户机A的任何一个地址——或是客户机A的私网地址10.0.0.1:1234,或是从服务器S观察到的地址155.99.25.11:6200。•然而在任一情况,连接都会失败。–在第一种情况中,因为10.0.0.1不是公网可路由的IP地址,所以不能通过网络直接连接IP地址10.0.0.1。–在第二种情况中,来自B的TCPSYN请求将会直接到达NATA的62000端口,但因为NATA只允许外流的连接从而拒绝该连接请求。反向连接(Connectionreversal)•在所有尝试失败后,客户机B只能请求服务器S对客户机A转发一个请求到客户机A,请求A创建一个“反向”的连接到B。客户机A一收到这个经过S的转发请求后,将建立一个与B通信的TCP连接(在B的公网IP地址和端口号上)。NATA允许这个连接通过,因为这个连接起源于NATA的内部,同时客户端B接受这个连接因为B并不位于NAT之后。现在很多的P2P系统采用这种技术。•主要缺陷:只有一端在NAT之后这个技术才能生效。而通常情况中,往往两端都在NAT后面,不能采用这种技术。因为反向连接不是问题的通用解决办法,并不推荐。NAT存在问题•通过NAT,子网内的计算机向外连结是很容易的(NAT相当于透明的,子网内的和外网的计算机不用知道NAT的情况)。•但是如果外部的计算机想访问子网内的计算机就比较困难了!怎么办?客户机分别位于不同NAT后面服务器S18.181.0.31:1234||+----------------------+----------------------+||NATANATB155.99.25.11:62000138.76.29.7:31000||||客户机A客户机B10.0.0.1:123410.1.1.3:1234UDP打洞技术(UDPHolePunching)•“UDP打洞技术”依赖公共防火墙和锥形NAT,允许恰当的有计划的P2P应用程序通过NAT打洞,即使通信双方的计算机都在NAT之后。谁发起?•有了上面的理论,实现两个内网的主机通讯就差最后一步了:那就是鸡生蛋还是蛋生鸡的问题了,两边都无法主动发出连接请求,谁也不知道谁的公网地址,那我们如何来打这个洞呢?我们需要一个中间人来联系这两个内网主机。“打洞”过程(一)•(1)首先,ClientA登录服务器,NATA为这次连接分配了一个端口62000,那么ServerS收到的ClientA的地址是155.99.25.11:62000,这就是ClientA的外网地址了。•(2)同样,ClientB登录ServerS,NATB给此次连接分配的端口是31000,那么ServerS收到的B的地址是138.76.29.7:31000。•此时,ClientA与ClientB都可以与ServerS通信了。P2P通信方式(1)(2)NATA地址转换表客户AIP:Port外部IP:PortNAT公网IP:公网Port10.0.0.1:123418.181.0.31:1234155.99.25.11:62000客户BIP:Port外部IP:PortNAT公网IP:公网Port10.0.0.3:123418.181.0.31:1234138.76.29.7:31000NATB地址转换表服务器S客户客户IP:Port客户机A155.99.25.11:62000客户机B138.76.29.7:31000(1)(2)“打洞”过程(二)•如果ClientA此时想直接发送信息给ClientB,那么他可以从ServerS那儿获得B的公网地址138.76.29.7:31000,是不是ClientA向这个地址发送信息ClientB就能收到了呢?•答案是不行,因为如果这样发送信息,NATB会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。客户BIP:Port外部IP:PortNAT公网IP:公网Port10.0.0.3:123418.181.0.31:123413