前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Mongodb多键索引之数组

Mongodb多键索引之数组

作者头像
徐靖
发布于 2020-08-18 06:19:28
发布于 2020-08-18 06:19:28
1.8K00
代码可运行
举报
文章被收录于专栏:DB说DB说
运行总次数:0
代码可运行

【背景】

最近有项目需求用到多键索引,Mongodb中字段值支持多键索引主要包括嵌套文档、数组以及数组嵌套文档.例如联系包括手机、固定电话、邮箱、微信、QQ等,对于字段值存储类型不一样,决定创建多键索引也不一样同时性能也存在差异,例如数组值(包括数组以及数组文档),创建多键索引时会为数组中每个元素都创建索引键,如数组中元素特别多,相应索引也会特别大,创建多键索引或者组合索引时最多只支持一个数组值.

嵌套文档:“telephone”:{"cellphone":"0211234567","mobilephone":13888888888}

数组:“telephone”:["0211234567",13888888888]

数组文档:“联系”:[“telephone”:{"cellphone":"0211234567","mobilephone":13888888888}]

【数组值创建并高效使用索引】

1、集合中文档信息

备注:ratings字段值是数组.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xiaoxu:PRIMARY> db.survey.findOne({});
{
  "_id" : ObjectId("5f2ff576eb7de181ebe814f9"),
  "item" : {
    "name" : "Katie",
    "manufactured" : 16
  },
  "ratings" : [
    16,
    116
  ],
  "user_id" : 16,
  "boolean" : true,
  "added_at" : ISODate("2020-08-09T13:09:10.791Z"),
  "number" : 662
}
xiaoxu:PRIMARY>

2、创建多键索引 db.survey.createIndex({"ratings":1},{background:1});

备注:创建多键索引不需要显示关键字,如字段值中包括数组值或者嵌套文档情况,这个存储引擎自动创建为多键盘索引,如4.2版本之前不加background:1,则前台创建索引,加DB级别排他锁(大表后果很严重),4.2开始加不加background:1都是online创建索引.

3、范围查找ratings

逻辑:

1、查询ratings数组中存在至少1个元素同时满足大于等于3且小于等于6【类似and逻辑 ,此时多键索引边界可以合并为【【3,6】】】--

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $elemMatch: { $gte: 3, $lte: 6}}} )

2、查询ratings数组中存在至少1个元素大于等于3且至少1元素小于等于6或者存在一个元素同时满足大于等于3且小于等于6【类似or逻辑,【【3,+∞】】or【【-∞,6】】,此时执行计划只有使用or的一边,使用大于等于3然后过来另外一个值是否满足小于等于6或者反过来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $gte: 3, $lte: 6} )  

【具体执行计划】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:{ $elemMatch: { $gte: 3, $lte: 6}}} )
xiaoxu:PRIMARY> db.survey.find( { ratings : { $elemMatch: { $gte: 3, $lte: 6 } } } ).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 4,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 4,
  "totalDocsExamined" : 4,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$elemMatch" : {
          "$lte" : 6,
          "$gte" : 3
        }
      }
    },
    "nReturned" : 4,
    "executionTimeMillisEstimate" : 0,
    "works" : 5,
    "advanced" : 4,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 4,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 4,
      "executionTimeMillisEstimate" : 0,
      "works" : 5,
      "advanced" : 4,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[3.0, 6.0]"
        ]
      },
      "keysExamined" : 4,
      "seeks" : 1,
      "dupsTested" : 4,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}

db.survey.find({ ratings:{ $gte: 3, $lte: 6} )  
xiaoxu:PRIMARY> db.survey.find( { ratings :  { $gte: 3, $lte: 6 }  } ).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 7,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 7,
  "totalDocsExamined" : 7,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$gte" : 3
      }
    },
    "nReturned" : 7,
    "executionTimeMillisEstimate" : 0,
    "works" : 9,
    "advanced" : 7,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 7,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 7,
      "executionTimeMillisEstimate" : 0,
      "works" : 8,
      "advanced" : 7,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[-inf.0, 6.0]"
        ]
      },
      "keysExamined" : 7,
      "seeks" : 1,
      "dupsTested" : 7,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
