当前位置: 首页 > news >正文

《TCP IP 详解卷1:协议》阅读笔记 - 第六章

阅读须知:笔记为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点,其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别(基本差别不大,参考的资料属RFC官方文档)。

 

第六章:系统配置:DHCP和自动配置

动态主机配置协议(DHCP),一个局域网的网络协议,使用UDP协议工作,用于局域网中集中管理、分配IP地址。

DHCP介绍

DHCP有两个主要部分组成:地址管理和配置数据交付。地址管理用于IP地址的动态分配,并为客户机提供地址租用。配置数据交付包括DHCP协议的消息格式和状态机。

DHCP服务器决定IP分配方式:自动分配、动态分配和手动分配。

  1. 最常用方法是动态分配,客户机从服务器配置的地址池(通常为一个预定义的范围)中获得一个可撤销的IP地址。

  2. 自动分配使用的是相同方法,但地址不可撤销。

  3. 在手动分配中,DHCP协议用于传输地址,但地址对于请求的客户机是不变的(即它不是由服务器维护的可分配池的一部分)。

DHCP客户端指的是支持DHCP协议的网络设备上的指定端口,通过该端口与DHCP服务器交互获取配置信息。三者之间的差异是地址分配是否基于客户机的身份,以及该地址是否可撤销或变更。

在上面提到的动态分配方式中,DHCP客户端请求分配一个IP地址,服务器从可用的地址池中选择一个地址作为响应。通常情况下这个地址池是专门为DHCP用途分配的一个连续的IP地址范围。分配给客户机的地址只在一段特定时间内有效,这段时间称为租用期。常见的租用期默认值包括12~24小时,取决于使用的DHCP服务器。微软建议较小网络采用8天,较大网络采用16~24小时,取决于使用的DHCP服务器。微软建议较小网络采用8天,较大网络采用16天。

DHCP消息格式

DHCP的前身是BOOTP,它是在BOOTP上做了扩展,以保持两种协议之间的兼容性。一个DHCP(或者可以说是BOOTP)消息格式如下图所示:

Op(操作字段)标识消息是请求(1)还是应答(2);

HW类型字段分配基于ARP使用的值,并定义在相应的IANA ARP参数页中[IARP],最常见的值为1(以太网);

HW长度字段用于存放硬件(MAC)地址,对于类似以太网的网络,值通常为6;

跳步数字段用于保存消息传输过程中的中继次数,发送方将该值设为0,每次中继时加1;

事务ID有客户机选择,为一个随机数,用于将应答和请求匹配;

秒数字段由客户机设置,是第一次尝试申请或重新申请地址经过的秒数;

标志字段当前只包含一个经过定义的位,称为广播标志;

客户机IP地址包含请求者的IP地址(如果已知),否则为0;

"你的"IP地址有服务器填写,向请求者提供服务器地址;

下一服务器IP地址给出下一个服务器的地址,用以客户机的引导过程;

网关中继IP地址有DHCP或BOOTP中继器填写,它们在转发消息时返回自己的地址;

客户机硬件地址保存客户机的硬件地址(唯一标识);

服务器名和引导文件名可选,表示服务器名称或启动文件路径;

选项字段是BOOTP中的供应商扩展字段,现在用以区分DHCP消息与传统BOOTP消息,选项通常提供相对简单的配置信息,或者支持一些其他协商协议。

常见选项包括填充(0)、子网掩码(1)、路由器地址(3)、域名服务器(6)、域名(15)、请求的IP地址(50)、地址租用期(51)、DHCP消息类型(53)、服务器标识符(54)等等...就不都举例了...

DHCP协议的地址分配过程

当一台新的客户机连接到网络的时候,它首先发现可用的DHCP服务器以及它们能够提供地址。然后它决定使用哪台服务器和哪个地址,并向提供该地址的服务器发送请求(同时将其他选择通知所有服务器)。除非服务器在此期间已将该地址分配出去,否则它通过确认将地址分配给请求的客户机。

如下图,一次典型的DHCP交换:

过程解析:

  1. 客户机连接网络,向网络广播一个DHCPDISCOVER消息;

  2. DHCP服务器接收到消息,响应一个DHCPOFFER消息,并在"你的"IP地址字段填写提供的IP地址,且提供租用时间、更新时间、重新绑定时间等信息;

  3. 客户机接收到来自一台或多台DHCP服务器的响应,确定自己想要哪个DHCPOFFER,并广播一个包含服务器标识符选项的DHCPREQUEST消息,请求的IP地址选项设置为客户机选择使用的IP地址;

  4. 多台DHCP服务器可能收到广播的DHCPREQUEST消息,但只有DHCPREQUEST消息标识的服务器同意将该地址进行绑定,其他服务器则清除与该请求相关的状态,然后标识的服务器响应给客户机:1.发送一个DHCPACK消息,可以使用该地址;2.无法分配该地址,发送一个DHCPNAK消息;

  5. 客户端接到DHCPACK消息后进行配置,并探测网络来确定地址未被使用。如果探测到无冲突,则直接使用;如果探测到冲突...客户机舍弃该地址,向服务器发送一个DHCPDECLINE消息来通知该地址不能使用,经过默认10秒延时后客户机重新从第1步开始操作;

