1. 程式人生 > >android系統資料業務知識點總結(一)

android系統資料業務知識點總結(一)

1.APN

APN簡介

      APN指一種網路接入技術,是通過手機上網時必須配置的一個引數,它決定了手機通過哪種接入方式來訪問網路。對於手機使用者來說,可以訪問的外部網路型別有很多,例如:Internet、WAP網站、集團企業內部網路、行業內部專用網路。而不同的接入點所能訪問的範圍以及接入的方式是不同的,網路側如何知道手機啟用以後要訪問哪個網路從而分配哪個網段的IP呢,這就要靠APN來區分了,即APN決定了使用者的手機通過哪種接入方式來訪問什麼樣的網路。

APN分類

1、default

‍   預設網路連線,當啟用時所有資料傳輸都使用該連線,不能與其他網路連線同時使用

適用場合:絕大部分正常上網時可以使用

2、mms

彩信專用連線,此連線與default類似,用於與載體的多媒體資訊伺服器對話的應用程式,此連線能與default連線同時使用

適用場合:使用彩信服務時,必須有mms型別的接入點,不必選中,應用程式會自動使用此接入點

3、supl

是SecureUser Plane Location“安全使用者面定位”的簡寫,此連線與default類似,用於幫助定位裝置與載體的安全使用者面定位伺服器對話的應用程式,此連線能與default連線同時使用

4、dun

Dial UpNetworking撥號網路的簡稱,此連線與default連線類似,用於執行一個撥號網路網橋,使載體能知道撥號網路流量的應用程式,此連線能與default連線同時使用

適用場合:當我們使用自己的手機給別人做熱點時使用,不管是USB 熱點,wifi熱點或則bluetooth熱點。將他與default區別開來的主要目的一般是方面計費,國外很多運營商手機自己上網和做熱點計費不同的。目前在國內三大運營商都沒有區分,所以也就沒有dun這個apn

5、hipri

高優先順序網路,與default類似,但路由設定不同。使用較少。

6、ims

當ims發起啟用請求時會使用這個apn連建立ims的專用承載.

7、FOTA

手機FOTA升級的時候使用

8.IA

IA的apn專用於LTE attach使用,在手機檢測到sim卡後,便會載入這個attach apn. 不過很多運營商並沒有嚴格規定attach apn,所以常常複用default型別的apn。 在attachapn 載入的時候它有一個優先順序順序,如下:

IaApn  > PreferredApn > DefaultApn>FirstApn

IaApn : 型別為ia的apn,優先順序最高。

     PreferredApn :選中的apn。比如在手機setting裡面設定的那個apn

     DefaultApn :從apnlist裡面查詢到的第一個型別為“default”的apn

     FirstApn :apnlist中的第一個apn。

APN載入和過濾

   在每次開機的時候系統回自動檢查telephony.db是否存在,如果不存在則會建立資料庫telephony.db,並利用apns-conf.xml中的內容生成表carriers,以後所有對apn的操作都會是直接針對表carriers,包括查詢,建立,修改,刪除等。

   當插入一張卡後系統會根據卡的相關資訊來匹配相應的apn,在apn list中主要涉及匹配的項有:mcc,mnc,mvno_type, mvno_match_data。mvno_type值決定mvno_match_data的值,android原生程式碼裡mvno_type會有4個值,他們分別是“spn”,“imsi”,“gid”, “iccid”。所以,在apn 讀取的時候,會先根據sim卡的mcc,mnc讀取出相應的apn list,接著會判斷apn list 中的每一個apn的mvno_type 的值,如果不為空,則會根據mvno_type 和mvno_match_data再一次對apn list進行過濾,一般情況下,mvno_type,mvno_match_data為空。

2.MTU最大傳輸單元(MaximumTransmission Unit)

MTU簡介

    mtu是指通訊協議的某一層上面所能通過的最大資料包大小(以位元組為單位)。最大傳輸單元這個引數通常與通訊介面有關(網路介面卡、串列埠等)。MTU越大,則一個協議資料單元的承載的有效資料就越長,通訊效率也越高。MTU越大,傳送相同的使用者資料所需的資料包個數也越低。

