2008-10-16 38 views
4

关于IPv6以及即将从IPv4切换到IPv6的问题已经有很多报道。我对IPv6有一些了解,但我经常想知道IPv6对应用程序开发&设计(特别是)有多大影响?IPv6对应用程序开发和设计有什么好处/影响?

IPv6提供了我们现在还没有的一些有形/众所周知的好处吗?

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

是否有任何支持IPv6的应用程序的示例?

回答

2

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

我的理解是没有其他更改。大多数程序都使用操作系统提供的网络功能,因此当数据回到应用程序时,所有的寻址和传输复杂性都将被删除。当然,有些应用程序会受到更多的影响,但这些应用程序将直接与网络一起工作......而不是您典型的业务线应用程序。

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

有一件事情可能会吸引到你将要连接的玩家的IP地址(帝国时代,星际争霸等)的旧游戏。看起来,除了某种IPv4-IPv6隧道之外,游戏的这种功能将被打破。

+3

你的理解是不正确的。应用程序仍然必须能够创建套接字,地址结构等,所有这些都具有IPv6特定的变体。 – Alnitak 2008-12-18 15:40:36

+0

不,我认为阿龙Axvig的总结是很公平的。大多数应用程序不应该直接操纵IP地址。套接字接口是一个非常低级的接口:它就像汇编语言。功能强大但非常不便。 – bortzmeyer 2009-01-01 17:54:00

3

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

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

流媒体和广播也是通过IPv6使事情变得更容易的事情。

+0

我喜欢保持相同的IP地址,而区域间移动的概念(如在飞机上),但正如你所建议的那样,它的水平很低,可能不会对应用程序开发人员有太大的用处/注意。 – RobS 2008-10-16 12:40:39

1

所有现代网络浏览器(Chrome,IE,Safari和Firefox都会想到)都可以识别IPv6。另外还可以识别IPv6是μTorrent。

6

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

大多数旧代码使用特定的“地址族”常量(AF_INET)和特定的数据结构(struct sockaddr_in)。任何仍在使用该代码的代码都会被困在IPv4域中。

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

这是一个有点冗长,但这里是从Linux手册页中的代码样本getaddrinfo。注意呼叫如何得到潜在的远程地址的整个列表,并尝试每个反过来,直到成功为止:

  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 */ 
相关问题