首先,眾所周知的原因,蘋果從很早開始都要求開發者必須支援ipv6,剛開始由於更重原因,改造還是很慢,無論是作為開發者的我們還是運營商,但是隨著時間的推進,企業和移動通訊**商在逐步部署ipv6 dns64/nat64網路。ipv6dns64/nat64是乙個僅有ipv6的網路,且能通過轉換繼續支援ipv4。同時4g的普及,由於ipv4位址的限制,為了保證4g開發的擴充套件性,需要ipv6的支援。當然目前國內的三大運營商,他們的ipv6的發展規模現在各不相同。
通過這裡就了解到了一些前提。這邊再說下dns64/nat64轉換流程
運營商為了相容問題,大多數的網路**商實現了乙個叫dns64/nat64的轉換流程。這是個純ipv6網路,並通過轉換也可繼續訪問ipv4的內容。這樣能保證所有的網路都能訪問。上圖: 就是目前運營商的乙個標準解析流程
如果客戶端向dns64伺服器發起乙個dns查詢,當dns找到乙個基於ipv6的位址後,立刻返回客戶端。如果無法找到對應的ipv6位址,dns64伺服器將請求ipv4位址,然後dns64伺服器將ipv4作為字首合成乙個ipv6位址,並且將其返回給客戶端。這樣,客戶端將總是獲得乙個ipv6目標位址.詳細流程見下圖
而對於客戶端如果本地網路同時提供ipv4和ipv6的環境時(稱為雙棧),訪問ipv4伺服器就直接建立ipv4 socket進行鏈結。
如果本地網路只提供了ipv6環境(稱為ipv6-only),訪問ipv4伺服器時就先轉成ipv6位址,閘道器收到後再由nat64服務解析成ipv4,走後面的ipv4網路。bug:有客戶反應,在4g狀態下,上傳會超時失敗,但是在wifi下沒有這個問題。
非常奇怪的bug,因為經過我不停的復現就是復現不了,但是客戶的客戶端確實必現的,在嘗試努力了幾次後,險些放棄查詢原因,認為是正常的網路不穩定的錯誤,但是在後期,陸續又有客戶反饋有類似問題,而且都是在4g的網路下。通過本地日誌檢視,除錯,大致猜測問題可能和ipv6網路有關。
真的是運氣,在某個陰鬱天氣的日子,我又通過自己的手機嘗試了下問題,問題復現,而且是必現,公司其他同事的手機都沒問題,只有我的手機問題復現,哈哈哈哈,立刻開啟電腦,開啟xcode進行除錯操作,發現問題所在是在底層的socket連線庫的問題。靈機一動,把sim卡放入其他人的手機嘗試,問題復現。。。看來問題和運營商也有關係。
問題定位到socket ipv6連線error錯誤。嘗試驗證自己的想法。 驗證手機的網路位址
手機訪問檢測**問題復現的sim卡:
正常沒有該問題的sim卡:
確實問題和ipv6網路有關。證實。
通過除錯發現,在判斷網路時,該sim卡網路被判斷為ipv6-only,但是實際上是ipv^/ipv4雙棧的網路。發現原來是判斷網路的方法實現有問題
int32 getdefaultgateway(in_addr* addr) 判斷是否支援ipv4
複製**
int getdefaultgateway(in_addr_t * addr)
; size_t l;
char * buf, * p;
struct rt_msghdr * rt;
struct sockaddr * sa;
struct sockaddr * sa_tab[rtax_max];
int i;
int r = -1;
if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0)
if(l>0)
for(p=buf; prtm_msglen) else
}if( ((rt->rtm_addrs & (rta_dst|rta_gateway)) == (rta_dst|rta_gateway))
&& sa_tab[rtax_dst]->sa_family == af_inet
&& sa_tab[rtax_gateway]->sa_family == af_inet) }}
}free(buf);
}return r;
}複製**
為什麼明明支援ipv6但是判斷為ipv4呢。深入方法除錯檢視
關鍵就是en0的判斷,en0表示的是wifi,也就是說只有在wifi狀態下才能進入if邏輯中,4g狀態下是進入不了判斷語句的。
嘗試把此判斷去除,問題解決。。。 問題排除此處可以進行兜底邏輯,如果是ipv^-only的位址,進行是否可以合成ipv6的判斷。如果運營商支援ipv6-only就一定有ipv4合成ipv6的能力,用於支援ipv4。如果是雙棧就不用去合成ipv6位址,可以直接走ipv4位址。
IPv6 網路的管理
ipv6 ipv6 簡介 internet protocol version 6 ipv6 是 ietf 和網際網路工程任務組 設計 的用與替代現行版本 ip 協議的下一代 ip 協 議。ipv6 採用 128 位 2 進製數碼表示 ipv6 表示方式 為方便操作,ipv6 被換算成 8x16 進製...
RHCE 二 管理IPv6網路
一 回顧ipv4網路配置 1 測試和驗證網路配置 ip addr show eth0 ip link ip s link show eth0 s 輸出介面的狀態 ip route 或 route n ping c3 172.25.254.254檢視網路連線 ss ta t tcp協議的連線 a 所有...
iOS 不用網線搭建IPv6網路測試環境
前言 從6月1日開始蘋果要求之後審核的專案必須支援ipv6,如果不支援將被拒絕,掘金最近一次審核被就被拒絕了.理由為下 正題 材料 首先需要準備mac一台 iphone 2部 其中一部用於測試你的專案,請裝上你的應用 連線線一根 第一步 通過資料線連線iphone和mac 第二步 開啟iphone的...