成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一份完整的 IPv6 環境下 DNS 相關測試

新聞 網絡
隨著電子技術及網絡技術的發展,計算機網絡已經與人們的生活密切相關,可能身邊的每一樣電子設備都需要連入網絡,IPv4 的地址數量已經無法滿足。IPv6 的應用將徹底解決這些問題。

 [[271457]]


董濤,網易游戲高級運維工程師,主要工作方向為網易集團 DNS 的運維與開發。
張欣接,網易集團 DNS 團隊負責人,負責網易域名系統的架構設計及生態建設。

一、IPv6 支持度報告

IPv6 簡介

IPv6(Internet Protocol version 6,互聯網通信協議第 6 版)是用于數據包交換互聯網絡的網絡層協議,是 IETF(互聯網工程任務小組 Internet Engineering Task Force,簡稱 IETF)設計的用來替代 IPv4 協議的互聯網協議版本。

隨著電子技術及網絡技術的發展,計算機網絡已經與人們的生活密切相關,可能身邊的每一樣電子設備都需要連入網絡,IPv4 的地址數量已經無法滿足。IPv6 的應用將徹底解決這些問題。IPv6 由 128 比特位構成,單從數量級上來說,IPv6 所擁有的地址容量是 IPv4 的約 8×10 28 倍,達到 2 128(約 3.4 × 10 38)個。這不但解決了網絡地址資源數量的問題,同時也為物聯網的發展提供了基礎。

IPv6 地址的表達形式采用 32 個十六進制數,由兩個邏輯部分組成:一個 64 位的網絡前綴和一個 64 位的主機地址,主機地址通常根據物理地址自動生成,叫做 EUI-64(或者 64- 位擴展唯一標識)。例如 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 是一個合法的 IPv6 地址。

IPv6 全球部署更新

  • 2008 年,歐盟發布了“歐洲部署 IPv6 行動計劃”

  • 2009 年,日本發布《IPv6 行動計劃》

  • 2010 年,美國政府發布 IPv6 行動計劃

  • 2010 年,韓國發布“下一代互聯網協議(IPv6) 促進計劃”

  • 2012 年,加拿大政府發布了《加拿大政府 IPv6 戰略》

  • 2017 年,國務院辦公廳印發《推進互聯網協議第六版(IPv6)規模部署行動計劃》

操作系統 IPv6 支持度

一份完整的 IPv6 環境下 DNS 相關測試

應用軟件 IPv6 支持度

客戶端軟件

1、瀏覽器

一份完整的 IPv6 環境下 DNS 相關測試

服務器軟件

1、程序開發軟件

一份完整的 IPv6 環境下 DNS 相關測試

2、數據庫

一份完整的 IPv6 環境下 DNS 相關測試

總結

毋庸置疑,下一代互聯網 IPv6 是萬物互連,智能化時代基礎網絡的重要支撐協議,但是從一個只擁有 IPv4 協議的巨型網絡要全面、平穩地過渡到一個純 IPv6 網絡需要一段極為漫長的時間。從報告統計的數據來看,各種基礎軟件和應用軟件都已基本支持 IPv6。現在在國內的環境下,IPv6 的基礎環境還需要完善,為此工信部也發布了

