【问题标题】:What benefits/impact will IPv6 have on application development & design? [closed]IPv6 对应用程序开发和设计有什么好处/影响? [关闭]
【发布时间】:2008-12-18 23:38:59
【问题描述】:

关于 IPv6 以及即将从 IPv4 切换到 IPv6 的报道很多。我对 IPv6 有一些了解,但我经常想知道 IPv6 对应用程序开发和设计(具体而言)有多大影响?

IPv6 是否提供了一些我们今天还没有的切实/众所周知的好处?

我知道 Windows Vista 和 Server 2008 支持开箱即用的 IPv6,现在是否有人在使用(或在设计时考虑到 IPv6),如果是,有什么好处?我们是否应该在当前和未来的项目中考虑 IPv6?

是否有任何好的 IPv6 感知应用程序示例?

【问题讨论】:

    标签: network-protocols ipv6


    【解决方案1】:

    恐怕亚伦的回答非常不正确。是的,UI 更改将是必要的,但任何使用传统套接字 API 的代码也可能需要进行大量更改以支持 IPv6。

    大多数旧代码使用特定的“地址族”常量 (AF_INET) 和特定的数据结构 (struct sockaddr_in)。任何仍在使用的代码实际上都停留在 IPv4 领域。

    较新的代码应该使用现代 API 调用,例如 getaddrinfo(),它能够为协议、地址族(即AF_INET6)、地址等返回正确的值,无论远程主机使用 IPv4 还是 IPv6 (或两者兼有)。

    有点长,但这里有一个来自getaddrinfo 的 Linux 手册页的代码示例。请注意调用如何获取潜在远程地址的完整列表,并依次尝试每个地址,直到成功:

             memset(&hints, 0, sizeof(struct addrinfo));
             hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
             hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
             hints.ai_flags = 0;
             hints.ai_protocol = 0;          /* Any protocol */
    
             s = getaddrinfo(hostname, service, &hints, &result);
             if (s != 0) {
                 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
                 exit(EXIT_FAILURE);
             }
    
             /* getaddrinfo() returns a list of address structures.
                Try each address until we successfully connect(2).
                If socket(2) (or connect(2)) fails, we (close the socket
                and) try the next address. */
    
             for (rp = result; rp != NULL; rp = rp->ai_next) {
                 sfd = socket(rp->ai_family, rp->ai_socktype,
                              rp->ai_protocol);
                 if (sfd == -1)
                     continue;
    
                 if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
                     break;                  /* Success */
    
                 close(sfd);
             }
    
             if (rp == NULL) {               /* No address succeeded */
                 fprintf(stderr, "Could not connect\n");
                 exit(EXIT_FAILURE);
             }
    
             freeaddrinfo(result);           /* No longer needed */
    

    【讨论】:

    • 我不会说他不正确,而是他描述了应用程序的状态。不幸的是,大多数应用程序使用像套接字 API 这样的低级东西,但他们不应该这样做。而使用 AF_INET 肯定是个大错误:解雇程序员!
    【解决方案2】:

    最初并不多。对于大多数桌面和 Web 应用程序,从 IPv4 到 v6 的切换应该是透明的。

    但最终,使用 IPv6 简化的网络模型的应用程序将变得更加普遍。例如,大多数用户都在 NAT 之后,因此网状网络仅适用于技术受众。任何不得不在路由器上为 P2P 软件打开端口的人都知道,这不是他妈妈可以使用的。

    流式传输和广播也是 IPv6 使事情变得更容易的事情。

    【讨论】:

    • 我确实喜欢在区域之间移动(例如在飞机上)时保持相同 IP 地址的概念,但正如您所建议的那样,它的级别很低,可能不会有太大用处/注意应用程序开发人员。
    【解决方案3】:

    这将影响您输入 IP 地址的任何软件的 UI 设计,因为您需要让它们在 IPv4 和 IPv6 输入之间进行选择。不过很明显。

    我的理解是其他方面不会有太大变化。大多数程序都使用操作系统提供的网络设施,因此当数据返回应用程序时,所有寻址和传输复杂性都已消除。当然,有些应用程序会受到更大的影响,但那些将是直接与网络一起工作的应用程序……而不是典型的业务线应用程序。

    您需要查看您的应用程序在OSI model 中的位置。我认为 IP 地址是第 3 层的一部分,所以如果您在该层之上,您就会从操作系统的更改中抽象出来。

    一件可能很糟糕的事情是在旧游戏中输入要连接的玩家的 IP 地址(帝国时代、星际争霸等)。似乎除非某种 IPv4-IPv6 隧道,该游戏的功能将被破坏。

    【讨论】:

    • 你的理解有误。应用程序仍然必须能够创建套接字、地址结构等,所有这些都具有 IPv6 特定的变体。
    • 不,我认为 Aaron Axvig 的总结相当中肯。大多数应用程序不应该直接操作 IP 地址。套接字接口是一个非常低级的接口:它类似于汇编语言。功能强大但非常不便携。
    【解决方案4】:

    所有现代网络浏览器(Chrome、IE、Safari 和 Firefox)都支持 IPv6。支持 IPv6 的还有 µTorrent。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多