xiaoxu:PRIMARY>

4、等值查询ratings

逻辑:

1、查询数组值完全匹配100,200 2个元素且顺序是相同

备注:先匹配数组内任何元素满足100,然后返回文档判断是否满足整个数组,

如果100值特别多,100存在超过80%,最终结果集只有1个,那么回集合过滤匹配效果特别差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:[100,200]}) 
备注:keysExamined=12,实际上等于100只有11个,多扫描一个索引key没有搞定
清楚
xiaoxu:PRIMARY> db.survey.find({ratings:100}).count()
11
xiaoxu:PRIMARY> db.survey.find({ratings:[100,200]}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 5,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 12,
  "totalDocsExamined" : 11,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$eq" : [
          100,
          200
        ]
      }
    },
    "nReturned" : 5,
    "executionTimeMillisEstimate" : 0,
    "works" : 13,
    "advanced" : 5,
    "needTime" : 7,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 11,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 11,
      "executionTimeMillisEstimate" : 0,
      "works" : 13,
      "advanced" : 11,
      "needTime" : 1,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[100.0, 100.0]",
          "[[ 100.0, 200.0 ], [ 100.0, 200.0 ]]"
        ]
      },
      "keysExamined" : 12,
      "seeks" : 2,
      "dupsTested" : 11,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
如不需要考虑顺序,使用$all操作符
db.survey.find({ ratings:{$all:[100,200]}}) 
这个执行只需要判断另外一个元素是否等于200.而不是整合数组匹配,扫描刚好是11
个索引key
xiaoxu:PRIMARY> db.survey.find({ratings:{$all:[100,200]}}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 5,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 11,
  "totalDocsExamined" : 11,
  "executionStages" : {
    "stage" : "FETCH",
    "filter" : {
      "ratings" : {
        "$eq" : 200
      }
    },

2、查询数组中至少一个元素等于100,效率还可以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ ratings:100}) 
xiaoxu:PRIMARY> db.survey.find({ratings:100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 2,
  "executionTimeMillis" : 0,
  "totalKeysExamined" : 2,
  "totalDocsExamined" : 2,
  "executionStages" : {
    "stage" : "FETCH",
    "nReturned" : 2,
    "executionTimeMillisEstimate" : 0,
    "works" : 3,
    "advanced" : 2,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 2,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 2,
      "executionTimeMillisEstimate" : 0,
      "works" : 3,
      "advanced" : 2,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings" : 1
      },
      "indexName" : "ratings_1",
      "isMultiKey" : true,
      "multiKeyPaths" : {
        "ratings" : [
          "ratings"
        ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings" : [
          "[100.0, 100.0]"
        ]
      },
      "keysExamined" : 2,
      "seeks" : 1,
      "dupsTested" : 2,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}

5、通过数组长度查询数据

逻辑:

查询数组长度为1的对象,注意这个$size无法使用索引都是collscan.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.survey.find({ratings:{$size:1}})
xiaoxu:PRIMARY> db.survey.find({ratings:{$size:1}}).
explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 0,
  "executionTimeMillis" : 718,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings" : {
        "$size" : 1
      }
    },
    "nReturned" : 0,
    "executionTimeMillisEstimate" : 621,
    "works" : 1000021,
    "advanced" : 0,
    "needTime" : 1000020,
    "needYield" : 0,
    "saveState" : 7813,
    "restoreState" : 7813,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY>

6、通过数组索引位置来查询数据

逻辑:

1、数组索引位置从0开始,当对数组创建索引时,使用索引位置查询时,是无法使用多键索引,必须创建单独索引,例如第二个元素位置, db.survey.createIndex({"ratings.1":1}).其他位置以此内推方式创建索引.

2、创建数组索引还是按照数组索引位置创建索引,根据业务实际需求,做到创建索引能够提升效率,而不是创建低效或者无用索引。