DHCP协议在客户机和服务器中运行一个状态机。状态用于指出协议下一个处理的消息类型:

在简单的网络中,一个DHCP服务器可供同一个局域网中的客户机使用,但在更复杂的网络中,可通过一个或更多的DHCP中继代理来中继DHCP流量将DHCP操作扩展到跨越多个网段。

无状态地址自动配置

所谓的无状态地址自动配置,指的是一台主机基本不需要协助就可以决定自己的地址。

IPv4的无状态地址自动配置

一台主机,没有任何手工配置的地址,所在网络也没有DHCP服务器,那么基于IP的通信是不可能的。[RFC3927]描述了一种机制,主机通过该机制可自动从链路本地范围169.254.1.1至169.254.254.254使用16位子网掩码255.255.0.0生成自己的IPv4地址,该方法称为链路本地地址的动态配置或者自动专用IP寻址(APIPA)。除非服务器在此期间已将该地址分配出去,否则它通过确认将地址分配给请求的客户机。其本质是一台主机从一个范围中随机选择一个地址并检测(IPv4 ACD)该地址在本子网中是否被使用。

IPv6的无状态地址自动配置

[RFC4862]中描述的IPv6 SLAAC的目标是允许节点自动(和自主)分配链路本地IPv6地址。步骤如下:

  1. 主机配置链路本地地址;

  2. 主机检查地址是否唯一,即主机对(暂时)地址执行重复地址检测(DAD);

  3. 在接收路由器通告(RA)后,主机为接收的路由器通告中的每个前缀配置一个或多个暂时IPv6地址;

  4. 主机检查地址是否唯一,即对暂时地址执行DAD;

  5. 如果地址是唯一的,它通常会成为"首选"地址,可以积极用于网络通信。

首选地址涉及到IPv6地址生命周期:

IPv6 DAD(IPv6重复地址检测)使用ICMPv6邻居请求和邻居通告消息以确定一个特定的IPv6地址是否在连接链路上使用。

DAD执行步骤如下:

  1. 一个节点首先加入临时地址的所有节点组播地址和请求节点组播地址;

  2. 为了检查使用的地址是否重复,一个节点发送一个或多个ICMPv6邻居请求消息;

  3. 这些消息的源和目的IPv6地址分别是未指定地址和被检查目的地址的请求节点地址,目的地址字段设置为被检查的地址(临时地址);

  4. 如果在响应中接收到一个邻居通告消息则说明DAD失败,并放弃被检查的地址。 

DHCP与DNS交互

当一台DHCP客户机获得一个IP地址时,它接收的配置信息的重要部分是一台DNS服务器的IP地址。它允许客户机系统将DNS名称转换为IPv4和/或IPv6地址,该地址是进行传输层连接时协议实现所需要的。 

组合DNS/DHCP服务器是一个服务器程序,它可配置为提供IP地址租约以及其他信息,也可读取一个DHCPREQUEST中的客户机标识符或域名,并在使用DHCPACK进行响应之前,通过"名称到地址"的绑定更新内部DNS数据库。这样,由DHCP客户机或与相同DNS服务器交互的其他系统发起的任何后续DNS请求就能够在名称和新分配的IP地址之间转换了。

 

相关文章:

  • 继承中代码执行顺序
  • 遍历日志文件并打印
  • Spartan6系列之器件引脚功能详述
  • 菠萝大象--sping
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 深入jQuery Mobile
  • java B2B2C源码电子商务平台 -kafka架构介绍
  • 程序员10大职业生存技巧(转载)
  • 如何打造一流的查询引擎,构建优秀的数据仓库?
  • gzip原理小透明 | Web高能短文系列
  • 安卓学习-界面-ui-AdapterViewFlipper和StackView
  • Android之父下的作品Essential Phone停产,接下来呢?
  • 动态规划以及在leetcode中的应用
  • canvas绘制圆角头像
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [ JavaScript ] 数据结构与算法 —— 链表
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker容器管理
  • gcc介绍及安装
  • HTTP中的ETag在移动客户端的应用
  • JavaScript设计模式与开发实践系列之策略模式
  • mockjs让前端开发独立于后端
  • Vue2 SSR 的优化之旅
  • 工作手记之html2canvas使用概述
  • 前端学习笔记之观察者模式
  • 一份游戏开发学习路线
  • 再谈express与koa的对比
  • 正则与JS中的正则
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​flutter 代码混淆
  • #android不同版本废弃api,新api。
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)fread与fwrite详解
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (第27天)Oracle 数据泵转换分区表
  • (九)One-Wire总线-DS18B20
  • (理论篇)httpmoudle和httphandler一览
  • (转)winform之ListView
  • .bat批处理出现中文乱码的情况
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 事件模型教程(二)
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET框架
  • @DataRedisTest测试redis从未如此丝滑
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [ linux ] linux 命令英文全称及解释
  • [ 第一章] JavaScript 简史
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [1204 寻找子串位置] 解题报告
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [C#]扩展方法
  • [C]整形提升(转载)