第八章 Wi-Fi连接DHCP过程

系列文章目录

第一章 国内下载AOSP最新源码的方法
第二章 下载AOSP WiFi相关的代码
第三章 将源码导入Android Studio(无需编译idegen)



前言

在STA跟AP完成四次握手后,数据链路层成功建立了连接,但是网络OSI七层模型中应用层访问网络还必须得有ip地址才行,DHCP就是从AP的DHCP服务获取IP的过程。


一、DHCP是什么?

DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组件不会被系统自动安装,还需要管理员手动安装并进行必要的配置。

二、DHCP的过程

1. DHCP正常流程

ClientModeImpl$ObtainingIpState:
 enter()
  startIpClient()
   sendNetworkChangeBroadcast(DetailedState.OBTAINING_IPADDR)
   stopDhcpSetup()
   mIpClient.startProvisioning(prov.build()) <= IpClientManager

NetworkStack:
IpClient:
 // CHECKSTYLE:OFF IndentationCheck
        addState(mStoppedState);
        addState(mStartedState);
            addState(mPreconnectingState, mStartedState);
            addState(mClearingIpAddressesState, mStartedState);
            addState(mRunningState, mStartedState);
        addState(mStoppingState);
        // CHECKSTYLE:ON IndentationCheck

        setInitialState(mStoppedState);

IpClient.startProvisioning()
 sendMessage(CMD_START, new android.net.shared.ProvisioningConfiguration(req))

IpClient$StoppedState:
 enter()
  stopAllIP()
  resetLinkProperties()
 CMD_START
  transitionTo(mClearingIpAddressesState)

IpClient$ClearingIpAddressesState:
 enter()
   deferMessage(obtainMessage(CMD_ADDRESSES_CLEARED))
   CMD_ADDRESSES_CLEARED
    transitionTo(mRunningState)

IpClient$RunningState:
 enter()
  mPacketTracker = createPacketTracker()
  mPacketTracker.start(mConfiguration.mDisplayName)
  startIPv6()
  startIPv4()
  applyInitialConfig(config)
  startIpReachabilityMonitor()

IpClient.startIPv4():
 startDhcpClient() // Start DHCPv4
  mDhcpClient = mDependencies.makeDhcpClient(mContext, IpClient.this, mInterfaceParams,mDependencies.getDhcpClientDependencies(mIpMemoryStore, mIpProvisioningMetrics))
  mDhcpClient.registerForPreDhcpNotification()
  mDhcpClient.sendMessage(DhcpClient.CMD_START_DHCP, new DhcpClient.Configuration(mL2Key, isUsingPreconnection()))

DhcpClient:
        // CHECKSTYLE:OFF IndentationCheck
        addState(mStoppedState);
        addState(mDhcpState);
            addState(mDhcpInitState, mDhcpState);
            addState(mWaitBeforeStartState, mDhcpState);
            addState(mWaitBeforeObtainingConfigurationState, mDhcpState);
            addState(mDhcpPreconnectingState, mDhcpState);
            addState(mObtainingConfigurationState, mDhcpState);
            addState(mDhcpSelectingState, mDhcpState);
            addState(mDhcpRequestingState, mDhcpState);
            addState(mIpAddressConflictDetectingState, mDhcpState);
            addState(mDhcpHaveLeaseState, mDhcpState);
                addState(mConfiguringInterfaceState, mDhcpHaveLeaseState);
                addState(mDhcpBoundState, mDhcpHaveLeaseState);
                addState(mWaitBeforeRenewalState, mDhcpHaveLeaseState);
                addState(mDhcpRenewingState, mDhcpHaveLeaseState);
                addState(mDhcpRebindingState, mDhcpHaveLeaseState);
                addState(mDhcpDecliningState, mDhcpHaveLeaseState);
            addState(mDhcpInitRebootState, mDhcpState);
            addState(mDhcpRebootingState, mDhcpState);
        // CHECKSTYLE:ON IndentationCheck

DhcpClient$StoppedState:
 CMD_START_DHCP
  startInitRebootOrInit()
   preDhcpTransitionTo(mWaitBeforeStartState, mDhcpInitState)
    transitionTo(mWaitBeforeStartState)
     DhcpState.enter()
      clearDhcpState()
      initInterface() && initUdpSocket()
      mDhcpPacketHandler = new DhcpPacketHandler(getHandler())
      mDhcpPacketHandler.start()
       WaitBeforeOtherState.enter()
        mController.sendMessage(CMD_PRE_DHCP_ACTION)  => IpClient => ClientModeImpl$IpClientCallbacksImpl
         transitionTo(mDhcpInitState)
          DhcpInitState.enter()
           PacketRetransmittingState.enter()
            sendMessage(CMD_KICK)
             CMD_KICK
              DhcpInitState.sendPacket()
               sendDiscoverPacket()
                transmitPacket(packet, "DHCPDISCOVER", DhcpPacket.ENCAP_L2, INADDR_BROADCAST)
              scheduleKick()
           startNewTransaction()

mDhcpPacketHandler.transmitPacket(buf, mInterfaceBroadcastAddr)
DhcpPacketHandler.handlePacket() <= receive packet
 sendMessage(CMD_RECEIVED_PACKET, packet)
  PacketRetransmittingState.CMD_RECEIVED_PACKET
   DhcpInitState.receivePacket(packet)
    receiveOfferOrAckPacket(packet, isDhcpRapidCommitEnabled())
     packet instanceof DhcpOfferPacket
      transitionTo(mDhcpRequestingState)
       PacketRetransmittingState.enter()
        sendMessage(CMD_KICK)
         CMD_KICK
          DhcpRequestingState.sendPacket()
           sendRequestPacket()
     packet instanceof DhcpAckPacket
      confirmDhcpLease(packet, results)
      transitionTo(isDhcpIpConflictDetectEnabled() ? mIpAddressConflictDetectingState : mConfiguringInterfaceState)
transitionTo(mConfiguringInterfaceState)
 ConfiguringInterfaceState.enter()
   notifySuccess()
  mController.sendMessage(CMD_CONFIGURE_LINKADDRESS, mDhcpLease.ipAddress) => IpClient$RunningState
   mInterfaceCtrl.setIPv4Address(ipAddress)
    mDhcpClient.sendMessage(DhcpClient.EVENT_LINKADDRESS_CONFIGURED)
     ConfiguringInterfaceState.EVENT_LINKADDRESS_CONFIGURED
      transitionTo(mDhcpBoundState)
       DhcpBoundState.enter()
        connectUdpSock(mDhcpLease.serverAddress)
        scheduleLeaseTimers()
        logTimeToBoundState()

InterfaceController.setIPv4Address(ipAddress)
 setInterfaceConfiguration(address, null)
   mNetd.interfaceSetCfg(ifConfig)

这里简单记录一下Wi-Fi DHCP过程,后面有空再扩展。


# 总结 以上就是今天要讲的内容,本文仅仅简单介绍了Wi-Fi DHCP的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值