软件测试管理

当前位置:首页 > 软件测试管理

《计算机网络:自顶向下方法》第四章 续4

3.网络地址转换


讨论了有关因特网地址和IPv4数据报格式后,我们现在可清楚地认识到每个IP使能的设备都需要一个IP地址。随着所谓小型办公室、家庭办公室(SmallOfFice,HomeOffice, SOHO)子网的大量出现,这看起来意味着每当一个SOHO想安装一个LAN以互联多台机器时,需要ISP分配一组地址以供该 SOHO的所有机器使用。如果该子网变大了(例如家里的孩子们不仅有自己的计算机,而且还有智能手机、联网游戏机),则需要分配一块较大的地址。但如果ISP已经为SOHO网络当前地址范围分配过一块连续地址该怎么办呢?并且家庭主人要(或应该需要)首先知道管理IP地址的典型方法有哪些呢?幸运的是,有一种简单的方法越来越广泛地在这些情况场合:网络地址转换( Network AddressTranslation, NAT) [ RFC 2663; RFC 3022; Zhang 2007]。


图4-22显示了一台NAT使能路由器的运行情况。位于家中的NAT使能的路由器有一个接口,该接口是图4-22中右侧所示家庭网络的一部分。在家庭网络内的编址就像我们在上面看到的完全样,其中的所有4个接口都具有相同的网络地址10.0. 0/24。地址空间10.0.0.0/8是在[RFC 1918]中保留的3部分IP地址空间之一,这些地址用于 如图4-22中的家庭网络等专用网络或具有专用地址的地域( realm)。具有专用地址的地域是指其地址仅对该网络中的设备有意义的网络。为了明白它为什么重要,考虑有数十万家庭网络这样的事实,许多使用了相同的地址空间10.0.0.0/24。在一个给定家庭网络中的设备能够使用10. 0.0.0/24编址彼此发送分组。然而,转发到家庭网络之外进人更大的全球因特网的分组显然不能使用这些地址( 或作为源地址,或作为目的地址),因为有数十万的网络使用着这块地址。这就是说,10. 0.0.0/24地址仅在给定的网络中才有意义。但是如果专用地址仅在给定的网络中才有意义的话,当向或从全球因特网发送或接收分组,地址在何处才必须是唯一的呢?答案在于理解NAT。


NAT使能路由器对于外部世界来说甚至不像一台路由器。NAT路由器对外界的行为反过来就如同一个具有单一IP 地址的单一设备。在图4-22中,所有离开家庭路由器流向更大因特网的报文都拥有一个源IP地址138. 76. 29.7,且所有进人家庭的报文都拥有同一个目的IP地址138.76.29.7。从本质上讲,NAT使能路由器对外界隐藏了家庭网络的细节。(另外,你也许想知道家庭网络计算机是从哪儿得到其地址,路由器又是从哪儿得到它的单一IP地址的。在通常的情况下,答案是相同的,即DHCP!路由器从ISP的DHCP服务器得到它的地址,并且路由器运行一个DHCP服务器,为位于NAT-DHCP路由器控制的家庭网络地址空间中的计算机提供地址。)


《计算机网络:自顶向下方法》第四章 续3


如果从广域网到达NAT路由器的所有数据报都有相同的目的IP地址(特别是对NAT路由器广域网一侧的接口),那么该路由器怎样知道它应将某个分组转发给哪个内部主机呢?技巧就是使用在NAT路由器上的一张NAT转换表( NAT translation table),并且在表项中包含了端口号及其IP地址。


考虑图4-22中的例子。假设一个用户坐在家庭网络主机10.0.0.1旁,请求IP地址为128. 119. 40. 186的某台Web服务器(端口80)上的一个Web页面。主机10.0.0. 1为其指派了(任意)源端口号3345并将该数据报发送到LAN中。NAT路由器收到该数据报,为该数据报生成一个新的源端口号5001,将源IP替代为其广域网一侧接口的IP地址138. 76. 29.7,且将源端口3345更换为新端口5001。当生成一个新的源端口号时,NAT路由器可选择任意一个 当前未在NAT转换表中的源端口号。(注意到因为端口号字段为16比特长,NAT协议可支持超过60000个并行使用路由器广域网一侧IP地址的连接!)路由器中的NAT也在它的NAT转换表中增加一表项。Web服务器并不知道刚到达的包含HTTP请求的数据报已被NAT路由器进行了改装,它会发回一个响应报文,其目的地址是NAT路由器的IP地址,其目的端口是5001。当该报文到达NAT路由器时,路由器使用目的IP地址与目的端口号从NAT转换表中检索出家庭网络浏览器使用的适当IP地址(10.0.0.1)和目的端口号(3345)。 于是,路由器改写该数据报的目的IP地址与目的端口号,并向家庭网络转发该数据报。


