发布时间:2025-09-27 14:50:09 点击量:
HASH GAME - Online Skill Game GET 300
分析该流程可以知道,传统的 NAT 处理软件转发数据包时系统的性能瓶颈主要在内存 访问、查表以及数据包校验和的计算三个方面。 1) 数据在到达路由器时,CPM 将数据包存放到驱动程序在物理内存中的缓冲区内。驱动 程序先将收到的数据包复制到虚拟内存中,再提交给上层 IP 协议模块进行 NAT 处理。处理 完成后,上层协议模块把要转发的数据包交给驱动程序,由驱动程序转发。驱动程序再把 数据包从虚拟内存复制到物理内存,并提示 CPM 进行物理转发。 整个过程中,数据包在虚拟内存和物理内存间进行了两次复制,消耗了大量的总线时 间。如果能够减少内存操作的次数,将会极大地提高 NAT 转发的效率。 2) 路由器在进行 NAT 转发时,要在内存中维护一张表,内网和外网主机之间的一个连接 对应这张表中的一个表项。路由器收到每个包都要进行一次查表操作,查表操作的数量很 大,也可以构成系统性能瓶颈之一。
当内部网络需要和外部网络通信时,这两种方式的 NAT 都是将内部 IP 对应为一个唯一 合法 IP 地址,将包发送给目标主机。目标主机返回的包由 NAT 将目的地址转换回内部 IP 地址。 静态 NAT 配置其实是一种一一对应的关系。在配置之后将一个内部地址 A 对应到一个 外部地址 B。之后所有由 A 发出的报文经过 NAT 后都将源地址改为 B,而对外部来说,它 们看到的仅是 B,所有发往 B 的报文,经 NAT 之后将目的地址改为 A,转发给 A。 动态简单方式与静态方式的不同在于动态方式存在一个地址池的概念。设置的地址池 至少得包含一个地址。内部的某个地址在和外部进行通信时会从地址池中选出一个地址作 为它的对外地址,这种一对一的关系和静态 NAT 类似。不同的是当此内部地址通信完毕后 它须将它对应的那个对外的地址归还到地址池中,以供其他人使用。 当地址池中仅含一个地址时,其实际上和静态方式相同。 2) 动态 overload 方式 动态 overload 方式与动态简单方式不同的在于 NAT 的对外可用地址只有一个。内部在 和外部进行通信时都是使用这个对外地址,对于每个不同的连接,在经过 NAT 时都给予分 配一个可用的端口,不同的连接以不同的端口号进行区别。
NAT算法中三个最关键的步骤是:地址绑定,地址映射查询以及地址解绑定[5]。 地址和端口绑定就是路由器为私有地址和全局地址建立映射(即建立地址翻译)的过 程。地址绑定可以是静态的,也可以是动态的。动态地址绑定发生在链接建立的时刻,一 旦私有地址和全局地址的映射关系建立,路由器将使用现有的地址映射关系转发该连接的 后续数据包。连接结束后,路由器接触该连接的地址映射关系,即解绑定。 路由器为其收到的每一个合法数据包查询私有地址和全局地址的映射关系,并据此转 发数据包。路由器处理的数据量与其查询次数成正比。因此,设计一个高效的建立以及查 询私有地址和全局地址的映射关系的算法对提高路由器 NAT 转发效率至关重要。
传统的路由器软件设计成分层结构,驱动程序和操作系统处于底层,底层软件为上层 网络协议提供调用接口,提供数据传输服务。这样做的好处是软件层次清晰,底层和高层 软件分工明确,有助于团队协作开发。但是,复杂的软件结构必然会降低执行效率,这一 点在对速度和时延敏感的网络应用中体现得尤为明显。 为了提高 NAT 设备数据转发的效率,我们采用了以驱动程序为核心的程序架构,设备 在接收到数据包后,在驱动程序中完成 NAT 转发功能。实践证明,这种设计有效地提高了 NAT 设备的包转发率。 现有的路由器以太网驱动程序使用中断方式收发数据。处理器每收到一个数据包,或 者发送完一个数据包都会进入中断处理例程。可以推断,现实应用中,处理器需要处理大 量处理中断。 中断控制方式虽然具有很多优点,但对于传送数据量很大的高速外设,如磁盘控制器 或高速数据采集器,它满足不了速度方面的要求。中断方式和查询方式一样,仍然是通过 CPU执行程序来实现数据传送的。但对于中断方式, 每进行一次传送,CPU都必须执行一遍 中断服务程序。而每进入一次中断服务程序,CPU都要保存寄存器现场,而中断结束时又 要恢复寄存器现场。这就需要进行大量的内存读写操作,降低了CPU的处理能力[3]。 本设计的驱动程序使用查询方式。查询方式的驱动程序有效地避免了保存和恢复中断 现场造成的处理器开销。 我们所实现的高速NAT,驱动程序分别为两个以太网接口的接收缓冲区设置了 128 个缓 冲区描述符(Buffer Descriptor)。驱动程序循环扫描每Baidu Nhomakorabea接口的每个缓冲区描述符,如果 发现已经就绪的描述符,驱动程序根据描述符读取缓冲区中的数据报,并把它交给NAT处 理流程进行处理。处理完成后,驱动程序通知处理器转发数据包[4]。驱动程序算法如下: RecvLoop() { i=0; while( TRUE ) { /* Scan the local area network interface and do the NAT */ if ( i==Number of Receive Buffer Descriptors ) { i=0; RxBD = First Receive Buffer Descriptor Address; } if ( RxBD is Ready ) { NatBDBuff(RxBD); i; RxBD; Send the processed packet out. } /* Scan the local area network interface and do the NAT */ if ( i==Number of Receive Buffer Descriptors ) { i=0; RxBD = First Receive Buffer Descriptor Address; } if ( RxBD is Ready ) { NatBDBuff(RxBD); i; RxBD; Send the processed packet out. } }
NAT 主要应用于以下几种情形: 需要将自己的网络连到 INTERNET 上,但合法 IP 地址不够。于是在连接内部网络 (inside network)和 INTERNET(outside network)的路由器上配置 NAT,将私有 IP 转换为合法 IP 地址再发送出去。 在和外部网络通信时,要求转换 IP 地址,可以配置 NAT。 需要在内部网络做一定的任务分配,以对外提供各种类型的服务。 适用于内部较少的机器访问外部网络。当内部机器需要访问外部时,NAT 会为它 分配外部地址,当它访问完毕后,分配的地址会释放重用。NAT 的好处在于配置 时它不需对内部主机做任何修改。 配置 NAT 的路由器要求配一个内部端口,一个外部端口。通常是内部端口连接内部网 的末端域,外部端口连接骨干网。当 IP 包从内部进来,NAT 将其源地址转换为合法地址从 外部端口传出;反之,当外部包进入时,NAT 将目的地址转换为内部地址。当合法地址空 间用完时,从内部送出的包就会被丢弃,并送目的主机不可达的 ICMP 报文。当有多个外 部端口存在时,NAT 必须有相同的转换表。 NAT 定义了以下四种地址: Inside Local Address(saddr):内部网络机器上的 IP 地址,一般不是合法地址。 Inside Global Address(maddr):合法 IP 地址,用于替代一个或多个 Inside Local Address。 Outside Local Address:外部地址在内部网络呈现的地址。(本实现中暂不使用) Outside Global Address(daddr):外部网络主机合法 IP 地址。
对于 TCP 和 UDP 协议来说,地址映射中必须包含的信息有:私有地址和私有地址端 口、远端全局地址和远端全局地址端口以及本地私有地址进行地址翻译后对应的全局地址 (本地全局地址)和全局端口(本地全局端口)。路由器做 NAT 转发时,为每个连接维护 一个上述的映射,即映射表。路由器的每个转发操作都要对应至少一次查表操作。我们采 用了哈希算法应用于地址映射表项的建立和查询过程,具体算法如图 2 所示。 为了减小哈希算法的冲突,可以在物理内存容量允许的情况下尽可能增大哈希查找表 的表长。哈希表的冲突域使用链式数据结构,在哈希值计算结果相同的情况下,查找程序 通过冲突域表项中的本地全局端口确定具体的 NAT 映射表项。如果某映射表项被查找命 中,则移动该表项到冲突域的表头,以减少下一次查找的查找长度。另外,冲突表项中的 本地全局端口在初始化时由程序固定分配。