默认数据连接创建

创建默认数据连接有两种方式:

  1. 开机初始化(需要Settings默认数据开关是打开的)
  2. 用户从Settings UI上手动打开

一, 开机default Data建立的过程:

PhoneApp在启动过程中,有好几次都会调用Dctracker的trySetupData,这个方法最终会向驱使RILJ向RILC发起SETUP_DATA_CALL。这个方法中有个重要的判断isDataAllowed来决定要不要setupData。而dataAllowed只有当收到SSTracker EVENT_DATA_CONNECTION_ATTACHED的消息后,才表示当前可以去setupData了,因为此时SIM卡也已经加载好,APN也已经初始化好。

触发trySetupData的地方,

  1. DcTracker(constructor)-registerAllEvents->registerServiceStateTrackerEvents->EVENT_DATA_CONNECTION_ATTACHED,->onDataConnectionAttached->setupDataOnAllConnectableApns->(也就是接收到RILJ主动上报:UNSOL_RESPONSE_NETWORK_STATE_CHANGED,然后ServiceStateTracker发出network 状态发生变化, 通知其他模块,比如DcTracker)
    此时SIM卡已经loaded完成,data也attached。isDataAllowed为true,可以setupdata了。
    KeyLogs:
05-18 14:26:29.352 D/QtiDCT-C( 2185): [0]trySetupData for APN type default, reason: **dataAttached**, requestType=NORMAL. **Data allowed, reason: NORMAL**
05-18 14:26:29.361 D/QtiDCT-C( 2185): [0]**setupData**: dc={DC-QtiDC-1: State=DcInactiveState mApnSetting=null RefCount=0 mCid=-1 mCreateTime=0 mLastastFailTime=0 mLastFailCause=0 mTag=0 mLinkProperties={LinkAddresses: [ ] DnsAddresses: [ ] Domains: null MTU: 0 Routes: [ ]} linkCapabilities=[ Transports: CELLULAR Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_ROAMING&NOT_CONGESTED LinkUpBandwidth>=15000Kbps LinkDnBandwidth>=30000Kbps Specifier: <0>] mRestrictedNetworkOverride=false mApnContexts={}} apnSetting=[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1 gen#=1
  1. DcTracker(constructor)->update->onUpdateIcc->EVENT_RECORDS_LOADED->onRecordsLoadedOrSubIdChanged->setupDataOnAllConnectableApns.
    这个流程触发,必须是SIM加载已经ready。虽然这个时候也会触发trySetupData,但是由于此时数据还没有attached,所以就不会触发setUpData。
    KeyLogs:
05-18 14:26:23.874 D/QtiDCT-C( 2185): [0]trySetupData for APN type default, **reason: simLoaded**, requestType=NORMAL. **Data disallowed, reasons: NOT_ATTACHED**
05-18 14:26:23.874 D/QtiDCT-C( 2185): [0]**trySetupData failed.** apnContext = [type=default, mState=IDLE, apnEnabled=true, mDependencyMet=true]
  1. 还有DcTracker监听到registerServiceStateTrackerEvents->EVENT_DATA_RAT_CHANGED,此时数据也没有attached,所以也不会触发setUpData。
    KeyLogs:
05-18 14:26:29.346 D/QtiDCT-C( 2185): [0]trySetupData for APN type default, reason: **nwTypeChanged**, requestType=NORMAL. **Data disallowed, reasons: NOT_ATTACHED**
05-18 14:26:29.346 D/QtiDCT-C( 2185): [0]**trySetupData failed**. apnContext = [type=default, mState=IDLE, apnEnabled=true, mDependencyMet=true]

还有当创建NetworkFactory的时候,当条件合适的时候最终也会触发setUpData,但是对开机流程来说,都不合适。

所以完整的开机创建数据连接的流程为:
DcTracker(constructor)->registerForAllEvents->registerServiceStateTrackerEvents->DctConstants.EVENT_DATA_CONNECTION_ATTACHED->onDataConnectionAttached->setupDataOnAllConnectableApns
->trySetupData->setupData->DataConnection.bringUp->DataConnection.EVENT_CONNECT(DcInactiveState)->connect(同时将状态切换到mActivatingState)->DataServiceManager.setupDataCall->CellularDataService.CellularDataServiceProvider.setupDataCall
->mPhone.mCi.setupDataCall->RIL.setupDataCall.

#mermaid-svg-5QWRpyMDreQIYEOW .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-5QWRpyMDreQIYEOW .label text{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .node rect,#mermaid-svg-5QWRpyMDreQIYEOW .node circle,#mermaid-svg-5QWRpyMDreQIYEOW .node ellipse,#mermaid-svg-5QWRpyMDreQIYEOW .node polygon,#mermaid-svg-5QWRpyMDreQIYEOW .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-5QWRpyMDreQIYEOW .node .label{text-align:center;fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .node.clickable{cursor:pointer}#mermaid-svg-5QWRpyMDreQIYEOW .arrowheadPath{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-5QWRpyMDreQIYEOW .flowchart-link{stroke:#333;fill:none}#mermaid-svg-5QWRpyMDreQIYEOW .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-5QWRpyMDreQIYEOW .edgeLabel rect{opacity:0.9}#mermaid-svg-5QWRpyMDreQIYEOW .edgeLabel span{color:#333}#mermaid-svg-5QWRpyMDreQIYEOW .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-5QWRpyMDreQIYEOW .cluster text{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-5QWRpyMDreQIYEOW .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-5QWRpyMDreQIYEOW text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-5QWRpyMDreQIYEOW .actor-line{stroke:grey}#mermaid-svg-5QWRpyMDreQIYEOW .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-5QWRpyMDreQIYEOW .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-5QWRpyMDreQIYEOW #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-5QWRpyMDreQIYEOW .sequenceNumber{fill:#fff}#mermaid-svg-5QWRpyMDreQIYEOW #sequencenumber{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW #crosshead path{fill:#333;stroke:#333}#mermaid-svg-5QWRpyMDreQIYEOW .messageText{fill:#333;stroke:#333}#mermaid-svg-5QWRpyMDreQIYEOW .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-5QWRpyMDreQIYEOW .labelText,#mermaid-svg-5QWRpyMDreQIYEOW .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-5QWRpyMDreQIYEOW .loopText,#mermaid-svg-5QWRpyMDreQIYEOW .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-5QWRpyMDreQIYEOW .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-5QWRpyMDreQIYEOW .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-5QWRpyMDreQIYEOW .noteText,#mermaid-svg-5QWRpyMDreQIYEOW .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-5QWRpyMDreQIYEOW .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-5QWRpyMDreQIYEOW .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-5QWRpyMDreQIYEOW .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-5QWRpyMDreQIYEOW .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .section{stroke:none;opacity:0.2}#mermaid-svg-5QWRpyMDreQIYEOW .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-5QWRpyMDreQIYEOW .section2{fill:#fff400}#mermaid-svg-5QWRpyMDreQIYEOW .section1,#mermaid-svg-5QWRpyMDreQIYEOW .section3{fill:#fff;opacity:0.2}#mermaid-svg-5QWRpyMDreQIYEOW .sectionTitle0{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .sectionTitle1{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .sectionTitle2{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .sectionTitle3{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-5QWRpyMDreQIYEOW .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .grid path{stroke-width:0}#mermaid-svg-5QWRpyMDreQIYEOW .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-5QWRpyMDreQIYEOW .task{stroke-width:2}#mermaid-svg-5QWRpyMDreQIYEOW .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .taskText:not([font-size]){font-size:11px}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-5QWRpyMDreQIYEOW .task.clickable{cursor:pointer}#mermaid-svg-5QWRpyMDreQIYEOW .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-5QWRpyMDreQIYEOW .taskText0,#mermaid-svg-5QWRpyMDreQIYEOW .taskText1,#mermaid-svg-5QWRpyMDreQIYEOW .taskText2,#mermaid-svg-5QWRpyMDreQIYEOW .taskText3{fill:#fff}#mermaid-svg-5QWRpyMDreQIYEOW .task0,#mermaid-svg-5QWRpyMDreQIYEOW .task1,#mermaid-svg-5QWRpyMDreQIYEOW .task2,#mermaid-svg-5QWRpyMDreQIYEOW .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutside0,#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutside2{fill:#000}#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutside1,#mermaid-svg-5QWRpyMDreQIYEOW .taskTextOutside3{fill:#000}#mermaid-svg-5QWRpyMDreQIYEOW .active0,#mermaid-svg-5QWRpyMDreQIYEOW .active1,#mermaid-svg-5QWRpyMDreQIYEOW .active2,#mermaid-svg-5QWRpyMDreQIYEOW .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-5QWRpyMDreQIYEOW .activeText0,#mermaid-svg-5QWRpyMDreQIYEOW .activeText1,#mermaid-svg-5QWRpyMDreQIYEOW .activeText2,#mermaid-svg-5QWRpyMDreQIYEOW .activeText3{fill:#000 !important}#mermaid-svg-5QWRpyMDreQIYEOW .done0,#mermaid-svg-5QWRpyMDreQIYEOW .done1,#mermaid-svg-5QWRpyMDreQIYEOW .done2,#mermaid-svg-5QWRpyMDreQIYEOW .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-5QWRpyMDreQIYEOW .doneText0,#mermaid-svg-5QWRpyMDreQIYEOW .doneText1,#mermaid-svg-5QWRpyMDreQIYEOW .doneText2,#mermaid-svg-5QWRpyMDreQIYEOW .doneText3{fill:#000 !important}#mermaid-svg-5QWRpyMDreQIYEOW .crit0,#mermaid-svg-5QWRpyMDreQIYEOW .crit1,#mermaid-svg-5QWRpyMDreQIYEOW .crit2,#mermaid-svg-5QWRpyMDreQIYEOW .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-5QWRpyMDreQIYEOW .activeCrit0,#mermaid-svg-5QWRpyMDreQIYEOW .activeCrit1,#mermaid-svg-5QWRpyMDreQIYEOW .activeCrit2,#mermaid-svg-5QWRpyMDreQIYEOW .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-5QWRpyMDreQIYEOW .doneCrit0,#mermaid-svg-5QWRpyMDreQIYEOW .doneCrit1,#mermaid-svg-5QWRpyMDreQIYEOW .doneCrit2,#mermaid-svg-5QWRpyMDreQIYEOW .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-5QWRpyMDreQIYEOW .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-5QWRpyMDreQIYEOW .milestoneText{font-style:italic}#mermaid-svg-5QWRpyMDreQIYEOW .doneCritText0,#mermaid-svg-5QWRpyMDreQIYEOW .doneCritText1,#mermaid-svg-5QWRpyMDreQIYEOW .doneCritText2,#mermaid-svg-5QWRpyMDreQIYEOW .doneCritText3{fill:#000 !important}#mermaid-svg-5QWRpyMDreQIYEOW .activeCritText0,#mermaid-svg-5QWRpyMDreQIYEOW .activeCritText1,#mermaid-svg-5QWRpyMDreQIYEOW .activeCritText2,#mermaid-svg-5QWRpyMDreQIYEOW .activeCritText3{fill:#000 !important}#mermaid-svg-5QWRpyMDreQIYEOW .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-5QWRpyMDreQIYEOW g.classGroup text .title{font-weight:bolder}#mermaid-svg-5QWRpyMDreQIYEOW g.clickable{cursor:pointer}#mermaid-svg-5QWRpyMDreQIYEOW g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-5QWRpyMDreQIYEOW g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-5QWRpyMDreQIYEOW .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-5QWRpyMDreQIYEOW .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-5QWRpyMDreQIYEOW .dashed-line{stroke-dasharray:3}#mermaid-svg-5QWRpyMDreQIYEOW #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW .commit-id,#mermaid-svg-5QWRpyMDreQIYEOW .commit-msg,#mermaid-svg-5QWRpyMDreQIYEOW .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-5QWRpyMDreQIYEOW g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-5QWRpyMDreQIYEOW g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-5QWRpyMDreQIYEOW g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-5QWRpyMDreQIYEOW .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-5QWRpyMDreQIYEOW .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-5QWRpyMDreQIYEOW .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-5QWRpyMDreQIYEOW .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-5QWRpyMDreQIYEOW .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-5QWRpyMDreQIYEOW .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-5QWRpyMDreQIYEOW .edgeLabel text{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-5QWRpyMDreQIYEOW .node circle.state-start{fill:black;stroke:black}#mermaid-svg-5QWRpyMDreQIYEOW .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-5QWRpyMDreQIYEOW #statediagram-barbEnd{fill:#9370db}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-state .divider{stroke:#9370db}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-5QWRpyMDreQIYEOW .note-edge{stroke-dasharray:5}#mermaid-svg-5QWRpyMDreQIYEOW .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-5QWRpyMDreQIYEOW .error-icon{fill:#522}#mermaid-svg-5QWRpyMDreQIYEOW .error-text{fill:#522;stroke:#522}#mermaid-svg-5QWRpyMDreQIYEOW .edge-thickness-normal{stroke-width:2px}#mermaid-svg-5QWRpyMDreQIYEOW .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-5QWRpyMDreQIYEOW .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-5QWRpyMDreQIYEOW .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-5QWRpyMDreQIYEOW .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-5QWRpyMDreQIYEOW .marker{fill:#333}#mermaid-svg-5QWRpyMDreQIYEOW .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-5QWRpyMDreQIYEOW {color: rgba(0, 0, 0, 0.75);font: ;}PhoneAppPhoneGlobalsPhoneFactoryGsmCdmaPhoneDcTrackerDataConnectionDataServiceManagerCellularDataServiceRILJRILCNetworkAgentConnectivityServiceTelephonyRegistryMobileSignalControlleronCreatemakeDefaultPhonesconstructor(new)constructor(new)利用工厂类TelephonyComponentFactory创建DcTracker对象registerForAllEventsregisterServiceStateTrackerEventsonDataConnectionAttachedsetupDataOnAllConnectableApnstrySetupDatasetupDatabringUpDcInactiveState.EVENT_CONNECTconnectsetupDataCallsetupDataCallsetupDataCallSETUP_DATA_CALLSETUP_DATA_CALLEVENT_SETUP_DATA_CONNECTION_DONE这里是将当前链接成功的数据注册到ConnectivityService,让其进行管理constructor(new)registerNetworkAgentDctConstants.EVENT_DATA_SETUP_COMPLETE通知其他第三方模块进行更新notifyDataConnectiondataStateChangedPhoneAppPhoneGlobalsPhoneFactoryGsmCdmaPhoneDcTrackerDataConnectionDataServiceManagerCellularDataServiceRILJRILCNetworkAgentConnectivityServiceTelephonyRegistryMobileSignalController

完整的KeyLog:

05-18 14:26:21.489 W/TelephonyComponentFactory( 2185): Injection jar is not protected , path: /system/framework/qti-telephony-common.jarstatvfs failed: ENOENT (No such file or directory)
05-18 14:26:21.519 I/PhoneFactory( 2185): Cdma Subscription set to 0
05-18 14:26:21.519 I/PhoneFactory( 2185): Network Mode set to 10
05-18 14:26:21.521 D/RILJ    ( 2185): RIL: init preferredNetworkType=10 cdmaSubscription=0) [SUBnull]
05-18 14:26:21.541 D/RILJ    ( 2185): Unsol response received; Sending ack to ril.cpp [SUB0]
05-18 14:26:21.541 D/RILJ    ( 2185): [UNSL]< UNSOL_RIL_CONNECTED [SUB0]
05-18 14:26:21.542 D/RILJ    ( 2185): [0002]> RADIO_POWER on = false [SUB0]
//Create GsmCdmaCallTracker
05-18 14:26:21.612 D/TelephonyComponentFactory( 2185): makeGsmCdmaCallTracker
//Create DcTracker
05-18 14:26:21.763 D/QtiTelephonyComponentFactory( 2185): makeQtiDcTracker
//init Apn on DcTracker constructor
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: E
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: skipping unknown type=1
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=default mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=mms mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=supl mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=dun mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=hipri mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=fota mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=ims mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=cbs mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: skipping unknown type=7
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: skipping unknown type=9
05-18 14:26:21.784 D/        ( 2185): [0]initApnContexts: apnContext={mApnType=emergency mState=IDLE mWaitingApns={null} mApnSetting={null} mReason=dataEnabled mDataEnabled=false mDependencyMet=true}
//Update ImsPhone
05-18 14:26:21.886 D/Phone   ( 2185): updateImsPhone mImsServiceReady=true
//Create ImsPhoneCallTracker
05-18 14:26:21.887 D/TelephonyComponentFactory( 2185): makeImsPhoneCallTracker
//Register NetworkFactory to ConnectivityService, which will triggle trySetupData, but will failed in this case.
05-18 14:26:21.904 D/TelephonyNetworkFactory[0]( 2185): Registering NetworkFactory
05-18 14:26:21.905 D/ConnectivityService( 1407): Got NetworkFactory Messenger for TelephonyNetworkFactory[0]
//Notify SSTracker to notify DcTracker the data attached.
05-18 14:26:29.210 D/RILJ    ( 2185): [UNSL]< UNSOL_RESPONSE_NETWORK_STATE_CHANGED [SUB0]
05-18 14:26:29.210 D/NRM-C   ( 2185): onNetworkStateChanged
05-18 14:26:29.210 D/SST     ( 2185): [0] Poll ServiceState done:  oldSS=[{mVoiceRegState=0(IN_SERVICE), mDataRegState=1(OUT_OF_SERVICE), mChannelNumber=38950, duplexMode()=0, mCellBandwidths=[], mVoiceOperatorAlphaLong=CMCC, mVoiceOperatorAlphaShort=CMCC, mDataOperatorAlphaLong=CMCC, mDataOperatorAlphaShort=CMCC, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=14(LTE), getRilDataRadioTechnology=0(Unknown), mCssIndicator=unsupported, mNetworkId=-1, mSystemId=-1, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mLteEarfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=NOT_REG_OR_SEARCHING roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 20 isDcNrRestricted = false isNrAvailable = false isEnDcAvailable = false LteVopsSupportInfo :  mVopsSupport = 1 mEmcBearerSupport = 1 mIsUsingCarrierAggregation = false } nrState=NONE}, NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityLte:{ mCi=21765889 mPci=89 mTac=4421 mEarfcn=38950 mBandwidth=2147483647 mMcc=460 mMnc=00 mAlphaLong=CMCC mAlphaShort=CMCC} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=-1 mSystemIsInPrl=-1 mDefaultRoamingIndicator=-1} dataSpecificInfo=null nrState=NONE}], mNrFrequencyRange=-1, mOperatorAlphaLongRaw=CMCC, mOperatorAlphaShortRaw=CMCC, mIsIwlanPreferred=false}] newSS=[{mVoiceRegState=0(IN_SERVICE), mDataRegState=0(IN_SERVICE), mChannelNumber=38950, duplexMode()=2, mCellBandwidths=[], mVoiceOperatorAlphaLong=CMCC, mVoiceOperatorAlphaShort=CMCC, mDataOperatorAlphaLong=CMCC, mDataOperatorAlphaShort=CMCC, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=14(LTE), getRilDataRadioTechnology=14(LTE), mCssIndicator=unsupported, mNetworkId=-1, mSystemId=-1, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mLteEarfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityLte:{ mCi=21765889 mPci=89 mTac=4421 mEarfcn=38950 mBandwidth=2147483647 mMcc=460 mMnc=00 mAlphaLong=CMCC mAlphaShort=CMCC} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=1 mSystemIsInPrl=-1 mDefaultRoamingIndicator=-1} dataSpecificInfo=null nrState=NONE}, NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=HOME roamingType=NOT_ROAMING accessNetworkTechnology=LTE rejectCause=0 emergencyEnabled=false availableServices=[DATA] cellIdentity=CellIdentityLte:{ mCi=21765889 mPci=89 mTac=4421 mEarfcn=38950 mBandwidth=2147483647 mMcc=460 mMnc=00 mAlphaLong=CMCC mAlphaShort=CMCC} voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 20 isDcNrRestricted = false isNrAvailable = false isEnDcAvailable = false LteVopsSupportInfo :  mVopsSupport = 2 mEmcBearerSupport = 3 mIsUsingCarrierAggregation = false } nrState=NONE}], mNrFrequencyRange=-1, mOperatorAlphaLongRaw=CMCC, mOperatorAlphaShortRaw=CMCC, mIsIwlanPreferred=false}] oldMaxDataCalls=20 mNewMaxDataCalls=20 oldReasonDataDenied=0 mNewReasonDataDenied=0
05-18 14:26:29.210 D/SST     ( 2185): [0] pollStateDone: hasRegistered = false hasDeregistered = false hasDataAttached = {1=true} hasDataDetached = {1=false} hasDataRegStateChanged = {1=true} hasRilVoiceRadioTechnologyChanged = false hasRilDataRadioTechnologyChanged = {1=true} hasDataTransportPreferenceChanged = false hasChanged = true hasVoiceRoamingOn = false hasVoiceRoamingOff = false hasDataRoamingOn =false hasDataRoamingOff = false hasLocationChanged = false has4gHandoff = false hasMultiApnSupport = false hasLostMultiApnSupport = false hasCssIndicatorChanged = false hasNrFrequencyRangeChanged = false hasNrStateChanged = false hasAirplaneModeOnlChanged = false
**05-18 14:26:29.347 D/QtiDCT-C( 2185): [0]onDataConnectionAttached**
05-18 14:26:29.347 D/QtiDCT-C( 2185): [0]setupDataOnAllConnectableApns: dataAttached emergency:[state=IDLE,enabled=false] mms:[state=IDLE,enabled=false] supl:[state=IDLE,enabled=false] hipri:[state=IDLE,enabled=false] dun:[state=IDLE,enabled=false] fota:[state=IDLE,enabled=false] ims:[state=IDLE,enabled=false] default:[state=IDLE,enabled=true] cbs:[state=IDLE,enabled=false]
05-18 14:26:29.347 D/QtiDCT-C( 2185): [0]isConnectable() call trySetupData
05-18 14:26:29.352 D/QtiDCT-C( 2185): [0]trySetupData for APN type default, reason: dataAttached, requestType=NORMAL. Data allowed, reason: NORMAL
05-18 14:26:29.357 D/QtiDCT-C( 2185): [0]setupData: apnContext={mApnType=default mState=IDLE mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={null} mReason=dataAttached mDataEnabled=true mDependencyMet=true}, requestType=NORMAL
05-18 14:26:29.361 D/QtiDCT-C( 2185): [0]setupData: dc={DC-QtiDC-1: State=DcInactiveState mApnSetting=null RefCount=0 mCid=-1 mCreateTime=0 mLastastFailTime=0 mLastFailCause=0 mTag=0 mLinkProperties={LinkAddresses: [ ] DnsAddresses: [ ] Domains: null MTU: 0 Routes: [ ]} linkCapabilities=[ Transports: CELLULAR Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_ROAMING&NOT_CONGESTED LinkUpBandwidth>=15000Kbps LinkDnBandwidth>=30000Kbps Specifier: <0>] mRestrictedNetworkOverride=false mApnContexts={}} apnSetting=[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1 gen#=105-18 14:26:29.368 D/DC-QtiDC-1( 2185): bringUp: apnContext={mApnType=default mState=CONNECTING mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1} mReason=dataAttached mDataEnabled=true mDependencyMet=true} onCompletedMsg={ when=-24s962ms what=270336 obj=Pair{{mApnType=default mState=CONNECTING mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1} mReason=dataAttached mDataEnabled=true mDependencyMet=true} 1} target=com.qualcomm.qti.internal.telephony.dataconnection.QtiDcTracker }
05-18 14:26:29.368 D/DC-QtiDC-1( 2185): connect: carrier='中国移动 (China Mobile) GPRS' APN='cmnet' proxy='' port='-1'
05-18 14:26:29.378 D/DSM-C   ( 2185): setupDataCall
05-18 14:26:29.379 D/RILJ    ( 2185): [0250]> SETUP_DATA_CALL,dataRat=14,isRoaming=false,allowRoaming=false,DataProfile=-1/2/3/cmnet///0/0/0/0/true/21/2/0/0/false/true [SUB0]
05-18 14:26:29.755 D/RILJ    ( 2185): [0250]< SETUP_DATA_CALL DataCallResponse: { cause=0 retry=-1 cid=0 linkStatus=2 protocolType=2 ifname=rmnet_data1 addresses=[10.8.126.27/29] dnses=[/221.179.155.193, /221.179.155.209] gateways=[/10.8.126.28] pcscf=[] mtu=0} [SUB0]
05-18 14:26:29.755 D/DSM-C   ( 2185): onSetupDataCallComplete. resultCode = 0, response = DataCallResponse: { cause=0 retry=-1 cid=0 linkStatus=2 protocolType=2 ifname=rmnet_data1 addresses=[10.8.126.27/29] dnses=[/221.179.155.193, /221.179.155.209] gateways=[/10.8.126.28] pcscf=[] mtu=0}
05-18 14:26:29.757 D/DC-QtiDC-1( 2185): DcActivatingState: msg={what=EVENT_SETUP_DATA_CONNECTION_DONE when=-1ms obj={mTag=2 mApnContext={mApnType=default mState=CONNECTING mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1} mReason=dataAttached mDataEnabled=true mDependencyMet=true} mProfileId=-1 mRat=14 mOnCompletedMsg={what=0x42000 when=-25s351ms obj=Pair{{mApnType=default mState=CONNECTING mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1} mReason=dataAttached mDataEnabled=true mDependencyMet=true} 1} target=Handler (com.qualcomm.qti.internal.telephony.dataconnection.QtiDcTracker) {5996016} replyTo=null} mRequestType=NORMAL mSubId=1} target=Handler (com.android.internal.util.StateMachine$SmHandler) {9c33f6d} replyTo=null}
05-18 14:26:29.757 D/DC-QtiDC-1( 2185): onSetupConnectionCompleted: resultCode=0, response=DataCallResponse: { cause=0 retry=-1 cid=0 linkStatus=2 protocolType=2 ifname=rmnet_data1 addresses=[10.8.126.27/29] dnses=[/221.179.155.193, /221.179.155.209] gateways=[/10.8.126.28] pcscf=[] mtu=0}
05-18 14:26:29.757 D/DC-QtiDC-1( 2185): onSetupConnectionCompleted received successful DataCallResponse
05-18 14:26:29.772 D/QtiDCT-C( 2185): [0]completeConnection: successful, notify the world apnContext={mApnType=default mState=CONNECTED mWaitingApns={[[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1]} mApnSetting={[ApnSettingV7] 中国移动 (China Mobile) GPRS, 2775, 46007, cmnet, , null, , null, null, 3, supl | hipri | default, IPV4V6, IPV4V6, true, 0, false, 0, 0, 0, 0, null, , false, 0, 0, -1, -1} mReason=connected mDataEnabled=true mDependencyMet=true}
05-18 14:26:29.772 D/GsmCdmaPhone( 2185): [0] getDataConnectionState apnType=default ret=CONNECTED05-18 14:26:29.776 D/ConnectivityService( 1407): registerNetworkAgent NetworkAgentInfo{ ni{[type: MOBILE[LTE], state: CONNECTED/CONNECTED, reason: connected, extra: cmnet, failover: false, available: true, roaming: false]}  network{100}  nethandle{432902426637}  lp{{InterfaceName: rmnet_data1 LinkAddresses: [ 10.8.126.27/29 ] DnsAddresses: [ /221.179.155.193,/221.179.155.209 ] Domains: null MTU: 1500 TcpBufferSizes: 524288,1048576,8388608,262144,524288,4194304 Routes: [ 0.0.0.0/0 -> 10.8.126.28 rmnet_data1,10.8.126.24/29 -> 0.0.0.0 rmnet_data1 ]}}  nc{[ Transports: CELLULAR Capabilities: SUPL&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED LinkUpBandwidth>=15000Kbps LinkDnBandwidth>=30000Kbps Specifier: <1>]}  Score{10}  everValidated{false}  lastValidated{false}  created{false} lingering{false} explicitlySelected{false} acceptUnvalidated{false} everCaptivePortalDetected{false} lastCaptivePortalDetected{false} captivePortalValidationPending{false} partialConnectivity{false} acceptPartialConnectivity{false} clat{mBaseIface: null, mIface: null, mState: IDLE} }
05-18 14:26:29.780 D/QtiDCT-C( 2185): [0]onDataSetupComplete: SETUP complete type=default

主要的方法介绍:
setupData流程
DcTracker在下发setupData->DataConnection.bringUp的时候,会携带一条消息:
DctConstants.EVENT_DATA_SETUP_COMPLETE,对应DcTraker中的Handler会进行处理
onDataSetupComplete -> completeConnection ->

  1. mPhone.notifyDataConnection(apnContext.getApnType()):最终通过TelephonyRegistry通知别的component当前有dataStateChanged,比如说statusbar上的图标显示:MobileSignalController

DataConnection.bringUp(EVENT_CONNECT:该消息在处理的时候从初始态mInactiveState translateTo mActivatingState)->connect(setupdatacall)也会携带message:
EVENT_SETUP_DATA_CONNECTION_DONE
这个消息处理在ActivatingState,主要就是将当前的状态切换到ActivateState,进入到这个状态后,主要就是创建NetworkAgent,并将其注册到ConnectvityService中。
让ConnectivityService来管理该数据连接。

二, 从Settings UI打开数据开关创建默认data connection:

TelephonyManager提供了接口setDataEnabled来供UI 层打开或者关闭Mobile data from UI。
这个api最终也会调用到上述所说的trySetupData中来创建数据连接。

入口Activity:
cmp=com.android.settings/.network.telephony.MobileNetworkActivity
06-02 18:14:44.687 1404 3145 I ActivityTaskManager: START u0 {cmp=com.android.settings/.network.telephony.MobileNetworkActivity (has extras)} from uid 1000

问题:

  1. 在创建数据连接的时候是如何来筛选APN的?
    DcTracker在初始化的时候会先调用initApnContexts初始化所有的APN,该过程其实也就是从config文件中读取出所有的apn信息,将其存放到队列中(mPrioritySortedApnContexts),在尝试创建数据连接的时候遍历该队列,符合条件的,发给trySetupData,然后又在trySetupData方法中,调用isDataAllowed方法做筛选,如果该方法返回false,则trySetupData失败。
    isDataAllowed这个方法在根据当前数据attach的情况,SIM卡 loaded的情况,等等来做判断

所以说初始化过程中创建数据连接的apn筛选,其实经过了两次筛选。

AndroidQ_默认数据连接的建立相关推荐

  1. springboot2.0 默认数据连接池HikariPool(java平台最快的,替换druid)性能对比

    背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...

  2. spring boot 配置默认数据连接池 HiKariCP

    一.为什么选择HiKariCP 没其他原因,就是一个字 快. 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 .hikariCP的高性能得益 ...

  3. FTP的控制连接和数据连接分别是做什么的?主动模式和被动模式有什么区别?

    你知道FTP的控制连接和数据连接分别是做什么的吗? 你知道FTP的主动模式和被动模式有什么区别吗? 你知道实际工作中,会使用主动FTP还是被动FTP吗?又是为什么呢? 一. FTP的两种连接 FTP( ...

  4. 信息提示无法建立数据连接服务器,FileZilla 链接FTP服务器无法建立数据连接: ECONNREFUSED...

    今天想在服务器上下载 一个文件(宝塔面板 腾讯云), 有点大,就想用FTP断点的方式 来下载,以备 网络中断的错误. 无奈遇到了这样的错误: 命令: MLSD 错误: 无法建立数据连接: ECONNR ...

  5. tableau无法建立连接_Tableau入门(一):数据连接

    1 开始界面 你可以在Tableau官网上下载Tableau Desktop(即桌面版). 打开Tableau Desktop后,你可以看到如下界面: 图1 Tableau开始界面 开始界面的左侧是T ...

  6. 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口

    在写这篇文章之前,xxx已经写过了几篇关于改数据连接主题的文章,想要了解的朋友可以去翻一下之前的文章 一.TCP段格式: TCP的段格式如下图所示 源端口号与目标端口号 源端口号和目标端口号,加上IP ...

  7. fxp连接失败_FlashFXP使用PASV被动模式建立数据连接失败的问题解决

    FTP是常见的上传下载网络应用之一,虽然如今对于普通用户很少用到了,但在某些特殊场合还是会使用到的. 以Windows 2003中IIS自带的FTP功能为例,其服务端本身的配置是相对简单的,稍作设置后 ...

  8. 计算机配置中无可移动设备访问,由于您的计算机尚未建立以太网,wifi或移动数据连接,因此我们无法设置移动热点-...

    在热点界面上,选择"设置移动热点" 进入设置界面,输入"密码",然后单击"保存"以修改移动热点的密码. 如果您无法通过简单的设置解决问题,则 ...

  9. 《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止

    TCP是一个面向连接的协议.不管哪一方向还有一方发送数据之前.都必须在两方之间建立一条连接.这样的两端间连接的建立与无连接协议UDP不同.UDP向还有一端发送数据报时,无需不论什么预告的握手. 1.建 ...

最新文章

  1. Python:Spider
  2. 作为程序员应有10项权利
  3. 卓有成效的管理者应该借助哪些团队协作工具?
  4. SqlSugar ORM 入门到精通【一】入门篇
  5. Data Augmentation
  6. 使用NW.js封装微信公众号菜单编辑器为桌面应用
  7. 代码添加ProgressBar 进度条
  8. 延时消息_Handler的消息延时是怎么实现的
  9. 上下div高度动态自适应--另类处理方案
  10. 【语音隐写】基于matlab GUI DWT音频数字水印(带语音播报)【含Matlab源码 711期】
  11. 杨强教授新番!破解机器学习数据孤岛和数据保护难题
  12. JavaFX屏幕截图工具ScreenCapture
  13. 使用CSS3制作一个简单的导航栏
  14. no matching cipher found
  15. C语言报错警告合集(转)
  16. bzoj1778 驱逐猪猡 [高斯消元+概率DP]
  17. 中科云谷正式落户上海临港 构筑工业互联网新图景
  18. ros3。3教程 入门到高级
  19. vb For循环例子
  20. 2022阿里云轻量服务器2核2G 2核4G

热门文章

  1. NRF51822——LCD128X64驱动
  2. Rust初学者环境搭建(非Viatual Studio ,自定义安装目录)
  3. 版本 000 / 2020 作业计划/数量计划中没有 作业类型 XXX的控制记录
  4. [答学员问】对于低学历的我,想找一个培训机构学习Linux网络运维,哪个培训机构教学稍微好一点呢?
  5. 分享8款令人惊叹的HTML5 Canvas动画特效
  6. [精选]看股票走势图的软件用哪个好(如何看懂股市行情大盘的走势)
  7. 用优雅拂去岁月的轻尘
  8. 瑞波2020年第三季度XRP市场报告节选
  9. 计算机体系结构 专业排名,计算机系统专业及其排名介绍 加州伯克利排名第一...
  10. 阿里云Intel Xeon(Ice Lake) Platinum 8369B服务器CPU性能评测