NAT在近几年已得到了广泛的应用。但是,我们应当提及的是,许多IETF团体中的纯化论者大声疾呼反对NAT。第一,他们认为端口号是用于进程编址的,而不是用于主机编址的。(这种违规用法对于运行在家庭网络中的服务器来说确实会引起问题,因为我们已在第2章看到,服务器进程在周知端口号上等待入请求。)第二,他们认为路由器通常仅应当处理高达第三层的分组。第三,他们认为NAT协议违反了所谓端到端原则,即主机彼此应相互直接对话,结点不应介人修改IP地址与端口号。第四,他们认为应使用IPv6 (参见4. 4.4节)来解决IP地址短缺问题,而不是不计后果地用一种如NAT之类的权宜之计来修补存在的问题。但不管喜欢与否,NAT 已成为因特网的一个重要组件。


NAT的另一个重要问题是它妨碍P2P应用程序,包括P2P文件共享应用和P2PIP语音应用。第2章讲过在一个P2P应用程序中,任何参与对等方A应当能够对任何其他参与对等方B发起一条TCP连接。该问题的实质在于如果对等方B在一个NAT后面,它不能充当服务器并接收TCP连接。如我们将在课后习题中所见,如果对等方A不在一个NAT的后面,则该NAT问题能够绕过去。在这种情况下,对等方A能够首先通过.个中间对等方C与对等方B联系,其中C不位于NAT之后并与B已经创建了一条进行中的TCP连接。对等方A则能够经对等方C请求对等方B,发起直接返回对等方A的一条TCP连接。一旦对等方A和B之间创建一条 直接的P2P TCP连接,这两个对等方就能够交换报文或文件。这种雇佣关系被称为连接反转( connection reversal,,实际上被许多P2P应用程序用于NAT穿越(NAT traversal)。如果对等方A和对等方B都在它们自己的NAT后面,这种情况有些棘手,但是能够使用应用程序进行中继处理,正如我们在第2章中对于Skype中继所见到的那样。


4. UPnP


NAT穿越正越来越多地由通用即插即用(UPnP)提供,UPnP是一种允许主机发现并配置邻近NAT的协议[ UPnP Forum 2012]。UPnP 要求主机和NAT都是UPnP兼容的。使用UPnP,在主机上运行的应用程序能够为某些请求的公共端口号请求-一个 NAT映射,该映射位于其(专用IP地址,专用端口号)和(公共IP地址,公共端口号)之间。如果某NAT接受该请求并生成映射,则来自外部的结点能够发起到( 公共IP地址,公共端口号)的TCP连接。此外,UPnP 让该应用程序知道(公共IP地址,公共端口号),因此该应用程序能够向外部世界通告它。


举一个例子,假定你的主机位于一个UPnP使能的NAT背后,具有专用地址10.0.0. 1并且在端口3345上运行BitTorrent。 另外假定该NAT的公共IP地址是138. 76. 29. 7。你的BitTorrent应用程序自然要能够接受来自其他主机的连接,使得它能够同其他主机对换块。此后,你主机上的BitTorrent 应用程序请求NAT产生一个“洞”,将(10.0.0.1, 3345 )映射到(138. 76.29.7,5001)。 (该应用程序选择了公共端口号5001。)在你主机中的Bit-Torrent应用程序也能够向它的追踪器通告它在(138. 76. 29.7, 5001) 可供使用。以这种方式,运行BitTorrent的一台外部主机能够联系该追踪器,并知道你的BiTorent应用程序正运行在(138. 76.29.7,5001)。 该外部主机能够向(138. 76.29.7, 5001)发送TCPSYN分组。当NAT接收到该SYN分组,它将改变分组中的目的IP地址和端口号,并通过NAT转发分组。


总而言之,UPnP 允许外部主机使用TCP或UDP向NAT化的主机发起通信会话。长期以来NAT一直对P2P应用程序十分不利;UPnP由于提供了有效和健壮的NAT穿越解决方案,可能成为了P2P应用程序的救世主。这里我们对NAT和UPnP的讨论十分简要,对于NAT更为详细的讨论参见[ Huston 2004; Cisco NAT 2012]。


相关内容

文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~