《推進互聯網協議第六版(IPv6)規模部署行動計劃》(http://www.miit.gov.cn/n1146290/n4388791/c6166476/content.html)

推動各單位加快支持 IPv6。

IPv6 支持度報告的數據來源是:下一代國家互聯網中心在 2017 年 11 月發布的 IPv6 支持度報告

(https://www.ipv6ready.org.cn/public/download/ipv6.pdf), 感興趣的同學可以查看原文。

二、IPv6 環境下 DNS 相關測試

背景介紹

名詞簡介

  • A 記錄

A 記錄是一個域名指向 IPv4 地址的解析結果,即最常見的記錄類型, 例如 ipv6test.ntes53.netease.com. 1800 IN A 123.58.166.70
  • AAAA 記錄

AAAA 是一個域名指向 IPv6 地址的解析結果。如果想要一個域名解析到 IPv6 地址,則需要設置此種類型的解析結果。同一個域名可以同時有 A 與 AAAA 兩種記錄類型, 例如 ipv6test.ntes53.netease.com. 1800 IN AAAA 2403:c80:100:3000::7b3a:a646
  • 緩存 DNS 服務器

用戶直接使用的 DNS 服務器,各種平臺、操作系統上直接設置的 DNS 服務器,常見的有 8.8.8.8, 114.114.114.114
  • 權威 DNS 服務器

用于域名的管理。權威 DNS 服務器只對自己所擁有的域名進行域名解析,對于不是自己的域名則拒絕應答。例如網易的權威 DNS 服務器只會響應網易域名的請求,對于其他域名,則拒絕應答。
  • 雙棧網絡環境

雙棧網絡環境即客戶端或服務器同時擁有 IPv4、IPv6 兩種網絡環境,可以簡單的理解為機器上既有 IPv4 地址又有 IPv6 地址

測試場景

下文中所有測試使用的程序均為測試方法中的程序

1.目前純 IPv4 環境下,僅新增 AAAA(IPv6) 記錄之后,對已有程序的影響

假定已經存在了一個程序(C 程序、python 程序、瀏覽器等),通過域名訪問某個服務,現在在 IPv4 環境下一切工作正常。當給這個域名增加了 AAAA 記錄之后,測試對目前的程序的影響。

域名解析
一份完整的 IPv6 環境下 DNS 相關測試

HTTP 請求
一份完整的 IPv6 環境下 DNS 相關測試

客戶端
一份完整的 IPv6 環境下 DNS 相關測試

結論

  • 當在某域名原有的 A 記錄類型的基礎上新增 AAAA 記錄后,原有的程序工作正常

2.客戶端 IPv6/v4 雙棧環境下,測試程序的行為

假定用戶的環境是雙棧環境,假定一個服務通過域名對外提供服務,測試這種情況下程序的行為。

域名解析

一份完整的 IPv6 環境下 DNS 相關測試

HTTP 請求
一份完整的 IPv6 環境下 DNS 相關測試

客戶端
一份完整的 IPv6 環境下 DNS 相關測試

結論

  • 當域名同時存在 A 與 AAAA 記錄,并且網絡類型為雙棧網絡時,絕大多數程序工作正常。僅有一種情況例外,即程序中使用了 gethostbyname 函數,同時 resolv.conf 中配置了 options inet6 時,此時程序會返回錯誤的解析結果

  • RFC 以及絕大多數實現方式,均回優先使用 IPv6 地址建立連接

  • 雙棧環境下,客戶端使用 IPv4 與 IPv6 緩存 DNS 服務器獲取的解析結果是一致的

3. 客戶端純 IPv6 環境下,測試能否正常工作

假定用戶只有 IPv6 地址,DNS 也是使用 IPv6 地址 (DNS 必須有雙棧環境,因為現在很多權威服務器沒有 IPv6 地址,純 IPv6 環境下無法正常工作),假定一個服務通過域名(同時擁有 A、AAAA 記錄)對外提供服務,測試服務是否可以正常訪問。

域名解析
一份完整的 IPv6 環境下 DNS 相關測試

HTTP 請求
一份完整的 IPv6 環境下 DNS 相關測試

客戶端
一份完整的 IPv6 環境下 DNS 相關測試

結論
當某域名即存在 A 記錄 又存在 AAAA 記錄時:

  • 如果程序中使用了 gethostbyname 時,程序可能會拿到錯誤的解析結果,取決于 resolv.conf 的配置(當配置了 option inet6 時,會獲取到錯誤的解析結果)

  • Windows 在這種情況下,部分應用工作不正常。在指定使用 IPv6 socket 的情況下,程序工作正常。

  • 根據安卓官方的描述,Android 6.0 之后的版本已經支持 IPv6,但是根據對國內大多數廠商的安卓手機的調研,目前國內安卓手機很少可以原生支持 IPv6

4. DNS 解析測試

這里測試了緩存服務器和權威服務器在各種網絡環境下,優先使用的解析鏈路。

一份完整的 IPv6 環境下 DNS 相關測試

結論
當權威服務器和緩存服務器均支持 ipv6 時,緩存服務器優先使用 ipv6 鏈路進行解析,其他情況均使用 ipv4 鏈路進行解析。

結論

  • 經過測試與查證,gethostbyname 不支持 IPv6,使用此函數可能會拿到錯誤的結果或者程序拋出異常。建議使用 getaddrinfo 函數取代此函數

  • 目前已經存在 A 記錄的域名,添加 AAAA 記錄后,不管客戶端與服務端的網絡環境如何:

    • 絕大多數情況下對客戶端與服務端工作正常

    • 下面一種情況下會出現工作異常:
      當使用了 C 的 gethostbyname 并且在 resolv.conf 中配置了 options inet6時,此函數返回錯誤的結果

  • 經過測試,雙棧網絡下 IPv4 與 IPv6 的優先級:

    • 優先使用 IPv6 發起解析請求

    • 優先使用 IPv6 請求建立連接 (TCP, UDP)

    • 優先解析 A 地址記錄

參考資料

  • Windows 8 IPv4 與 IPv6 選擇的方法:Connecting with IPv6 in Windows8
    (https://blogs.msdn.microsoft.com/b8/2012/06/05/connecting-with-ipv6-in-windows-8/)

  • Windows 當 IPv6 不可用后的回退機制:Is there any setting for connection timeout when IPv6 fallback to IPv4?
    (https://social.technet.microsoft.com/Forums/en-US/d09e938a-a594-4766-8898-3926a81fc5dc/is-there-any-setting-for-connection-timeout-when-ipv6-fallback-to-ipv4?forum=w7itpronetworking)

  • 目前廣泛使用的 IPv4 與 IPv6 優先選擇算法為 Happy Eyeballs
    (https://en.wikipedia.org/wiki/Happy_Eyeballs):

    • 目前使用此算法的項目有:Chrome, Opera 12.10, Firefox version 13, OS X, cURL

    • 此算法會優先選擇 IPv6 鏈路使用

    • 此算法的原理可參考 RFC 6555(Happy Eyeballs: Success with Dual-Stack Hosts)
      (https://tools.ietf.org/html/rfc6555)

    • 此算法的簡略工作流程如下:

    1. 當客戶端是雙棧環境時,客戶端會向緩存 DNS 服務器發起域名 A 記錄與 AAAA 記錄的解析請求,并受到解析結果,對應下圖中的 1-4

    2. 客戶端獲取到解析地址后,會同時使用 IPv4 與 IPv6 兩種鏈路嘗試建立連接,對應下圖中的 6-7。當 IPv6 鏈路比 IPv4 鏈路先建立連接,或者 IPv4 已經建立連接,但是在很短的時間間隔內,IPv6 也成功建立連接后,則這兩種情況下客戶端應該使用 IPv6 鏈路完成后續的網絡請求,對應圖中的 8-12

一份完整的 IPv6 環境下 DNS 相關測試

測試方法

解析域名

C/ C ++

  • gethostbyname

Linux

 

 

  1. #include <stdio.h> 
  2.     #include <netdb.h> 
  3.     #include <arpa/inet.h> 
  4.  
  5.     int main(void
  6.         int i = 0
  7.         char str[32] = {0}; 
  8.          struct hostent* phost = NULL; 
  9.  
  10.         phost = gethostbyname("IPv6test.ntes53.netease.com"); 
  11.         printf("%s", inet_ntoa(*((struct in_addr*)phost->h_addr)));  
  12.          
  13.         return 0
  14.     } 

 

Windows

 

 

  1.  #include <winsock.h> 
  2.     #include <Windows.h> 
  3.     #include <stdio.h> 
  4.  
  5.     #pragma comment (lib, "ws2_32.lib"
  6.  
  7.     int main(void) { 
  8.         WSADATA wsaData = {0,}; 
  9.         struct in_addr addr = {0,}; 
  10.         struct hostent *res; 
  11.         int i = 0
  12.  
  13.         WSAStartup(MAKEWORD(22), &wsaData); 
  14.  
  15.         res = gethostbyname("IPv6test.ntes53.netease.com."); 
  16.         while (res->h_addr_list[i] != 0) { 
  17.             addr.s_addr = *(u_long *) res->h_addr_list[i++]; 
  18.             printf("IP Address: %s\n", inet_ntoa(addr)); 
  19.         } 
  20.  
  21.         WSACleanup(); 

 

getaddrinfo

  1. #include <stdio.h> 
  2.     #include <string.h> 
  3.     #include <stdlib.h> 
  4.     #include <netdb.h> 
  5.     #include <sys/types.h> 
  6.     #include <sys/socket.h> 
  7.     #include <arpa/inet.h> 
  8.  
  9.     int lookup_host () 
  10.       struct addrinfo hints, *res; 
  11.       int errcode; 
  12.       char addrstr[100]; 
  13.       void *ptr; 
  14.  
  15.       memset (&hints, 0, sizeof (hints)); 
  16.       hints.ai_family = AF_INET; 
  17.  
  18.       errcode = getaddrinfo ("IPv6test.ntes53.netease.com", NULL, &hints, &res); 
  19.       if (errcode != 0
  20.         { 
  21.           perror ("getaddrinfo"); 
  22.           return -1
  23.         } 
  24.       while (res) 
  25.         { 
  26.           inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100); 
  27.           switch (res->ai_family) 
  28.             { 
  29.             case AF_INET: 
  30.               ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; 
  31.               break
  32.             case AF_INET6: 
  33.               ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; 
  34.               break
  35.             } 
  36.           inet_ntop (res->ai_family, ptr, addrstr, 100); 
  37.           printf ("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4
  38.                   addrstr, res->ai_canonname); 
  39.           res = res->ai_next; 
  40.         } 
  41.       return 0
  42.     } 
  43.     int main (void
  44.         lookup_host(); 
  45.     } 

windows

 

 

  1. #define WIN32_LEAN_AND_MEAN 
  2.     #define _WIN32_WINNT 0x501 
  3.     #include <windows.h> 
  4.     #include <winsock2.h> 
  5.     #include <stdio.h> 
  6.     #include <string.h> 
  7.     #include <stdlib.h> 
  8.     #include <sys/types.h> 
  9.     #include <ws2tcpip.h> 
  10.  
  11.     #pragma comment (lib, "Ws2_32.lib"
  12.  
  13.     // int iResult; 
  14.     WSADATA wsaData; 
  15.     int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
  16.  
  17.     int inet_pton(int af, const char *src, void *dst) 
  18.         struct sockaddr_storage ss; 
  19.         int size = sizeof(ss); 
  20.         char src_copy[INET6_ADDRSTRLEN+1]; 
  21.  
  22.         ZeroMemory(&ss, sizeof(ss)); 
  23.         /* stupid non-const API */ 
  24.         strncpy (src_copy, src, INET6_ADDRSTRLEN+1
  25.         src_copy[INET6_ADDRSTRLEN] = 0
  26.  
  27.         if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { 
  28.             switch(af) { 
  29.                 case AF_INET: 
  30.                     *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; 
  31.                     return 1
  32.                 case AF_INET6: 
  33.                     *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; 
  34.                     return 1
  35.             } 
  36.         } 
  37.         return 0
  38.     } 
  39.     const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) 
  40.         struct sockaddr_storage ss; 
  41.         unsigned long s = size; 
  42.         ZeroMemory(&ss, sizeof(ss)); 
  43.         ss.ss_family = af; 
  44.         switch(af) { 
  45.             case AF_INET: 
  46.                 ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src; 
  47.                 break
  48.             case AF_INET6: 
  49.                 ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src; 
  50.                 break
  51.             default
  52.                 return NULL; 
  53.         } 
  54.         /* cannot direclty use &size because of strict aliasing rules */ 
  55.         return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)? 
  56.                dst : NULL; 
  57.     } 
  58.     int lookup_host () 
  59.         struct addrinfo hints, *res; 
  60.         int errcode; 
  61.         char addrstr[100]; 
  62.         void *ptr; 
  63.         memset (&hints, 0, sizeof (hints)); 
  64.         hints.ai_family = AF_INET6; 
  65.         errcode = getaddrinfo ("IPv6test.ntes53.netease.com", NULL, &hints, &res); 
  66.         if (errcode != 0
  67.         { 
  68.             perror ("getaddrinfo"); 
  69.             printf("%d",errcode); 
  70.             return -1
  71.         } 
  72.         while (res) 
  73.         { 
  74.             // inet_ntop (res->ai_family, res->ai_addr->sa_data, addrstr, 100); 
  75.             sockaddr_in in1; 
  76.             memcpy(&in1.sin_addr, res->ai_addr->sa_data, sizeof(res)); 
  77.             switch (res->ai_family) 
  78.             { 
  79.                 case AF_INET: 
  80.                     ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr; 
  81.                     break
  82.                 case AF_INET6: 
  83.                     ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr; 
  84.                     break
  85.             } 
  86.             inet_ntop(res->ai_family, ptr, addrstr, 100); 
  87.             // sockaddr_in6 in; 
  88.             // memcpy(&in.sin6_addr, ptr, sizeof(ptr)); 
  89.             printf ("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4
  90.                    addrstr, res->ai_canonname); 
  91.             //printf ("IPv%d address: %s (%s)\n", res->ai_family == PF_INET6 ? 6 : 4, 
  92.             //        inet_ntoa(in.sin6_addr), res->ai_canonname); 
  93.             res = res->ai_next; 
  94.         } 
  95.         return 0
  96.     } 
  97.     int main (void
  98.         printf("start\n"); 
  99.         lookup_host(); 
  100.     } 

 

Python

  • socket.gethostbyname

  1. import socket 
  2. result = socket.gethostbyname("IPv6test.ntes53.netease.com"
  3. print result 
  • getaddrinfo
  1. import socket 
  2. result = socket.getaddrinfo("IPv6test.ntes53.netease.com"0, socket.AF_INET6) 
  3. print result 
  4. result = socket.getaddrinfo("IPv6test.ntes53.netease.com"0, socket.AF_INET) 
  5. print result 
  6. result = socket.getaddrinfo("IPv6test.ntes53.netease.com"0, socket.AF_UNSPEC) 
  7. print result 

當不指定 socktype 時,此值默認為 socket.AF_UNSPEC

HTTP 請求

Python

requests 包

 

 

  1. import requests 
  2. response = requests.get("http://IPv6test.ntes53.netease.com:8000", stream=True
  3. print response.raw._fp.fp._sock.getpeername() 

 

C++

  1. #include <stdio.h> 
  2. #include <curl/curl.h> 
  3.  
  4. int main(void
  5.   CURL *curl; 
  6.   CURLcode res; 
  7.  
  8.   curl = curl_easy_init(); 
  9.   if(curl) { 
  10.     curl_easy_setopt(curl, CURLOPT_URL, "http://IPv6test.ntes53.netease.com:8000"); 
  11.     /* example.com is redirected, so we tell libcurl to follow redirection */  
  12.     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); 
  13.       // curl_easy_setopt(curl, CURL_IPRESOLVE_V6, 1L);  // 使用 IPv6 地址 
  14.       // curl_easy_setopt(curl, CURL_IPRESOLVE_V4, 1L);  // 使用 IPv4 地址 
  15.       // curl_easy_setopt(curl, CURL_IPRESOLVE_WHATEVER, 1L);  // 獲取系統允許的 IPv4 或者 IPv6 地址  
  16.     /* Perform the request, res will get the return code */  
  17.     res = curl_easy_perform(curl); 
  18.     /* Check for errors */  
  19.     if(res != CURLE_OK) 
  20.       fprintf(stderr, "curl_easy_perform() failed: %s\n"
  21.               curl_easy_strerror(res)); 
  22.  
  23.     /* always cleanup */  
  24.     curl_easy_cleanup(curl); 
  25.   } 
  26.   return 0; 
 
責任編輯:張燕妮 來源: 網易游戲運維平臺
相關推薦

2019-10-25 16:56:18

網絡安全網絡安全技術周刊

2010-05-31 18:30:12

IPv6 DNS

2019-04-13 14:21:13

2011-06-07 16:47:22

IPv6IPv6日世界IPv6日

2010-06-07 11:52:47

LinuxIPv6協議

2010-05-26 17:46:51

IPv6測試

2018-08-10 07:58:43

IPv6NATIPv4

2019-12-03 10:28:53

編程語言PythonJava

2023-09-01 14:02:25

用戶分析攻略

2024-11-07 08:50:56

用戶分析分類維度標簽

2010-08-11 16:07:14

IPv6協議H3C

2010-05-26 14:12:06

IPv6協議

2010-06-08 17:30:56

IPv6協議棧

2010-05-31 09:58:57

關閉IPv6

2010-05-27 15:44:00

卸載IPv6協議

2010-05-31 10:16:31

禁用IPv6協議

2012-11-20 09:14:52

IPv6CNGI網絡Web

2010-06-07 12:29:06

如何安裝IPv6

2010-06-02 15:17:48

DNS服務器IPv6協議

2013-06-09 09:17:05

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产中文一区二区三区 | 国产免费一二三区 | 粉嫩av久久一区二区三区 | 欧美成人一区二区 | 国产免费一级片 | 免费成人高清在线视频 | 一区二区三区欧美大片 | 亚洲视频在线观看 | 久久午夜电影 | 一区视频在线 | 国产精品视频久久 | www国产精品| 国产精品波多野结衣 | 亚洲福利在线观看 | 久久久蜜桃一区二区人 | 色av一区 | 色狠狠桃花综合 | 97狠狠干| 亚洲精品国产偷自在线观看 | 亚洲视频三区 | 久久久久久亚洲 | 日韩成人免费 | 看av片网站 | 欧美 日韩 国产 成人 在线 | 日韩高清成人 | 8x国产精品视频一区二区 | 久久久亚洲综合 | 欧美在线一区二区三区 | 国产精品色哟哟网站 | 97日日碰人人模人人澡分享吧 | 日韩三级免费网站 | 国产美女特级嫩嫩嫩bbb片 | 成人不卡 | 欧美二区在线 | aaa天堂 | 久久久一二三区 | 国产精品综合色区在线观看 | 91精品国产综合久久婷婷香蕉 | 国产成人自拍一区 | 亚洲三区在线观看 | 国产精品美女一区二区三区 |