3、查询单个元素,此时索引则不是多键索引,就是单个标量值,标量表示是字符串或者数字,而不是数组或者嵌套文档.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xiaoxu:PRIMARY> db.survey.find({"ratings.0":100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 10,
  "executionTimeMillis" : 498,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings.0" : {
        "$eq" : 100
      }
    },
    "nReturned" : 10,
    "executionTimeMillisEstimate" : 450,
    "works" : 1000021,
    "advanced" : 10,
    "needTime" : 1000010,
    "needYield" : 0,
    "saveState" : 7812,
    "restoreState" : 7812,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY> 
xiaoxu:PRIMARY> db.survey.find({"ratings.1":100}).
explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 1,
  "executionTimeMillis" : 505,
  "totalKeysExamined" : 0,
  "totalDocsExamined" : 1000019,
  "executionStages" : {
    "stage" : "COLLSCAN",
    "filter" : {
      "ratings.1" : {
        "$eq" : 100
      }
    },
    "nReturned" : 1,
    "executionTimeMillisEstimate" : 410,
    "works" : 1000021,
    "advanced" : 1,
    "needTime" : 1000019,
    "needYield" : 0,
    "saveState" : 7812,
    "restoreState" : 7812,
    "isEOF" : 1,
    "invalidates" : 0,
    "direction" : "forward",
    "docsExamined" : 1000019
  }
}
xiaoxu:PRIMARY> db.survey.createIndex({"ratings.1":1})
{
  "createdCollectionAutomatically" : false,
  "numIndexesBefore" : 5,
  "numIndexesAfter" : 6,
  "ok" : 1
}
xiaoxu:PRIMARY> db.survey.find({"ratings.1":100}).explain("executionStats").executionStats;
{
  "executionSuccess" : true,
  "nReturned" : 1,
  "executionTimeMillis" : 1,
  "totalKeysExamined" : 1,
  "totalDocsExamined" : 1,
  "executionStages" : {
    "stage" : "FETCH",
    "nReturned" : 1,
    "executionTimeMillisEstimate" : 0,
    "works" : 2,
    "advanced" : 1,
    "needTime" : 0,
    "needYield" : 0,
    "saveState" : 0,
    "restoreState" : 0,
    "isEOF" : 1,
    "invalidates" : 0,
    "docsExamined" : 1,
    "alreadyHasObj" : 0,
    "inputStage" : {
      "stage" : "IXSCAN",
      "nReturned" : 1,
      "executionTimeMillisEstimate" : 0,
      "works" : 2,
      "advanced" : 1,
      "needTime" : 0,
      "needYield" : 0,
      "saveState" : 0,
      "restoreState" : 0,
      "isEOF" : 1,
      "invalidates" : 0,
      "keyPattern" : {
        "ratings.1" : 1
      },
      "indexName" : "ratings.1_1",
      "isMultiKey" : false,
      "multiKeyPaths" : {
        "ratings.1" : [ ]
      },
      "isUnique" : false,
      "isSparse" : false,
      "isPartial" : false,
      "indexVersion" : 2,
      "direction" : "forward",
      "indexBounds" : {
        "ratings.1" : [
          "[100.0, 100.0]"
        ]
      },
      "keysExamined" : 1,
      "seeks" : 1,
      "dupsTested" : 0,
      "dupsDropped" : 0,
      "seenInvalidated" : 0
    }
  }
}
  • 【总结】