MTU也不是越大越好,因為MTU越大, 傳送一個數據包的延遲也越大;並且MTU越大,資料包中 bit位發生錯誤的概率也越大。MTU越大,通訊效率越高而傳輸延遲增大,所以要權衡通訊效率和傳輸延遲選擇合適的MTU。另外,MTU表示的長度包含IP包頭的長度,如果IP層以上的協議層傳送的資料報文的長度超過了MTU,則在傳送者的IP層將對資料報文進行分片,在接收者的IP層對接收到的分片進行重組。在網路通訊中,需要儘量避免發生分片和重組,因為分片重組對網路效能影響較大。資料包傳送時選擇合適的MTU大小對提高通訊效能很有必要。目前手機在pdn 連結啟用時網路返回的MTU大小一般為1500, 但是不用運營商和不用的網路mtu也會改變。MTU值在吞吐量測試中至關重要,也會影響有些多媒體音視訊播放的流暢度,所以我必須重視。

Android手機設定mtu的過程

在資料啟用請求成功後返回的結果中一般會攜帶mtu的值,如下:

D RILJ  : [6898]> SETUP_DATA_CALL 16 0 data   0 IPV4V6 [SUB0]
D RILJ  : [6898]< SETUP_DATA_CALLDataCallResponse: {version=11 status=0 retry=-1 cid=0 active=2 type=IPV4V6ifname=rmnet_data0 mtu=1500addresses=[10.213.81.9/30] dnses=[212.77.192.59,82.148.111.11]gateways=[10.213.81.10] pcscf=[]} [SUB0]

在DataConnection.java中對當前將要使用的mtu再做一次檢查

/**
     * Read the MTU value from link properties where it can be set from network. In case
     * not set by the network, set it again using the mtu szie value defined in the APN
     * database for the connected APN
     */
    private void checkSetMtu(ApnSetting apn, LinkProperties lp) {
        if (lp == null) return;
        if (apn == null || lp == null) return;

        //如果網路有給出mtu的值則使用網路端給的
        if (lp.getMtu() != PhoneConstants.UNSET_MTU) {
            if (DBG) log("MTU set by call response to: " + lp.getMtu());
            return;
        }
         //如果apn裡面有攜帶mtu則使用
        if (apn != null && apn.mtu != PhoneConstants.UNSET_MTU) {
            lp.setMtu(apn.mtu);
            if (DBG) log("MTU set by APN to: " + apn.mtu);
            return;
        }

      //查詢資原始檔,使用該運營商自定義的mtu值,在做美國專案的時候可能會修改該處程式碼,將其移到函式最前面,優先使用自定義的mtu

    int mtu = mPhone.getContext().getResources().getInteger(
                com.android.internal.R.integer.config_mobile_mtu);
        if (mtu != PhoneConstants.UNSET_MTU) {
            lp.setMtu(mtu);
            if (DBG) log("MTU set by config resource to: " + mtu);
        }
    }

最後,當資料鏈接建立起來後會通過ConnectivityService.java中的

private voidupdateMtu(LinkProperties newLp, LinkProperties oldLp)介面更新該值到相應的網路埠上

怎樣檢視和更改手機的MTU值

1.用過adb使用ifconfig命令,如下圖

 

2.通過命令更改手機的mtu值

更改網絡卡MTU 值 格式: ip link set dev X mtu N  回車   (X=網絡卡名稱,如wlan0,rmnet_data1; N=mtu的值),下面演示更改rment_data7的mtu值:

 

注意:這個命令修改的值是臨時的,鏈路承載重置,開關機等都會使其還原。

3.net log裡面檢視mtu的值

我們先來看一個概念MSS

MSS:maximumsegment size,最大分節大小,為TCP資料包每次傳輸的最大資料分段大小,一般由傳送端向對端TCP通知對端在每個分節中能傳送的最大TCP資料

在wireshark中我們可以查詢到mss的值,再根據mss換算出mtu,換算公式如下:

MTU = MSS + 20 Byte (IP頭部)+20 Byte(TCP頭部), 如:我們查詢mss為1460,則相應的mtu大小應為1460+20+20=1500.

在wireshark中一般在tcp三次握手時我都可以看到mss的值。如下圖