来源 | 苦逼的码农

作者 | 帅地

对于我们平时上网的电脑的 ip 是如何来的呢?一种简单的方法就是我们自己来配置了


显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?

客户端请求 ip

可能很多人都知道,是通过 DHCP 服务器来获取 ip 的,那么问题来了,你要给 DHCP 服务器发报文来获取 ip,那么你知道 DHCP 服务器的 ip 是多少吗?自己客户端的源 ip 又是多少呢?现在啥也不知道,该如何发送报文呢?

为了解决这个问题,客户端会发送一个广播,我们知道,广播报文是会发送局域网内的所有其他主机的,广播的目的 ip 是 255.255.255.255,目的端口是 67,为了让别人知道它是来请求一个 ip 的,我们的客户端会把 0.0.0.0 作为自己的源 ip,源端口是 68。意在告诉别人:我现在啥也没有,急需一个 ip,哪位老铁能给我提供一个 ip。


我们把这个请求 ip 的报文称之为 discover 报文

这里提醒一些,这里发送的报文都是采用 UDP 报文,而不是 TCP 报文哈,下同。

DHCP响应

当 DHCP 服务器收到这个报文之后,一看源地址是 0.0.0.0,就知道生意来了,知道这是一个请求 ip 的报文,DHCP 服务器就会给它提供一个 ip,包括 ip 地址,子码掩码,网关,ip 的有效期等信息

有人可能会问,只有源 ip 为 0.0.0.0 的信息,我们怎么把报文发送到它的手里呢?这不,我们每台电脑不都有 Mac 地址吗?在 discover 报文中,就会包含它的 MAC 地址了,DHCP 服务器,只需要发一个广播报文就可以了,广播报文的源ip是 DHCP  服务器自己的 ip,源端口是 67,目的地址是 255.255.255.255,目的端口是 68


我们把 DHCP 提供 ip 地址的报文称之为offer报文

客户端挑选 ip 地址

我们知道,有可能不止一台 DHCP 服务器收到了 discover 请求报文,也就是说,我们的主机可能会收到多个 offer 报文,所以呢,我们的主机会选择其中一个心仪的 offer 报文来作为自己的 ip,一般是选择最先收到的 offer 报文,选择好之后,会给对应的 DHCP 服务器次发送一个 request 报文,意在告诉它,我看中了你的报文。

DHCP 收到 request 报文之后,会给它回复一个 ACK 报文,并且把这个分配出去的 ip 进行登记(例如把这个 ip 标记为已使用状态)。

当我们的主机收到 ACK 报文之后,就可以开始冲浪在网上冲浪了。


几点说明

这里可能有人会说,如果 DHCP 服务器没有在我们所在的局域网里怎么办?这个时候,这个 discover 报文 就会通过我们的网关来进行传递,并且会把源 ip 替换成网络的 ip,源端口是 68,这里涉及到 NAT 地址到转换,不懂的可以看我之前的一篇文章。

谈谈NAT:什么?全球IP和私有IP是什么鬼?

DHCP 服务器收到报文之后,就可以根据源端口 68 来判断这是一个 discover 请求报文了。就会把 offer 发给网关,网关再发给我们的主机。

租期

在DHCP客户端的租约时间到达 1/2 时,客户端会向为它分配 IP 地址的DHCP服务器发送 request 单播报文,以进行 IP 租约的更新。如果服务器判断客户端可以继续使用这个 IP 地址,就回复 ACK 报文,通知客户端更新租约成功。如果此IP地址不能再分配给客户端,则回复 NAK 报文,通知客户端续约失败。

如果客户端在租约到达 1/2 时续约失败,客户端会在租约到 7/8 时间时,广播发送 request 报文进行续约。DHCP服务器处理同首次分配 IP 地址的流程。

最后

这个过程中,涉及到听多种报文,为了篇幅不要太长,我有些报文没有详细说,这里为了方便大家查看,我把所有报文都总结了一下

报文类型 描述
Discove DHCP客户端请求地址时,会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文。
Offer DHCP服务器收到Discover报文后,会构造一个Offer报文(包括各种所需要的各种),发送给用户
Request DHCP客户端可能会收到很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器
ACK DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址
NAK 如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。
Release 当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。
Decline DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用。
Inform DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端

如果大家对计算机网络这块感兴趣的话,后续会算法和计算机网络穿插讲勒。如果有哪里说错了,欢迎指点出来!

你可能会喜欢

1、为什么你学不会递归?告别递归,谈谈我的一些经验

2、【面试被虐】游戏中的敏感词过滤是如何实现的?

3、一文读懂一台计算机是如何把数据发送给另一台计算机的

4、腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列

5、史上最全各类面试题汇总,没有之一,不接受反驳