本次主要介绍数组多键索引,还包括数组嵌套文档、嵌套文档等多键索引,本次内容主要来自官方文档,主要补充执行计划等信息,并没有深入研究,只是作为入门学习了解,希望对大家有帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 udapp 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
dhcp option 82 接入交换机_dhcpoption怎么配置
在该场景下,临时接入者可以在不安装认证客户端的情况下,直接访问Internet资源,但是不能访问学校、企业、政府单位的内网,适用于各种会务、学术交流、临时参观等应用场景,正式员工可以在会议区通过认证接入到内网。为了实现该场景,我们首先要对神州数码网络交换机产品的DHCP Option82功能进行描述。
全栈程序员站长
2022/11/03
9880
dhcp option 82 接入交换机_dhcpoption怎么配置
DHCP option82_dhcp中继配置命令
option 82是dhcp报文中的中继代理信息选项(relay agent information option)。当dhcp client发送请求报文到dhcp server时,若需要经过dhcp中继,则由dhcp中继将option 82添加到请求报文中。option 82包含很多sub-option,本文中的option 82只支持sub-option 1、sub-option 2和sub-option 5。sub-option 1中定义了代理电路id(即circuit id),sub-option 2中定义了代理远程id(即 remote id),sub-option 5为链路选择(link selection)子项,该选项中包含了dhcp中继添加的ip地址。
全栈程序员站长
2022/09/27
3K0
使能DHCP Relay_option键的作用
DHCP一家子(不包括DHCPv6)包括DHCP Client、DHCP Server、DHCP Relay以及DHCP Snooping,之后我会一个个详细学习之后发出来。今天讲述一下DHCP relay,之前先学习的DHCP Sever,还没来得及整理,之后会发出来,今天先说说DHCP Relay。
全栈程序员站长
2022/11/03
5280
使能DHCP Relay_option键的作用
learning vpp:dhcp relay功能(1)
在文章《vpp dhcp配置》中,介绍在dhcp client在vpp中实现原理,其中提到下面命令行是HDCP中继相关配置。
dpdk-vpp源码解读
2024/11/23
1770
learning vpp:dhcp relay功能(1)
dhcp snooping option 82_dhcpsnooping的原理配置案例
架设DHCP服务器可以为客户端自动分配IP地址、掩码、默认网关、DNS服务器等网络参数,简化了网络配置,提高了管理效率。但在DHCP服务的管理上存在一些问题,常见的有:
全栈程序员站长
2022/11/03
9690
DHCP协议浅析
定义:动态主机配置协议,主要在一些大型局域网络环境中,集中管理和分配IP地址,提升地址的使用效率。
全栈程序员站长
2022/08/25
1.5K0
DHCP协议浅析
DHCP协议详解
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。
全栈程序员站长
2022/08/25
1.6K0
DHCP协议详解
教你动手写UDP协议栈-DHCP数据包解析<2>
DHCP报文属于UDP报文,DHCP协议包含在UDP协议栈的用户数据部分。如下图红框部分:
Rice加饭
2022/05/10
1K1
教你动手写UDP协议栈-DHCP数据包解析<2>
计算机网络——DHCP协议详解
大家好,又见面了,我是你们的朋友全栈君。 本文将针对以下问题逐条进行解答:
全栈程序员站长
2022/08/25
1.5K0
计算机网络——DHCP协议详解
动态主机配置协议DHCP
分配给客户的IP是临时的,DHCP客户只能在有限的时间内使用该IP,这段时间称为租用期 租用期的数值应由DHCP服务器决定(默认1小时),DHCP客户也可在自己发送的报文中提出对租用期的要求。 当租期到了的时候,服务器可以把这个IP地址分配给别的主机使用。
十二惊惶
2024/02/28
1800
动态主机配置协议DHCP
DHCP协议原理及应用[通俗易懂]
DHCP: 动态主机配置协议   TCP/IP协议想要运行正常的话,网络中的主机和路由器不可避免地需要配置一些信息(如接口的IP地址等)。有了这些配置信息主机/路由器才能提供/使用特定的网络服务。   主机信息的必要元素有:IP地址、子网掩码、DNS服务器IP地址   TCP/IP协议配置主机信息主要有三种方法: 1. 手动配置 2. 动态获取 3. 根据特定算法计算。   在网络中,我们把主机分为两大类,服务器主机和客户端主机, + 服务器主机: 一般采用手动配置 + 客户端主机: 一般采用动态获取   服务器一般采用手动配置,而客户端一般动态获取。主要基于以下原因: 1. 客户主机比服务主机移动更频繁 2. 服务主机需要提供更可靠的服务,其配置信息应该减少对其他系统/主机的依赖 3. 客户主机比服务主机的数量要多得多。 4. 客户主机使用者的网络配置知识比服务主机的使用者低
全栈程序员站长
2022/08/25
1.4K0
DHCP协议原理及应用[通俗易懂]
DHCP协议解析
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务器的IP地址等TCP/IP参数。了解DHCP工作过程可以帮助我们排除有关DHCP服务遇到的问题。DHCP 协议是基于UDP层之上的应用,本文结合抓报所得数据分析DHCP协议实现原理
全栈程序员站长
2022/08/31
9680
计算机网络学习29:应用层、DHCP、DNS、FTP、HTTP、电子邮件
如果网络中的主机数量比较多,那么就容易配置出错。添加DHCP服务器,那么网络中的主机开机之后只需要自动启动DHCP,那么就会向DHCP服务器请求自己的网络配置信息。
程序员洲洲
2024/06/07
1550
计算机网络学习29:应用层、DHCP、DNS、FTP、HTTP、电子邮件
ensp实验DHCP配置与原理[通俗易懂]
为了获取IP地址等配置信息,DHCP客户端需要和DHCP服务器进行报文交互。 首先,DHCP客户端发送DHCP发现报文来发现DHCP服务器。DHCP服务器会选取一个未分配的IP地址,向DHCP客户端发送DHCP提供报文。此报文中包含分配给客户端的IP地址和其他配置信息。如果存在多个DHCP服务器,每个DHCP服务器都会响应。 如果有多个DHCP服务器向DHCP客户端发送DHCP提供报文,DHCP客户端将会选择收到的第一个DHCP提供报文,然后发送DHCP请求报文,报文中包含请求的IP地址。收到DHCP请求报文后,提供该IP地址的DHCP服务器会向DHCP客户端发送一个DHCP确认报文,包含提供的IP地址和其他配置信息。DHCP客户端收到DHCP确认报文后,会发送免费ARP报文,检查网络中是否有其他主机使用分配的IP地址。如果指定时间内没有收到ARP应答,DHCP客户端会使用这个IP地址。如果有主机使用该IP地址,DHCP客户端会向DHCP服务器发送DHCP拒绝报文,通知服务器该IP地址已被占用。然后DHCP客户端会向服务器重新申请一个IP地址。
全栈程序员站长
2022/07/23
1.3K0
ensp实验DHCP配置与原理[通俗易懂]
vpp dhcp配置
DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client)。DHCP通常被用于局域网环境,主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。简单来说,DHCP就是一个不需要账号密码登录的、自动给内网机器分配IP地址等信息的协议。 关于DHCP业务的具体流程,可以参考公众号《Linux云计算网络》文章的介绍,文章很详细的介绍了DHCP的业务流程。本文以vpp 20.1版本dhcp处理逻辑来说明:
dpdk-vpp源码解读
2023/03/07
1.5K0
vpp dhcp配置
解密网络通信的关键技术(下):DNS、ARP、DHCP和NAT,你了解多少?
在上一章中,我们详细介绍了域名系统(DNS)和地址解析协议(ARP)的工作原理,从而对域名解析和介质访问控制(MAC)地址寻址有了更深入的了解。在今天的章节中,我们将继续探讨动态主机配置协议(DHCP)和网络地址转换(NAT)技术,以便更好地理解IP地址的动态分配和解决IPv4地址枯竭问题的NAT技术的引入。
努力的小雨
2023/11/28
5790
Wireshark实战分析之DHCP协议(二)
      op:  报文的操作类型。分为请求报文和响应报文。1:为请求报文,2为响应报文
DragonKingZhu
2022/05/08
8160
Wireshark实战分析之DHCP协议(二)
Linux中DHCP的服务配置_linux配置ip地址命令
DHCP: Dynamic Host Configuration Protocol
全栈程序员站长
2022/11/17
16.7K0
Linux中DHCP的服务配置_linux配置ip地址命令
计算机网络:第6章 应用层
如下图所示,右边橙色的主机是无法自动获取到IP地址的,因为当主机发送DHCP请求报文时,中间的路由器是不会转发该报文的,而是直接丢弃。解决办法是在路由器中配置DHCP服务器的IP地址使得该路由器成为DHCP的中继代理。
Here_SDUT
2022/09/19
5330
计算机网络:第6章 应用层
【愚公系列】2021年12月 网络工程-路由器上配置DHCP中继
DHCPRelay(DHCPR)DHCP中继(也叫做DHCP中继代理)是一个小程序,其可以实现在不同子网和物理网段之间处理和转发dhcp信息的功能。
愚公搬代码
2022/12/01
3450
相关推荐
dhcp option 82 接入交换机_dhcpoption怎么配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验