這篇會走一趟整個使用行動上網的流程,以及封包如何出去。
若想知道更多,可利用 > 後的關鍵字去做搜尋。
我們一開機,不是在飛航模式 ……
– UE 會向 NW 做 “initial attach”
包含:
> RRC connection (手機告訴網路說:我想要連線啦~基地台快醒來服務我)
> Attach request (我要送東西ㄛ~大概是一個包裹的大小,
請幫忙聯絡車車來送貨)
> EMM 通知後端網路及認證 (電信商的櫃台忙著聯絡服務中心)
> RRC reconfiguration (開始配送貨車來服務客人送貨)
詳細流程可參考:
一分鐘快速了解手機如何傳送檔案
– Initial attach 之後,表示 UE 已經向網路拿到派發的 IP
– 這時候手機裡的 data service 會向 modem 取得 IP address
– 設定 Linux 裡的 “rmnet_data”、”DNS” ……
到此時,手機端的設定準備好了,建立連線完成。
但還沒有要送封包出去哦 ……
開始要送封包 ……
封包從 APP 開始,會經過:
– TCP
– IP
– MAC
– rmnet driver 走出去到網路端啦~
The packet flow, from userspace to kernel driver in Linux network stack
接下來就上到電信商給的車車載走囉!
RIL
|Life| the Career development of wireless communication engineers
It is difficult to hire senior engineers.
It is time to cultivate freshmen.
Hence, I write down our skills which will be learned from the position and summary the career development of telephony engineers.

|RIL| 建了 data 之後 ……
有了 APN,Modem 建了 data 之後會發生什麼事呢?
會長出網卡 ~~
可以使用 ifconfig 查看
別忘了設定 default route
route add default gw {IP-ADDRESS} {INTERFACE-NAME}
以及 DNS,才能用網域找到 ip
sudo echo nameserver 8.8.8.8 > /etc/resolv.conf
|RIL| Data Connection Flow
觀念:
- 啟動數據服務前,要先設定 APN。APN 在上層有一份,在 modem 也有一份
- 是可以只用 modem 裡的那份 APN (嵌入式平台)
- Android 是由上層帶 APN 給 modem 的
- 上層主要是看 bringUp & RIL 的 setupDataCall
以下只講部分關鍵點。
# load 上層的 db:TelephonyProvider.java
loadApns()
# TelephonyManager:使用者點開數據上網的 Icon
public void setDataEnabled(boolean enable) {
setDataEnabled(getDefaultDataSubscriptionId(), enable);
# DcAsyncChannel:填入 APN, 準備往下帶
public void bringUp(ApnContext apnContext, int profileId, int rilRadioTechnology,
boolean unmeteredUseOnly, Message onCompletedMsg,
int connectionGeneration) {
mLastConnectionParams = new ConnectionParams(apnContext, profileId, rilRadioTechnology,
unmeteredUseOnly, onCompletedMsg, connectionGeneration);
sendMessage(DataConnection.EVENT_CONNECT, mLastConnectionParams);
# DataConnection:StateMachine 收到要建立連線啦!
public boolean processMessage(Message msg) {
…
case EVENT_CONNECT:
if (DBG) log(“DcInactiveState: mag.what=EVENT_CONNECT”);
ConnectionParams cp = (ConnectionParams) msg.obj;
if (initConnection(cp)) {
onConnect(mConnectionParams);
# RIL:終於送到 RIL了,要往 Modem 前進啦!
mPhone.mCi.setupDataCall(cp.mRilRat, dp, isModemRoaming, allowRoaming, msg);
Ref. https://blog.csdn.net/u012439416/article/details/75263645