美文网首页
移植IPv4程序到IPv6修改点

移植IPv4程序到IPv6修改点

作者: jernen | 来源:发表于2019-08-19 19:45 被阅读0次

    1、什么是IPv6

    IPv6即Internet Protocol Version 6,是互联网协议的第六版,是下一代互联网开始的标志。IPv6采用128位地址长度,其地址数量总数可达2的128次方个。可以这样说使用IPv6后,地球上的每一粒沙子都可以拥有一个IP地址。IPv6地址和IPv4地址格式上有所不同,IPv6有8个字段,每个字段用":"分隔,完整的IPv6地址如:2400:A480:aaaa:400:a1:b2:c3:d4。

    2、 IPv6相对于IPv4有哪些较为显著的优势

    相对于IPv4,IPv6有如下一些显著的优势:
    (1)地址容量大大扩展,由原来的32位扩充到128位,彻底解决IPv4地址不足的问题;支持分层地址结构,从而更易于寻址;扩展支持组播和任意播地址,这使得数据包可以发送给任何一个或一组节点;

    (2)大容量的地址空间能够真正的实现无状态地址自动配置,使IPv6终端能够快速连接到网络上,无需人工配置,实现了真正的即插即用;

    (3)报头格式大大简化,从而有效减少路由器或交换机对报头的处理开销,这对设计硬件报头处理的路由器或交换机十分有利;

    (4)加强了对扩展报头和选项部分的支持,这除了让转发更为有效外,还对将来网络加载新的应用提供了充分的支持;

    (5)流标签的使用让我们可以为数据包所属类型提供个性化的网络服务,并有效保障相关业务的服务质量;

    (6)认证与私密性:IPv6把IPSec作为必备协议,保证了网络层端到端通信的完整性和机密性;

    (7)IPv6在移动网络和实时通信方面有很多改进。特别地,不像IPv4,IPv6具备强大的自动配置能力从而简化了移动主机和局域网的系统管理。

    3、网关设备支持IPv6的必要性

    据工信部网站消息,工信部2019年4月16日印发《关于开展2019年IPv6网络就绪专项行动的通知》(以下简称《通知》)。《通知》内提到,新部署的家庭网关设备应全部支持IPv6,并默认配置支持IPv4/IPv6双栈,能够为网关下挂设备分配IPv6地址;到2019年末,完成70%存量智能家庭网关的IPv6升级。其中涉及到的企业包括TP-LINK、D-LINK、华为、腾达、华硕、网件、小米等,新生产的家庭路由器应支持IPv6,并向存量家庭路由器设备推送支持IPv6的固件版本。

    4、移植IPv4程序到IPv6的修改点

    1. 修改那些允许IPV4和IPV6兼容性的结构体和定义。首先,请试着用 getaddrinfo() 来取得 struct sockaddr 的资料,取代手动填写这个数据结构。这样你就可以不用管 IP 的版本,而且能省略之后很多步骤。

    2. 找出全部与 IP 版本相关的任何代码,试着用一个有用的函数将它们包起来(wrap up)。

    3. 将 AF_INET 更改为 AF_INET6。

    4. 将 PF_INET 更改为 PF_INET6。

    5. 将 INADDR_ANY 更改为 in6addr_any,这里有点不太一样:

    struct sockaddr_in sa;
    struct sockaddr_in6 sa6;
    sa.sin_addr.s_addr = INADDR_ANY;   // 使用我的 IPv4 地址
    sa6.sin6_addr = in6addr_any;  // 使用我的 IPv6 地址
    

    还有,在宣告 struct in6_addr 时,IN6ADDR_ANY_INIT 的值可以做为初始值,像这样:

    struct in6_addr ia6 = IN6ADDR_ANY_INIT;
    
    1. 使用 struct sockaddr_in6 取代 struct sockaddr_in,确定要将"6"新增到适当的栏位[参考上面的 struct],但没有 sin6_zero 栏位。

    2. 使用 struct in6_addr 取代 struct in_addr,要确定有将"6"新增到适当的栏位[参考上面的struct]。

    3. 将“点分十进制” -> “网络二进制整数”, 使用 inet_pton() 替换 inet_aton() 或 inet_addr()。

    4. 将“网络二进制整数” -> “点分十进制” 使用 inet_ntop() 替换 inet_ntoa()。

    5. 使用功能更强大的 getaddrinfo() 取代 gethostbyname()。

    6. 使用功能更强大的 getnameinfo() 取代 gethostbyaddr()[虽然 gethostbyaddr()在 IPv6 中也能正常运作]。

    7. 不要用 INADDR_BROADCAST 了,请多使用 IPv6 multicast 来替换。

    相关文章

      网友评论

          本文标题:移植IPv4程序到IPv6修改点

          本文链接:https://www.haomeiwen.com/subject/qumesctx.html