1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        IPV6、IPV4雙棧問題

        共 2062字,需瀏覽 5分鐘

         ·

        2021-05-06 11:21

        ??

        PS: 人生和代碼一樣,不反思、不迭代就無法獲得成長。
        最近接觸到單雙棧問題,簡單梳理下,雙棧與單棧,也就是 IPV4 相比,雙棧客戶端的應(yīng)用程序會遇到明顯的連接延時,使得雙棧客戶端的用戶體驗變差,下面了解一下雙棧問題以及其解決方法,主要內(nèi)容如下:
        1. 雙棧選擇問題

        2. IPV6無法訪問時的延時

        3. Happy Eyeballs

        4. 實際運(yùn)用

        雙棧選擇問題

        雙棧選擇問題及 IPV6/IPV4 選擇問題,首見于 RFC1671 文檔,IPV6(Internet Protocol version 6) 就是互聯(lián)網(wǎng)協(xié)議第六版,IPV4(Internet Protocol version 4) 就是互聯(lián)網(wǎng)協(xié)議第四版,IPV6 主要解決的問題是 IPV4 的地址資源日益枯竭,IPv6 增強(qiáng)的關(guān)鍵是將 IP 地址空間從 32 位擴(kuò)展到 128 位,從根本上實現(xiàn)不受限制的唯一 IP 地址,雙棧選擇問題是在互聯(lián)網(wǎng)迅速發(fā)展的大背景下出現(xiàn),當(dāng)處于雙棧狀態(tài)下,DNS 解析出來的地址有兩類地址,,單棧狀態(tài)下,DNS 解析出來是 IPV4 或 IPV6 地址,當(dāng)然目前說到單棧一般都是默認(rèn)單棧 IPV4。

        IPV6無法訪問時的延時

        當(dāng) IPV6 不能訪問時,支持 IPV6 的程序需要延遲幾秒鐘才能正常切換到 IPV4,這會影響用戶體驗,為了不影響用戶體驗有些系統(tǒng)會直接禁用 IPV6。
        IPV6 不能訪問的原因如下:
        Reasons for such failure include no connection to the IPv6 Internet,  broken 6to4 or Teredo tunnels, and broken IPv6 peering.
        下面看下 IPV6 連接失敗的流程圖:
        如上圖所示,客戶端域名解析獲取到 IPV6、IPV4 地址,然后先請求 IPV6 未連接成功,幾秒后切換到 IPV4 連接成功,其中 IPV6 等待連接到連接失敗的這段時間就是 IPV6 無法訪問時的耗時。

        Happy Eyeballs

        RFC6555 中定義了一種減少可見延遲的算法要求 Happy Eyeballs,其最基礎(chǔ)的兩個目標(biāo)如下:
        1. 為用戶提供快速連接 IPV6 和 IPV4 的能力,即快速嘗試使用 IPV6 進(jìn)行連接,如果快速連接未成功,則切換到 IPV4 進(jìn)行連接。

        2. 避免同時連接 IPV6 和 IPV4 而對網(wǎng)絡(luò)造成沖擊。

        下面是上述思想的示意圖如下:
        如上圖所示,客戶端同時通過 IPV6 和 IPV4 發(fā)送兩個 TCP SYN 包,IPV6 未連接成功,IPV4 則響應(yīng)成功,重試 IPV6 直到用戶放棄連接 IPV6 直接切換到 IPV4 即可。
        執(zhí)行完上述過程后,客戶端則知道 IPV6 和 IPV4 地址是否連接成功,客戶端可以把結(jié)果緩存起來,避免后續(xù)的連接嘗試中影響網(wǎng)絡(luò),如在上面示例中 IPV6 連接是失敗,后續(xù)連接中可以直接切換到 IPV4 進(jìn)行連接,可以為緩存連接結(jié)果設(shè)定一個有效期,如 10 分鐘,之后可刷新連接狀態(tài),這就是在一定程度上減少了 IPV6 連接異常時的耗時,有助于增加用戶體驗。
        下面是一個 IPV6 工作正常的示意圖:
        如上圖所示,客戶端同時通過 IPV6 和 IPV4 發(fā)送兩個 TCP SYN 包,IPV6 和 IPV4 都連接成功,IPV6 直接連接成功,則直接走 IPV6,忽略 IPV4 即可,同樣記錄 IPV6 連接狀態(tài),可在設(shè)定的有效期內(nèi)直接 IPV6 進(jìn)行連接,
        只要客戶端主機(jī)是支持雙棧的,Happy Eyeballs 機(jī)制就會一直存在,只要存在僅支持 IPV4 的服務(wù)器存在,Happy Eyeballs 就會一直存在,隨著時間的推移,IPV4 將會逐漸退出歷史舞臺,Happy Eyeballs 的實現(xiàn)場景可能不同,但是基本遵循上述要求。

        實際運(yùn)用

        一般應(yīng)用層使用到的域名解析 API 如下:
        1public static InetAddress[] getAllByName(String host)
        上述方法會返回域名 host 對應(yīng)的 IP 地址,此時就可以根據(jù) IP 地址是 IPV6 地址還是 IPV4 地址進(jìn)行單雙棧問題的適配了,具體實現(xiàn)可以根據(jù)需求進(jìn)行調(diào)整和完善,上面介紹的 Happy Eyeballs 主要就是在解決雙棧時帶來的延時問題,大型 App 應(yīng)該都有自己的對應(yīng)算法實現(xiàn),有的甚至 DNS 這塊也是自己實現(xiàn)的,這里了解一下即可。
        推薦閱讀:
        ?

        ?

        瀏覽 218
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美福利一区 | 含紧一点h楼梯边做边走视 | 翘臀美女后入 | 99er视频 | 五月天久久久久 | 久久久久三级电影 | 最新版超模裸体asspics | 9l视频白拍9色9l视频 | 小说大尺度 | 又硬又粗又硬又长又大时间持久 |