第八章 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的过程。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Re:计算机网络  应用层 诸多协议 实验环境搭建  DNS、DHCP、HTTP、FTP、Telnet、RDP、STMP、POP3、IMAP======================# 应用层 诸多协议 域名系统 DNS 动态主机配置协议 DHCP 超级文本传输协议 HTTP 文件传输协议 FTP Telnet 协议和 RDP(远程桌面协议) 发送电子邮件的协议 SMTP  接收电子邮件的协议 POP3 和 IMAP # 什么是域名 整个Internet网站和各种服务器数量众多,各个组织的服务器都需要给一个名称,这就很容易重名。如何确保Internet上的服务器名称在整个Internet唯一呢?这就需要Internet上有域名管理认证机构进行统一管理。如果你的公司在互联网上有一组服务器(邮件服务器、FTP服务器、Web服务器等),你需要为你的公司先申请一个域名,也就是向管理认证机构注册一个域名。 域名的注册遵循先申请先注册为原则,管理认证机构要确保每一个域名的注册都是独一无二、不可重复的。 # 动态主机配置协议 DHCP 静态地址和动态地址应用场景 DHCP 地址租约 DHCP 租约生成过程 DHCP 地址租约更新 # Telnet 协议 Telnet是一个简单的远程终端协议(非加密、且简单),它也是因特网的正式标准。用户使用telnet客户端就可以连接到远程运行Telnet服务的设备(可以是网络设备例如:路由器、交换机,也可以是操作系统,比如Windows或Linux等),进行远程管理。 Telnet能将用户的键盘指令传到远地主机,同时也能将远地主机的输出通过TCP连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上。因此,Telnet又称为终端仿真协议。 Telnet并不复杂,以前应用得很多。现在由于操作系统(Windows和Linux)功能越来越强,用户己较少使用Telnet了。不过配置Linux服务器和网络设备还是需要 Telnet 来实现远程管理和配置 # 远程桌面协议 RDP 现在Windows操作系统很少使用telnet进行远程管理了,更多是使用远程桌面进行远程管理。 Windows系统启用远程桌面,客户端使用远程桌面客户端(mstsc)进行连接。 它们之间使用RDP协议进行通信,RDP协议默认使用TCP的3389端口。 # http 协议、版本和网页 创建网页(准备创建网站、需要设计网页和安装Web服务器) 统一资源定位符URL 绝对路径和相对路径 创建Web站点 HTTP协议版本 HTTP请求报文和响应报文 HTTP响应报文: Cookie 通过代理服务器访问网站 # 文件传输协议 FTP FTP 是File Transfer Protocol(文件传输协议)的英文简称。用于Internet上的控制文件的双向传输。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。 在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和“上传”(Upload)。“下载”文件就是从远程主机拷贝文件至自己的计算机上;“上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。 简单地说,支持FTP协议的服务器就是FTP服务器。 # 安装和配置邮件服务器  模拟整个互联网发送邮件的过程 发送电子邮件的协议 SMTP  接收电子邮件的协议 POP3 和 IMAP--------------------------------------              

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值