您的位置:首页 > 其它

IPv4寿命延长:NAT地址转换

2017-07-30 02:19 246 查看
我还在上大学那会儿就说要推广IPv6技术了,但直到今天大多数教科书关于网络的部分重点仍然在IPv4上面。前不久google发布了全球IPv6的部署统计,除了比利时差不多占了一半,哪怕是信息技术发达的北美都差强人意,更别说第三世界国家了。按理说IPv4仅能提供43亿左右的地址,全球人均一个都不够分,何况现在物联网时代有多少五花八门的设备需要IP地址。当然我是知道我们有局域网,也就是所谓的内网,是不需要占用公网IP地址的,但是一直没弄清具体的原理。作为一个程序员,对TCP之类的传输层协议自然是要清楚的,但是网络层和链路层就不怎么了解,一来和普通应用程序开发的关系不大,再说涉及到的各种设备、解决方案、协议都太多了,恐怕只有网络管理员和IT系统集成人员需要和那些东西打交道。既然IPv4能苟延残喘至今,关于内网通信的问题还是有必要搞清的,毕竟内部IP有诸多限制,典型的例子,比如开发P2P程序要如何穿透?把相关的知识整理了一下,大概知道个所以然,具体细节还是需要去查询文档的。

首先,目前的路由基本都支持无类地址。无类地址区别于有类地址,也就是A类、B类、C类地址(D类和E类地址有特殊用途)。A类地址可以提供的网络数目不多,但一个网络可以容纳N多个主机,C类恰好相反,一个网络中只能有256-2=254个主机。为了让IP地址分配更加灵活,就有了掩码的概念,比如一个B类地址看成二进制形式,前16位是网络号,后16位是主机号,如果掩码变成17位呢,那么支持的主机数目就要减半了。因此,大的网络可以拆分成小网络,反过来,小规模的网络也可以合并,比如两个相邻的C类地址合在一起,支持的主机数目差不多翻倍。当然这一切的前提是有了相应的规范和协议支持。这样一来,网络服务提供商可以申请合适规模的网络地址,避免IPv4地址快速枯竭。

接下来,假如从互联网服务供应商(比如电信、网通)那里申请到了一个连接,那么家庭里所有的电脑和手机都可以上网,家庭内部等于组建了一个小型的局域网,所有设备都链接到负责连通外部网络的路由器上面(常见的有TP-Link)。此时用ipconfig命令可以看到详情,通常IP地址和默认网关是192.168开头的,掩码是255.255.255.0。事实上,A、B、C类地址各自划分出了一段供内网使用,分别是10.0.0.0~10.255.255.255(A类),172.16.0.0~172.31.255.255(B类),192.168.0.0~192.168.255.255(C类),这类地址是可重用的私有地址,绝对不会在互联网上被当作公共IP地址来访问。通常路由器同时充当DHCP服务器,会自动将家庭局域网设置成C类私有地址,因为设备不会太多,如果是在大一点的组织内,内部网络可能是由A类或B类私有地址进一步划分的(当然也有把公网IP地址用作内部IP地址的,并不规范)。另外,我发现自己的DNS
Server被自动设置为10.64.0.200,这也应该是一个私有地址,个人推测,需要解析DNS域名时,路由器会把分组发送到家庭局域网的外部的DNS服务器,但它仍然位于网络服务提供商的内部网络。我们通过路由器拨号上网的时候,这些默认配置数据会被获取并自动设置。

于是,内部网络通过路由器接入外网(内外是相对的,比方说你的外网其实是另一个大型的局域网),就可以访问互联网上的公有IP地址了,但是外部网络如何访问内网的主机呢,其实是办不到的,对外部而言内网的所有主机都共享一个IP地址。我们知道一些常见的协议比如TCP,需要连接的双方的IP地址和端口号,假设内网的某台主机是客户端,公网的某个IP是服务端,那么如何连接呢,此时网络地址转换(Network Address Translator)就派上用场了。NAT分为基本的地址转换和NAPT转换方式,现在常见的是后者,根据全称Network
Address Port Translator就可以得知是利用端口号进行了IP共享。当内部主机连接外面的服务器时,会为该连接创建一个地址映射,内部的主机对外表现为同一地址,但是端口号变了,可用的端口号有几万了,足够许多支撑许多内网主机同时运行了。当然也会带来一些新的问题,比如传输层协议有CRC校验,首部的IP地址和端口号都要参与校验,一旦转换过后CRC就失效了,所以负责NAT的网关还有额外的工作要做。

虽然内网的主机可以访问外网,但反过来则不能,例如在一个TCP通信中,内网的主机作为客户端可以去连接服务端,但外部主机却无法主动发起一个连接,因为内网的IP地址在互联网上根本不可达,内网的主机若想成为服务端,于是需要动态域名解析来完成这个任务。动态域名解析可以让不断变更的IP地址绑定到固有的域名上,一些动态域名服务提供商(比如花生壳)也有相应的内网版软件,其原理等于是多了一重转发。其过程相当于内网的主机先运行软件去连接外部的服务器(当然也需要保活该连接),固有域名解析指向该服务器,于是根据预设的映射,数据会被转发到内网的主机,从外界看起来好像访问的是一个固定的网站一样。通过这种方法一些访问量不大的网站可以直接在内部建站,然后购买动态域名解析服务,不仅成本比租用虚拟主机要低,还可以避免一些安全性问题。

最后是关于P2P。为了减轻服务器的压力,当前数据量大的传送经常会以P2P的方式进行,让客户端之间建立接连互相交换数据。由于相当多的主机都位于内网,彼此之间无法直接通讯,因此需要借助具有公网IP的服务端担任中间人,再想办法让peer之间的连接穿越NAT网关。事实上,NAT并没有绝对标准可以遵循,具体的实现方式不同,而且实施细节也不同,所以并没有简单的P2P方案可以应付所有的情况,好比说是同样用P2P软件下载,某个资源你不停的连接就是无法传送数据,或许位于另一个网络的某个客户端就可以顺利下载。总之,P2P穿越NAT的原理就是在NAT上打洞,NAT设备维护着内外地址转换的映射表,peer通过服务器获取彼此的信息,通过发送试探性的数据可以在对方NAT网关的映射表上留下记录,就好比在墙上打开了一个洞,之后数据就可以穿过了。具体细节的可以参考这篇文档:http://www.360doc.com/content/12/0428/17/6187784_207328686.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NAT IPv4