




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一种基于一种基于 Socket API 的的 IPV6 应用程序自动翻译实现 方法 应用程序自动翻译实现 方法 金仙力1 邵雯娟2 马严3 1 2 3北京邮电大学计算机科学与技术学院 1000876 email jinsonly 摘摘 要 要 本文在研究 IPv6 应用程序过渡策略的基础上 结合编译原理 使用标准 C 语言实 现了一个基于 Socket API 的 IPv6 应用程序半自动翻译器 实现后的翻译器可以在各种支 持标准 C 的操作系统下编译运行 具有较强的移植性 在经过实际的测试后 该翻译器的翻 译效果良好 关键词 关键词 IPv6 套接口 应用程序过渡 编译原理 词法分析 语法分析 1 引言 1 引言 随着 IPv6 网络的飞速普及 目前网络中大量的主机 路由器上常用的应用程序都只是 支持 IPv4 的 随着 IPv4 网络向 IPv6 网络的平滑过渡 应用程序也需要相应地过渡到 IPv6 环境下 这时 构建基于 IPv6 的应用程序就显得很有必要 目前 大部分现有的网络应用 程序是为 IPv4 编写的 根据 IPv6 应用程序过渡策略 1 可以得出 大部分 IPv4 应用程序 若要转换成兼容 IPv4 IPv6 应用程序应该不是很困难的 很多修改的地方都可用一个翻译器 自动完成 随着 IP 网络的平滑过渡 由 IPv4 到 IPv6 应用的过渡也是势在必行的 而 IPv4 应用程序到 IPv6 应用程序的翻译机目前还比较少见 所以 构建一个基于源代码的 IPv6 应 用程序翻译器 有一定的实用价值 我们从实用性和应用性的角度 尝试提供一个翻译机 能够实现 IPv4 源程序到 IPv6 源 程序的半自动翻译 它具有如下特点 1 实现 Socket API 层的协议无关性 预先定义的基于 Socket API 的映射表 是 IPv6 应用程序半自动翻译机的翻译根据 在 设计映射表时 将 IPv4 专用的函数 映射为 IPv4 IPv6 通用的函数 因此翻译后的源程序 是协议无关的 2 实现简单并且有效 实际实现时 只需要不到 1000 行程序就可以实现基本的翻译功能 翻译机可以减少应用程序过渡时 手工编码带来的重复劳动 同时 由于一个应用程序 只在涉及到套接口操作时才需要翻译 而这些只占代码量的一小部分 在实现应用程序的过 渡时 无需了解和修改全部源代码 使用本工具能够快速定位和得到相应的翻译指示 3 不用进行 IP 报头的翻译 因为翻译是基于 Socket API 层 所以不涉及到 IP 报头的翻译 4 真正面向 IPv6 的应用 同时兼容 IPv4 在部署IPv6初期的现在 以及IPv6全面盛行的将来都适用 本文从首先分析了IPv4应用程序和IPv6应用程序之间的联系与区别 然后给出了实现基 于Socket API的IPv6应用程序自动翻译所使用的数据结构 接着结合具体实例描述了翻译机 的实现过程 最后总结全文并讨论了下一步的研究工作 1 2 2 IPV6 应用程序半自动翻译机制 应用程序半自动翻译机制 我们之所以把它称之为半自动翻译机 是因为 IPv4 应用程序向 IPv6 应用程序过渡时 许多结构体变量 成员变量以及函数在 IPv4 IPv6 中 分别是一一对应的 可以直接进行 翻译 但是 IPv4 应用程序和 IPv6 应用程序存在一定的区别 一些同 IPv4 紧密相关 对 IPv4 依赖性很强的特性 在 IPv6 中却有可能是不存在 或者是已由其它特性替代 如使用 IPv4 多播 IPv4 套接口选项 或原始套接口的程序 因此无法进行自动翻译 只能手工进行代 码的转换 当遇到这种情况时 IPv6 应用程序的半自动翻译机将给出翻译提示 帮助用户 进行对需翻译的代码进行定位和提示 下面我们就针对 IPv6 应用程序自动翻译机制进行详细论述 2 1 系统功能系统功能 IPv6 应用程序的半自动翻译机原理如图 1 所示 它的主要功能是 根据预先定义的 Socket API 映射表 把 IPv4 的字符流文件翻译成 IPv6 的字符流文件 具体地讲 通过翻译 器 读入 IPv4 的字符流文件 后缀名为 c 或 h 等 进行词法分析和语法分析 调用相应的 模块函数完成相应部分的翻译 并调整格式 再输出对应的 IPv6 字符流文件 完成整个翻 译过程 由图 1 可知 Socket API 映射表由四个映射表构成 常量映射表 常量映射表 地址映 射表和函数映射表 而 IPv4 到 IPv6 的内部翻译模块正是根据 Socket API 映射表的不同类型 调用不同的翻译函数 将 IPv4 的相关部分翻译成 IPv6 对应的相关部分 如 成员变量 sin family 调用 sin6 family 函数翻译成 sockaddr in6 IPv4 地址 表达式转换函数 inet ntoa 调用 trans ntoa 函数翻译成 inet ntop 等 图 1 IPv6 应用程序的半自动翻译机原理图 从编码实现的情况来看 IPv6 应用程序的半自动翻译机是一个简单基本的编译程序 具有多遍扫描的特点 它包含了编译程序的几个基本的主要部分 它们分别是 读取文件 词法分析 语法分析 中间代码生成 翻译 输出文件和提示处理 2 2 设计翻译原则和映射表设计翻译原则和映射表 Socket API为适应IPv6 所做的改动 在实现上 windows平台与Linux平台基本上是一样 的 只是在头文件与支持程度有所不同 对于Linux平台来说 从IPv4 应用程序翻译为IPv6 应用程序 一般不需要包含新的头文件 因为IPv6 套接口地址的定义 新的IPv6 套接口属 2 性的定义 相关常量的定义以及IPPROTO IPV6 的声明等 都包含在头文件中 而IPv4 套接口的相关内容也包含在相同的头文件中 根据前面的相关分析 我们在设计映射表时 只从源程序角度 考虑翻译那些因过渡到 IPv6 引起代码本质上改变的部分 对于一些实际因为套接字发生变化 但代码不改变的函 数 则可不必考虑翻译 如传入 传出套接口地址结构的函数 包括 send sendto receive recv accept listen connect sendmsg recvfrom recvmsg 等 下面对四种映射表分别进行详细讨论 2 2 1 常量映射表和变量映射表 2 2 1 常量映射表和变量映射表 常量映射表主要是将 IPv4 的地址族常量 AF INET 和协议族常量 PF INET 分别翻 译为 IPv6 的地址族常量 AF INET6 和协议族常量 PF INET6 变量映射表负责翻译套接 口地址结构变量与成员变量 如将 IPv4 套接口结构变量 servaddr in 翻译为 IPv6 套接口结 构变量 servaddr in6 IPv4 结构体的成员变量 sin len 翻译为 IPv6 结构体成员变量 sin6 len 等 我们注意到这种翻译对于变量来说是透明的 虽然变量类型产生了变化 但变量名始终 未改变 由于常量和变量从 IPv4 翻译到 IPv6 是一一对应的 因此它们的翻译条件比较简单 可 采用关键字判断法 只需检查该语法单位是否包含有常量映射表中的映射条目 常量和变量 映射表如表 1 所示 表 1 常量和变量映射表 功能说明功能说明 IPv4 IPv6 映射说明映射说明 地址族 AF INET AF INET6 可直接翻译 协议族 PF INET PF INET6 可直接翻译 结构体 sockaddr in sockaddr in6 可直接翻译 套接口长度 sin len sin6 len 可直接翻译 协议族 sin family sin6 family 可直接翻译 端口号 sin port sin6 port 可直接翻译 在进行套接口地址变量的翻译时 必须要注意一种特殊的套地址结构 即通用套接口地 址结构 sockaddr 当在翻译 IPv4 源程序的过程中 若源程序中使用了通用套接口地址 结构变量 由于它是 通用 的 在 IPv6 应用程序中依然将 IPv6 套接口地址结构变量转换为 通用套接口地址结构变量 因此 对应于通用套接口地址结构变量的翻译原则是不需翻译 另外 Socket API还为IPv6扩展了流标记成员变量sin6 flowinfo 但是由于我们需要的是IPv4 到 IPv6 的单向翻译 所以在翻译中不会出现该成员变量 因此此处可忽略该成员变量的翻 译 2 2 2 地址映射表地址映射表 地址映射表负责通配地址和环回地址的翻译 如将 IPv4 的通配地址 常量 INADDR ANY 翻译为 IPv6 的通配地址 in6addr any IPv4 的环回地址 常量 INADDR LOOPBACK 翻译为 IPv6 的通配地址 in6addr loopback 等 判断是否符合地址翻译条件 相对来说比较复杂 由于程序有可能出现书写不规范 以 及考虑到程序注释中也可能出现 IPv4 通配地址和环回地址 为了保证翻译的准确性和避免 误操作 我们并不采用关键字判断法 而是根据向前预读法来判断文法单元是否符合地址翻 3 译的条件 判断工作是在词法分析模块进行 读入某个文法单元 根据所读入的字符识别各 类单词 如 当遇到变量是 sockaddr in 结构类型后 则转入判断单元 判断单元从单词流 中向前预读八个单词 若分别是 sin addr s addr htonl 且最后 一个单词为 INADDR ANY 通配地址的匹配条件 或 INADDR LOOPBACK 环回地 址的匹配条件 则判断为符合地址翻译条件 然后建立相应的地址翻译函数的语法树 通配地址一般在调用 bind 函数之前 通知内核为进程选择一个 IP 地址 在 IPv4 中的 形式为 struct sockaddr in serv serv sin addr s addr htonl INADDR ANY 翻译后为 struct sockaddr in6 serv serv sin6 addr in6addr any 而环回地址用来连接到本地 TCP 或 UDP 服务 一般在调用 connect 函数之前 设置地 址成员变量为环路地址 在 IPv4 中的形式为 struct sockaddr in serv serv sin addr s addr htonl INADDR LOOPBACK 翻译后为 struct sockaddr in6 serv serv sin6 addr in6addr loopback 地址映射表如表 2 所示 表 2 地址映射表 功能说明功能说明 IPv4 IPv6 映射说明映射说明 通配地址 INADDR ANY in6addr any 需语法分析 环回地址 INADDR LOOPBACK in6addr loopback 需语法分析 2 2 3 函数映射表函数映射表 函数映射表的作用是翻译地址 表达式转换函数以及关于名字 地址转换函数的翻译 提示 地址 表达式转换函数包括字符串地址转为 IP 地址函数和 IP 地址转为字符串地址函 数 即由 IPv4 中的 inet aton 翻译为 IPv4 6 通用的 inet pton IPv4 中的 inet ntoa 翻译 为IPv4 6通用的inet ntop 名字 地址转换的套接口函数中 有的套接口函数虽然支持IPv4 协议和 IPv6 协议都支持 如 gethostbyname gethostbyaddr gethostbyname2 等 但是 它们仍然是依赖协议 在调用 gethostbyname 函数前 必须知道放置结果的套接口地址的成 员是哪一种 IPv4 使用 sin addr 成员 IPv6 使用 sin6 addr 成员 而调用 gethostbyaddr 时 必须知道存放二进制地址的是哪一种成员 必须指明想要解析的地址类型 如 AF INET 指 定返回的是 IPv4 地址 AF INET6 指定返回的是 IPv6 地址 在向 IPv6 应用程序迁移的过程中 我们选用功能强大的 并且是协议无关的名字 地 址转换函数 getaddrinfo 和 getnameinfo 来替代以上这些函数 为应用程序提供协议的独立 性 但是 由于协议无关的名字 地址转换函数的出入变量和输出结果的多样性 以 getaddrinfo 函数来说 输入变量有 6 个 可枚举 2 的 6 次方即 64 种可能的输入 输出的结 果将返回所有对应同一个主机名的 IP 地址 包括不同类型的 IP 地址 同一 IP 协议类型但 多个接口地址 对于 TCP 客户程序来说 将变量所有返回的 IP 地址 逐一调用 socket 和 connect 函数来连接到服务器的套接口地址 知道连接成功或所有地址被试过为止 在 UDP 客户程序中 由 getaddrinfo 填写的套接口地址结构被用来调用 sendto 或 connect 如果第一 个地址不行 在已连接的 UDP 套接口上出错或在未连接的套接口上超时 就回尝试剩下的 地址 4 而调用依赖协议的名字 地址转换函数 客户程序知道它只处理一种类型的套接口 并 且知道返回的套接口的协议族类型 因此只尝试对返回地址调用一次 socket 和 connect 函数 根据是否可翻译的原则将函数映射表分为两个表 如下表 3 4 所示 表 3 地址 表达式转换函数映射表 功能说明功能说明 IPv4 专用专用 对应的对应的 IPv4 v6 通用函数通用函数 映射说明映射说明 字符串地址转为IP 地址 inet aton inet ntop 不同函数名 不同语法规则 可翻译 IP地址转为字符串 地址 inet ntoa inet ntop 不同函数名 不同语法规则 可翻译 表 4 名字 地址转换函数映射表 功能说明功能说明 特定于特定于 IPv4 v6 协议的函数协议的函数 协议无关的函数协议无关的函数 映射说明映射说明 根据名字 获得 IP 地址 gethostbyname getaddrinfo 不可翻译 提示信息 根据 IP 地址 获得名字 gethostbyaddr getnameinfo 不可翻译 提示信息 根据名字 获得 IP 地址 gethostbyname2 getaddrinfo 不可翻译 提示信息 根据服务名 获得全部服务信息 getservbyname getaddrinfo 不可翻译 提示信息 根据服务端口 获得全部服务信息 getservbyport getaddrinfo 不可翻译 提示信息 我们首先比较一下函数原型 init inet aton const char strptr struct in addr addrptr init inet pton init family const char strptr void addrptr 可见 翻译前后 函数名称 函数的形参类型和参数个数都不相同 返回值相同 返回 表示地址转换有效 返回 0 表示地址转换错误 这种翻译应该属于不同函数名 不同语法规 则的函数翻译 两者的语法规则不同 仔细分析两者的区别关键在于 函数名的变化 后者的第一个行参 family 是新加的 表示协议族 对于 IPv6 是 AF INET6 后者的第二个形参 strptr 与前者的第一个形参 strptr 作用相同 并且类型相同 都 是指向字符串的指针 实现时就是相应的链表节点的移位 后者的第三个形参 addrptr 与前者的第二个形参 addrptr 作用相同 并且在类型上 兼容前者 因此实现时就是相应的链表节点的移位 要实现两者的转换必须分析其语法树 实际用语法树来实现该函数的翻译也非常简单 对于语法树来说 两者之间的转换实质上就是在保持原有链表位置和内容不变的情况下 指 针内容的修改和指针的插入 由于遍历语法树是用固定的遍历方式 而且参数指针很可能带 有纵向指针 因此不能随便改变其指针位置和内容 只能在保持原有结构不变的情况下 在 前面插入或在后面接上指针或者内容 遵守以上翻译原则 使用语法树进行翻译时 转换实质上也是在保持原有链表位置和内 容不变的情况下 相应指针节点的内容修改和新指针的插入 5 另外 对于名字 地址转换函数的翻译 它特定于 IPv4 v6 协议的函数 根据分析 在 映射前后没有对应关系 自动翻译难度相当大 因此翻译时只能够根据映射条目 结合设计 的语法树结构的行标志 iLineflag 获得行号 给出翻译提示信息 帮助开发人员定位和手工 翻译 2 3 文法分析所使用的数据结构文法分析所使用的数据结构 2 3 1 单词链表单词链表 从源文件读取到的是字符流 在词法分析模块中对输入文件的字符进行逐个扫描 同时 识别源程序中的单词以及单词类型 将字符流转换为单词流 单词流使用单词链表 READWORD 进行存储 单词链表的结构如下所示 struct READWORD char wordvalue MAXDATASIZE WORKTYPE wordtype struct READWORD next long lineNUM 其中 wordvalue MAXDATASIZE 字符串变量 当 wordvalue MAXDATASIZE 的值为换 行符 n 表示一行的结束 当 var MAXDATASIZE 的值为文件结束符 EOF 表 示文件的结束 wordtype 表示单词所属类型 根据 C 语言的词法分类 将其细分为 8 种 WORKTYPE 关键字 数据类型 常量 变量 函数 运算符 界限符 注解 next READWORD 类型的指针 它指向下一个单词的地址 lineNUM 表示单词所在行 用于提示时行号的获得 2 3 2 变量表变量表 程序使用两组结构相同 但作用不同的变量表 两组变量表都是在对单词链表进行词法 分析后 根据变量的类型而构建的 但它们的作用分别用于翻译模块和语法分析模块 分别 称之为变量表 1 和变量表 2 通过向不同的调用函数传递不同的变量表 实现不同的功能 变量表结构定义如下 struct VARTABLE char var MAXDATASIZE struct VARTABLE nextvar var 数组内存放的是程序中所有已定义的全局变量名 nextvar 是指向下一变量结构的指针 变量表 1 是在分析词法时产生 将所遇到的变量写入变量表 1 中 调用翻译模块时 变 量表 1 通过函数的参数所传递 变量表 1 的作用是用于翻译模块 由于在翻译模块中 网络 地址到表达式的翻译函数 trans ntoa 将新定义某个未使用过的字符数组变量 如果该字 符变量的名称在程序中已有定义 那么在编译器执行到到该处时 将引发编译错误 为避免 变量定义的冲突 程序中建立了一个变量表 使用变量表结构来记录所有已定义的全局变量 变量表 2 是在词法分析时产生 从输入的单词流中识别出 IPv4 套接口地址结构类型 sockaddr in 的变量 将其记入到变量表 2 中 调用语法分析模块时 将变量表 2 通过函 数的参数传递给语法分析函数 变量表 2 用于语法分析的构建语法树阶段 判断某个语法单 元是否匹配通配地址的翻译条件 当遇到变量判断是否为 sockaddr in 结构类型 如果是 6 则向后预读几个字符才能确定该语法单位是否需要翻译 2 3 3 语法树语法树 在建立单词链表之后 通过建立语法树 可以进行语法分析 语法树的数据结构如下所 示 struct GRAMMARTREE 语法树数据结构 char data MAXDATASIZE int dataflag struct GRAMMARTREE nextX struct GRAMMARTREE nextY int iLineflag int iEXT flag3 其中 data MAXDATASIZE 是字符串变量 其中存放的值与标志符 dataflag 的取值有关 当 dataflag 的值为 0 表示 data MAXDATASIZE 中存放的是单词 当 dataflag 的值不 为 0 可以是 1 2 3 表示 data MAXDATASIZE 中存放的是本语句需要调用的 函数名 nextX 指针用来连接同一语法单位的不同单词 它指向同一个语法单位的下一个单 词 nextY 指针用来连接不同语法单位 它指向下一个语法单位的首部 iLineflag 记录语法单位所在的行号 用作提示信息提示 iEXTflag 用作扩展程序功能 3 实例分析 实例分析 下面借分析一段简单的 IPv4 源程序 来说明如何使用单词链表和语法树结构实现向 IPv6 程序的翻译 struct sockaddr in servaddr servaddr sin addr s addr htonl INADDR ANY 这是一段典型的需要地址翻译的 IPv4 源程序 为方便画图 转义字符省略不画 结点 的 flag2 和 flag3 域也省去不画 nextX nextY 用箭头表示 首先经过词法分析 生成如图 2 所示的中间单词链表 图 2 生成的单词链表 7 上面的代码经过语法分析后 判断 dataflag 标记 构建如图 3 所示的语法树 图 3 构建语法树示例 调用各个翻译函数后生成的语法树如图 4 所示 图 4 翻译后的语法树示例 当整个IPv4 源文件的语法树都翻译成功后 采用前序遍历语法树格式化输出 IPv6 文件 4 结论及未来工作 结论及未来工作 本文通过结合 IPv6 应用程序的过渡策略 实现了一个具有一定的协议无关性的 IPv6 应 用程序的半自动翻译机 考虑目前网络程序的应用 尤其是在服务器端的应用程序 主要是 基于 Linux 系统 因此系统采用采用标准 C 语言实现 可以在各种支持标准 C 的操作系统 下编译运行 满足了各个平台的可移植性和更好的兼容性 但是 在这个系统的基础上 还 有一些工作需要开展 以扩展翻译器的功能 进一步需要开展的工作包括 1 进一步研究 IPv6 应用程序的过渡策略 IPv4 套接口选项的翻译 区分和处理特殊的 IPv6 地址 NAT PT DNS ALG 的地址前缀 IPv4 映射的 IPv6 地址等 2 进一步探讨协议无关函数的翻译原则 将通用套接口翻译为 sock storage 套接口 将名字 地址转换函数翻译为协议无关的名字 地址转换函数 3 应用程序过渡时存在的安全问题 在过渡机制中 定义了一些使用 IPv4 地址构建 IPv6 地址的方式 其中有许多 IPv4 地 址的使用存在安全问题 需要认真处理 参见参考文献 6 特别要注意 IPv4 映射的 IPv6 地 址的处理 在 API 中使用该地址既是一种便利 又是一种负担 必须在细节上多做考虑 参见参考文献 7 4 将 IPv4 组播应用程序迁移到 IPv6 组播应用程序 迁移 IPv4 组播应用程序需要特别的考虑 使用组播应用 必须实施一些改动来支持 8 IPv6 首先在 IPv4 组播应用程序中修改 IPv4 组播地址为 IPv6 组播地址 然后 套接口配置 选项也应相应地发生变化 参考文献参考文献 1 Internet Draft Application Aspects of IPv6 Transition M K Shin Y G Hong J Hagino P Savola E M Castro February 2004 draft ietf v6ops application transition 01 txt 2 Robert E Gilligan and Susan Thomson Jim Bound W Richard Stevens Basic Socket Interface Extensions for IPv6 RFC 2553 March 1999 3 W Stevens M Thomas E Nordmark T Jinmei Advanced Sockets Application Program Interface API for IPv6 IETF RFC 3542 May 2003 4 Gilligan S Thomson J Bound W Stevens Basic Socket Interface Extensions for IPv6 RFC3493 February 2003 5 Hinden R and S Deering IP Version 6 Addressing Architecture RFC 3513 April 2003 6 R Austein IPv6 transition security problem statement from a workshop that never happened v6ops ops ietf org 13 Aug 2003 7 Jun ichiro itojun Hagino IPv4 mapped address considered harmful Apr 2002 Work in Progress 8 W Richard Stevens UNIX network programming volume 1 9 J Postel Internet Protocol RFC791 Sep 01 1981 10 S Thomson C Huitema DNS Extension
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加强课件进行教学设计
- 2025年物业行业入门指南初级面试模拟题及答案详解
- 全国防灾减灾日教育班会
- 3D打印技术在纺织行业应用研究
- 入冬时如何保护呼吸道健康
- 幼儿园国庆节策划方案5
- 甲状腺手术课件
- 制作电梯的教学课件
- 甲午海战失败原因
- 不规则图形面积教学课件
- 现代畜牧专业教学标准(高等职业教育本科)2025修订
- 私企公司车辆管理制度
- 船务公司船舶管理制度
- 南京城墙介绍
- 2025年卫生系统招聘考试(公共基础知识)新版真题卷(附详细解析)
- 提高护理文书书写合格率
- YY 0271.2-2024牙科学水基水门汀第2部分:树脂改性水门汀
- T/CECS 10248-2022绿色建材评价集成式卫浴
- 语音厅签署协议合同
- 2025年母婴安全管理培训试题
- 低空经济无人机综合性服务商业计划书
评论
0/150
提交评论