openwrt dhcp 无法获取ip_电脑的 ip 是怎么来的呢?我又没有配置过相关推荐

  1. xp系统怎么关dhcp服务器,怎样解决Win XP操作系统DHCP故障:获取未使用的IP地址

    怎样解决Win XP操作系统DHCP故障:获取未使用的IP地址 发布时间:2011-05-12 14:57:29   作者:佚名   我要评论 在我们解决Windows 操作系统的DHCP故障时,有时 ...

  2. js获取内网/局域网ip地址,操作系统,浏览器版本等信息

    这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...

  3. DHCP自动获取IP地址的过程(自动获取ip地址的过程)

    我们电脑(或者W5500)在自动获取IP地址的过程(通过DHCP请求获取IP的过程),电脑是客户端,路由器是DHCP客户端. 1.DHCP的请求的总过程 1.1在 DHCP请求的过程中,包括 4 个主 ...

  4. 【2023亲测可用】JS 获取电脑本地IP 和 电脑网络IP(外网IP|公网IP)

    1.了解:电脑本地的IP地址(内网IP)和电脑本机在网络上的IP地址(外网IP|公网IP) 在运行窗口输入"cmd",在弹出的界面里输入"ipconfig/all&quo ...

  5. 交换机和路由器区别+自动获取和使用固定IP的区别+win10系统设置网络ip+两台电脑之间怎么互相传文件+两电脑用一根网线传数据+

    文章目录 交换机和路由器区别 1 路由器可以为局域网自动分配IP和虚拟拨号 交换机只是用来分配网络数据的 路由器在网络层,根据IP地址寻址. 路由器可以处理"TCP/IP"协议,交 ...

  6. 【转】C#获取电脑客户端IP地址及当前用户名

    在C#中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法: 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息: ...

  7. NetScaler通过DHCP服务器获取IP地址

    NetScaler通过DHCP服务器获取IP地址 DHCP 选项参考 https://www.iana.org/assignments/bootp-dhcp-parameters/bootp-dhcp ...

  8. Kali桥接模式DHCP自动获取IP失败(VMware)

    Kali桥接模式DHCP自动获取IP失败 笔者用的是VMware运行Kali Linux,突然发现桥接模式无法上网,只能使用NAT模式.身为有一点点强迫症的人来说,这就很不爽了.于是马上切换为桥接模式 ...

  9. Spring boot 获取本机的IP地址mac地址以及电脑名称!

    Spring boot 获取本机的IP地址mac地址以及电脑名称! package com.example.demo;import java.net.InetAddress;import java.n ...

最新文章

  1. 【实操】配置Telnet与SSH
  2. JavaScript对象、原型、原型链知识总结思维导图
  3. Spotify模式并非“敏捷涅磐”
  4. nzhtl1477-ただいま帰りました ( bfs )
  5. 为团委出书写:《打造社团品牌:请给我一个理由,让我记住你!》
  6. java中对象作为参数_java中对象引用,特别作为参数时候注意事项
  7. 们--加强斐波那契【递推】
  8. 太赞了!刷题PDF终于在GitHub上开源了!覆盖字节、蚂蚁、腾讯等多家大厂真题...
  9. 33 SD配置-销售凭证设置-定义销售凭证的号码范围
  10. 标准c语言与c51的区别,单片机学习笔记5-C51语言与标准C语言的比较
  11. 三维点云学习(2)上- 二叉树实现K-NN Radius-NN Search
  12. Android Studio 4.1一键生成代码Template
  13. android播放vp8透明,Androids 使用MediaCodec在TV端播放不了视频
  14. 省市区三级联动插件(v-distpicker)
  15. linux vnc共享时权限设置,用VNC实现远程桌面共享(支持Windows, Linux, ...) - 易水博客...
  16. 无线网卡代理服务器连接失败怎么办,电脑用无线网卡连不上网的解决方法
  17. MyEclipse共享项目到SVN服务器 .
  18. 苹果cms设置本地播放器 ckplayer(版本:ckplayerx)
  19. [51单片机]按键部分(软件消抖)
  20. 锐捷 linux 网卡信息失败,锐捷校园网linux有线认证图形客户端更新,解决了deepin下无反应问题...

热门文章

  1. python装饰器的通俗理解_简单理解Python装饰器
  2. 雨林木风win11 64位安全旗舰版镜像V2021.09
  3. SpringBoot使用Slf4j+Log4j2完成项目的日志记录
  4. Java –什么是瞬态字段?
  5. oracle 数据库日期定义,Oracle数据库实现日期遍历功能
  6. 如何安装mysql 匹配_学习笔记----安装MySQL
  7. python的property用法_在python中property怎样使用-百度经验
  8. centos安装mysql卡住_CentOS 6.4安装MySQL的过程中出现的bug
  9. 文件服务器 说明,文件服务器搭建说明.pdf
  10. 扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品