引言
近年来,随着internet的迅猛发展,连入internet的主机数量成倍增长。由于最初设计internet的时候并没有考虑到需要支持这么大的规模,因而internet使用的ipv4协议中ip地址的长度选择了32位,它可以使ip包的格式很好地对齐;但是,目前ip地址的短缺已经成为internet面临的最大问题之一。
为了解决ip地址短缺的问题,人们提出了许多解决方案,nternet能够支持到新一代ip协议ipv6的出台。在众多的解决方案中,网络地址转换nat(network address translation)技术提供了一种完全将私有网和公共网隔离的方法,从而得到了广泛的应用。
1 nat技术
nat技术的基本功能就是,用1个或几个ip地址来实现1个私有网中的所有主机和公共网中主机的ip通信。nat技术可为tcp、udp以及icmp数据包提供透明转发。
1.1 nat工作原理
nat的基本工作原理是,当私有网主机和公共网主机通信的ip包经过nat网关时,将ip包中的源ip或目的ip在私有ip和nat的公共ip之间进行转换。
图1 nat工作原理示意图
如图1所示,nat网关有2个网络端口,其中公共网络端口的ip地址是统一分配的公共ip,为202.204.65.2;私有网络端口的ip地址是保留地址,为192.168.1.1。私有网中的主机192.168.1.2向公共网中的主机166.111.80.200发送了1个ip包(des=166.111.80.200,src=192.168.1.2)。当ip包经过nat网关时,nat会将ip包的源ip转换为nat的公共 ip并转发到公共网,此时ip包(des=166.111.80.200,src=202.204.65.2)中已经不含任何私有网ip的信息。由于ip 包的源ip已经被转换成nat的公共ip,响应的ip包(des=202.204.65.2,src=166.111.80.200)将被发送到nat。这时,nat会将ip包的目的ip转换成私有网中主机的ip,然后将ip包(des=192.168.1.2,src=166.111.80.200)转发到私有网。对于通信双方而言,这种地址的转换过程是完全透明的。
1.2 napt技术
由于nat实现是私有ip和nat的公共ip之间的转换,那么,私有网中同时与公共网进行通信的主机数量就受到nat的公共ip地址数量的限制。为了克服这种限制,nat被进一步扩展到在进行ip地址转换的同时进行port的转换,这就是网络地址端口转换napt(network address port translation)技术。
napt与nat的区别在于,napt不仅转换ip包中的ip地址,还对ip包中tcp和udp的port进行转换。这使得多台私有网主机利用1个nat公共ip就可以同时和公共网进行通信。
如图2所示,私有网主机192.168.1.2要访问公共网中的http服务器166.111.80.200。首先,要建立tcp连接,假设分配的tcp port是1010,发送了1个ip包(des=166.111.80.200:80,src=192.168.1.2:1010),当ip包经过nat 网关时,nat会将ip包的源ip转换为nat的公共ip,同时将源port转换为nat动态分配的1个port。然后,转发到公共网,此时ip包(des=166.111.80.200:80,src=202.204.65.2:2010)已经不含任何私有网ip和port的信息。由于ip包的源 ip和port已经被转换成nat的公共ip和port,响应的ip包(des=202.204.65.2:,src=2010166.111.80.200:80)将被发送到nat。这时nat会将ip包的目的ip转换成私有网主机的ip,同时将目的port转换为私有网主机的port,然后将ip包(des=192.168.1.2:1010,src=166.111.80.200:80)转发到私网。对于通信双方而言,这种ip地址和port的转换是完全透明的。
2 vxworks的网络协议栈
与vxworks操作系统捆绑发行的标准网络协议栈,是一个与bsd4.4兼容、功能齐全并针对嵌入式应用作了大量优化的tcp/ip协议栈。该网络协议栈与vxworks操作系统、开发工具、设备管理工具以及上层协议和应用可以集成在一起,有完整的路由功能并可以根据需要进行剪裁。 vxworks的网络协议栈的分层结构如图3所示。
vxworks网络协议栈传输数据使用的内存,是在系统启动进行网络协议初始化的时候就申请下来的,并使用系统提供的netbuflib建立内存字点池来管理这些内存空间。网络协议栈传输数据所需的内存都是从这些内存节点池中申请,使用完毕后再释放。
netbuflib通过3种数据结构处理网络协议栈传输的数据:mblk、clblk和cluster。其中,cluster保存的是实际的数据,mblk和clblk中保存的信息是用来管理cluster中保存的数据的。为了满足传输不同大小数据的需要,cluster是一些大小不同的内存块;缺省情况下,vxworks网络协议栈创建了大小从64~2048字节的6个不同的内存节点池。
由于mblk中保存的只是指向数据的指针,因此,网络协议栈不同层之间的数据传输可以避免数据拷贝。此外,对于分布在多个cluster中的数据,可以通过mblk把它们链在一起,并且只需要传递链首的mblk就可以了。vxworks网络协议栈的“零拷贝”技术就是建立在这种机制的基础之上的。图4描述了2个提交给网络协议栈tcp层的包的数据结构。
在mblk结构中,有2个指向其它mblk的指针:1个指向同一个包的下一个mblk;另一个指向下一个包的链首的mblk。clblk指向的就是实际存储数据的cluster。
3 向vxworks网络协议栈加入nat
为了向vxworks网络协议栈中加入nat,必须实现2个基本操作:ip包的截获得ip包的处理。
3.1 vxworks下ip包的截获
vxworks网络协议栈在物理驱动层和ip层上分别提供了两类钩子函数:etherhook和ipfilterhook。利用这两类钩子函数,可以实现对ip包的截获。
(1)etherhook
etherhook提供对以太帧的截获功能。它包括2个钩子函数:以太帧接收钩子函数etherinputhook和以太帧发送钩子函数 etheroutputhook。它们分别用函数etherinputhookadd和etheroutputhookadd安装。安装了这些钩子函数后,每当有以太帧被接收到时,函数etherinputhook就会在该以太帧被提交给上层处理前被自动调用;每当有以太帧被发送时,函数 etheroutputhook会在该以太帧被发送前被自动调用。通过截获以太帖,可以达到截获ip包的目的。
(2)ipfilterhook
ipfilterhook提供对ip包的截获功能。它只对应1个钩子函数,用函数ipfilterhookadd就可以完成 ipfilterhook的安装。安装了ipfilterhook后,每当有ip包被接收到时,函数ipfilterhook就会被自动调用,从而实现对 ip包的截获。
3.2 nat过程中ip包的处理
利用钩子函数完成ip包的截获后,就可以根据需要对ip包进行处理。首先,可以从ip包中剥离出ip头,根据ip头中的“协议”域可以判断出是 udp包还是tcp包。然后,从ip包中剥离出udp头或tcp头,利用ip头和udp头或者tcp头中的相关信息,就可以根据需要进行ip地址和 port的转换处理。
nat一般采用1个映射表来实现ip地址和port的转换。对于截获到的ip包,通过比较ip包的目的ip、目的port、源ip、源port和nat映射表中的相应表现,对ip包的目的ip、目的port、源ip、源port进行转换。
典型的nat映射表如图5所示。
(1)处理由内到外的ip包
由内到外的ip包指的是私有网主机通过nat发送到公共网主机的ip包。它的源ip是私有ip,目的ip是公共ip。
当截获到1个由内到外的ip包时,nat首先以ip包的源ip和源port作为real src ip和real src port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的nat ip和nat port替换ip包的源ip和源port,而保持ip包的目的ip和目的port不变。然后,重新计算tcp或udp的校验和,就可把ip包归还给 vxworks网络协议栈。
如果在映射表中没有搜索到对应的表项,nat就会向映射表中添加1个新的表现。该表项中的real src ip和real src port用ip包的源ip和源port来填充;nat port用nat分配的1个空闲port填充。然后,根据新增加的表项,按照上面相同的步骤完成对ip包的处理。后续相同的ip包也都用这个表项来处理。
(2)处理由外到内的ip包
由外到内的ip包指的是从公共网通过nat发送到私有用的ip包。它的源ip是公共ip,目的ip是nat的公共ip。
当截获到1个由外到内的ip包时,nat就以ip包的目的ip和目的port作为nat ip和nat port的匹配条件,在映射表中进行搜索。如果找到1个对应的表项,就用表项的real src ip和real src port来替换ip包的目的ip和目的port,而保持ip包的源ip和源port不变。然后,重新计算tcp或udp的校验和,就可把ip包归还给 vxworks网络协议栈。
如果在映射表中没有搜索到对应的表项,则对ip包不作任何处理,直接归还给vxworks网络协议栈。
(3)nat映射表的配置
作为nat完成ip包中ip和port转换的依据,nat映射表的管理关系到nat的功能和性能。nat映射表的配置可以分为2部分:静态配置部分和动态配置部分。
静态配置部分主要用于nat ip、nat port和私有ip、私有port的映射关系可以预见的应用,例如udp通信和tcp server运行在私网中某个主机等情况。nat映射表静态配置部分可以在nat运行前根据规划直接完成配置。
动态配置部分主要用于nat ip、nat port和私有ip、私有port的映射关系不可预见的应用,例如在私有网中某个主机上运行tcp client来与公共网中某个主机上的tcp server建立连接进行通信。因这种情况下,私有网主机使用的port是动态分配的。为了实现需要nat ip、nat port和私有ip、私有port的转换,必须动态配置nat映射表。相对于静态配置部分而言,动态配置部分的数据结构、数据组织和搜索算法的设计和实现的难度要大得多,关键是要实现一个高效的搜索算法。
大华海量数据存储系统的性能特点和实现
5G如何加快推进计算在云边端的部署?
每日一课 | 智慧灯杆边缘计算的优点汇总
电容补偿柜常见故障
VL106单芯片概述、关键特性及主要特点
基于VxWorks操作系统的网络协议栈实现NAT/NAPT技术应用
微放电检测方法的总结与分析详细教程
英伟达将向中国提供替代芯片A800 符合出口管制新规!
如何在EAGLE CAD中编写一个ULP
分享一个电网倾角计电路
iphone8什么时候上市最新消息:iphone8、iphone7真机对比,这样的iphone8是你喜欢的机型吗?
2017新型病毒隐藏在YouTube中 能完全接管你的手机
努比亚Z系列将于7月发布 超窄边框设计
国内最大LED采购交易中心落户深圳
一加5第三轮抢购开启但仿iPhone设计无法避免尴尬的屏幕问题
水位传感器的工作原理及结构作用介绍
APP内容广告不能一键关闭,微信、汽车之家等APP被上海消保委点名
漫威联合UBTECH推出钢铁侠AR机器人MK50
浅谈Molex发布定制电缆生成器
VOCs监测、管理、运维一体化物联网解决方案