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

【Linux进阶之路】地址篇

文章目录

  • 一、ipv4地址
    • 1. 基本概念
    • 2. 分类
    • 3.CIDR
    • 4.特殊的ip地址
  • 二、IP协议
    • 1. 协议字段
    • 2.分片与重组
    • 3.路由
  • 三、NAT技术
    • 1.公有和私有
    • 2.NAT
    • 3.NAPT
  • 四、ARP协议
    • 1.MAC地址
    • 2.ARP
  • 五、DHCP协议
  • 六、DNS协议
  • 尾序

一、ipv4地址

1. 基本概念

  • 概念:IP地址,英文全称Internet Protocol Address,又译为网际协议地址、互联网协议地址。是网际协议中用于标识发送或接收数据报的设备的一串数字。
  • 功能:
    1. 定位并标识网络中的唯一的一台设备。
    2. 用于数据在传输时进行寻址。
  • 范围:0 ~ 42 9496 7295,最大为42亿多。
  • 表示形式:点分十进制,方便进行记忆,以下图为例:将点分十进制ip地址转换成计算机的数据。
ip地址192.168.1.1
十进制19216811
二进制1100 00001010 10000000 00010000 0001
合并
计算机中存储1100 0000 1010 1000 0000 0001 0000 000132位4字节
再转化为十进制3232235777unsigned int

总而言之,ip地址在计算机中就是一个32位的unsigned int的整数。

2. 分类

在这里插入图片描述

  • A类: 0.0.0.0 ~ 127.255.255.255
  • B类:128.0.0.0 ~ 191.255.255.255
  • C类:192.0.0.0 ~ 223.255.255.255
  • D类: 224.0.0.0 ~ 239.255.255.255
  • E类: 240.0.0.0 ~ 255.255.255.255

  • 单类地址表示的主机数:
表示范围A类B类C类
0 ~ 224 - 10 ~ 216 - 10 ~ 28 - 1
理论最大主机数1677721665536256
实际最大主机数1677721465534254

减2的原因

  1. 当主机号全为0的时候,用于表示网络序号。
  2. 当主机号全为1的时候,用于表示广播地址。

为什么要进行分类呢?

  1. 对IP地址进行严格划分,不同的网络根据需求分配不同类别的ip地址。需求大就分配A类,需求小就分配C类。
  2. 对网络进行划分,分组管理,方便路由,快速定位寻址
  3. 划分功能,A类,B类,C类是根据主机范围进行逐级递减,D类用于组播,E类待定。

对于快速定位寻址这一点,为了方便理解,这里简单的画一张图,对其进行分析:

在这里插入图片描述

  • 首先,主机1位于局域网A中,主机2位于局域网B中,局域网之间的主机无法直接进行通信,需要借助路由器进行网络转发。
  • 其次,假设主机1想要给主机2发送消息,且主机1在一个A类网络中,主机2在一个C类网络中。
  • 然后,这时主机1识别到主机2的ip地址与其不在同一个网络当中,那么就会转发到路由器A上,由其进行转发。
  • 接着,路由器A转发到广域网所在的路由器中,识别到其路由表中存在主机2所在的网段,并且由路由器C进行管理。
  • 最后,将数据转发给路由器C且识别之后就会将数据转发到其局域网内指定的主机2上。这样就实现了网络中两个主机之间的定向传输。

在整个过程中,主机1可以通过网络号识别是否位于同一个网段,如果不位于就往上传,在上传的过程中,我们淘汰了局域网A和B所在的全部主机。在实际的过程中,还可以往上再进行上传,越往上传,那么淘汰的主机数就越多,也就变向的达到了快速定位寻址的效果。因此我们可以将网络看成一个多叉树,主机就是叶子结点,路由器就是非叶子节点,两个不同网段主机间进行通信,也就是两个叶子结点之间进行路由的过程。


  • 说明:A类,B类,C类地址统称为单播地址,即一台主机到另一台主机。

广播地址用于什么?

  1. 广播地址分为本地广播和直接广播,可以向指定网络段的所有主机发送数据,通常为本地网络。
  2. 本地广播,只能用于将数据包发放到本地网络的所有主机。
  3. 直接广播,可以用于将数据包发放到不同网络的主机,但通常是被关闭的,smurf和fraggle攻击就是利用了这一点进行实施攻击的。

组播地址用于什么?

  • 组播地址用于向网络中的指定的组内的所有主机。

 从 224.0.0.0 ~ 239.255.255.255 都是组播的可用范围,其划分为以下三类:

  1. 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的。
  2. 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet 上
  3. 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效

简单总结一下:

单播广播组播
一个主机对另一个主机发送数据包一个主机向指定网络下的所有主机发送数据包一台主机向指定网络下的特定的一些主机发送数据包
一对一对所有一对特定的一些

3.CIDR

  • CIDR,全称Classless Inter-Domain Routing,无类别域间路由,用来解决ip地址分配不均的问题。

为啥会ip地址分配不均呢?

  • 首先,ip地址被严格分为三类,A类地址有160多万,B类地址有6万多台,C类地址有254台。
  • 假设,公司A有3万台主机需要接入网络,那么C类地址是不够的,B类地址又太多了。
  • 那么,这样只能分配B类地址,因此就会造成大量的浪费,从而导致IP地址分配不均。

如何解决?

  • CIDR具体使用子网掩码来进行实现。
网络类别默认子网掩码
A255.0.0.0
B255.255.0.0
C255.255.255.0

当我们能够需要一个3万多台的网络的电脑时,可以对一个B类的子网掩码设置为 255.255.128.0,即给B类地址多分配一个网络号,那么主机号就变成了15位,最多能表示32,768 台主机,因此可以解决IP地址分配不均的问题,下面我们使用图解进行举例演示。

在这里插入图片描述
如图,也就意味着子网掩码的作用就是划分网络号与主机号。在实际过程中为了表示方便,将ip地址与子网掩码一起用129.255.1.1/17的形式进行表示,「 / 」 前面表示ip地址,后面表示划分的网络号的位数,即17位网络号。

  • 注意:子网掩码只能分成两段,即前面一段连续的1和后面一段连续的0。不能出现断断续续的0和1。

4.特殊的ip地址

  • 127.0.0.1:本地回环地址,用于测试和本地通信。
  • 0.0.0.0:非特定地址,用于表示任意地址或者默认地址。
  • 255.255.255.255:受限广播地址,用于向本地网络中的所有设备广播消息。
  • 224.0.0.0~239.255.255.255: 组播地址,用于向特定的一些设备广播信息。
  • 10.x.x.x,192.168.x.x,172.16.x.x ~ 172.31.x.x :私有地址只能在局域网内进行使用。

二、IP协议

1. 协议字段

  • IPV4
    在这里插入图片描述

报头与有效载荷如何进行分离?

  • 首先,我们先截取报文的前4位版本号,判断ip报文的类型,如果是4,那么就是ipv4的地址,截取前20字节;如果不是4,则根据其协议的规定,定长截取指定的字节数,进行判断。下面以ipv4的协议字段进行分析。
  • 其次,从定长的字节数中,再截取出4位首部长度,计算出实际的报头的大小,理论范围为 [0,15],实际上要乘4,因此表示范围为 [0,60],又因为最小是20,所以表示的最终范围为 [20,60]。如果大于20字节,说明还有选项部分,继续将其截取即可。
  • 最终,截取完毕报头之后,我们成功将报文中报头与有效载荷进行了分离。

说明:

  1. 在分离之前,我们还需要检测报文是否完整,可通过16位首部检验和,进行相应的算法进行检验,具体算法,与前文讲述UDP的检验和大同小异,详见理解UDP,成为TCP。
  2. 有效载荷的大小,即字节数,可以通过16位总长度 减去 4位首部长度准确得到。

有效载荷如何向上进行分用?

8位协议的字段中,如果是UDP协议的报文,那么8位协议就为17,如果是TCP协议的报文,那么8位协议就为6,通过对协议编号,可以将有效载荷准确的向上进行分用。

协议号拓展:

  • ICMP(Internet Control Message Protocol)协议号为 1,用于在 IP 网络上发送控制消息和错误报告,用于网络诊断和错误通知。
  • IGMP(Internet Group Management Protocol)协议号为2,用于在多播网络中管理主机成员关系的协议。
  • 8位生存时间(TTL, Time To Live):指的是经过路由器转发的最大跳数,每次经过路由器转发这个跳数就会减1,直到0就将其丢弃,可以有效防止数据包在路由中成环路。

如何理解生存时间与环路?

  • 首先,路由器简单来理解就是一台配备有多张网卡的一台主机,且通常工作在网络层帮助数据包在不同的网段之间形成转发。
  • 其次,每当路由器转发一次数据到下一个网段时,我们将之称为 “一跳”,即跳出当前局域网,前往下一个网段。
  • 然后,由于每当路由器收到数据要进行转发,会检测ip报文中TTL字段是否为0,如果为0就直接丢弃,不为0,减一进行转发。
  • 最后,如果不这样设置的话,由于网络中的结构非常复杂,数据包在传递的过程中可能就会出现环路,进而导致数据报循环路由的问题。

如图:
在这里插入图片描述
这样就会有两个问题:

  1. 数据包环路在进行传递的过程中,其实在网络中就已经算是垃圾数据,因为始终到不了目的主机,可以被直接丢弃了。
  2. 由于路由器还要不断的接收网络中的新数据,可能会导致环状路由的数据越来越多,进而导致网络拥塞,即变卡现象的发生。

  • 服务类型,前提是只有网络设备支持且能识别时,设置才有意义,否则是没有意义的。
  1. 首先,从后往前数。第一位必须设置为0,第六,七,八,都被弃用,剩余的位,可以设置,但有且只能设置1位,不可能同时保证。
  2. 其次,第二位设置表示最小费用,与跳数有关。
  3. 接着,第三位设置表示最高可靠,可减少丢包。
  4. 然后,第四位设置最大吞吐量,即增大数据的转发量。
  5. 最后,第五位设置最小延迟,即最快转发。

2.分片与重组

为什么要进行分片?

  • 首先,网卡为了保证发送数据的高效和准确,规定了一次最大能够发送数据包的大小,就叫做MTU,一般设置为1500。

查看MTU的命令:

#Windows
netsh interface ipv4 show subinterfaces#Linux 
ifconfig

说明:Loopback(Windows) / lo(Linux) ,为本地环回地址,不会将数据发送到网络,因此通常MTU设置的很大。

  • 那么,网络层也就无法一次传比1500字节还大的报文,这也就表明如果网络层的报文大于1500,那么就要进行分片,即将一整个大的ip报文拆分成多个小的ip报文进行传递给下层进行发送。
  • 因此,当接收方收到这多个小的ip报文时,无法传递给上层,因此还要进行组装成原来的一整个大的ip报文,即重组。

注意:

  1. 在中间的路由转发的过程中,并不进行ip报文的重组,只在目的主机进行重组。
  2. 在目的主机网络层组装ip报文时,如果组装失败了,直接将一整个ip报文直接丢弃,并不进行重发,因此网络层不保证可靠。
  3. 如果将报文丢弃之后,如果上层是TCP,那么就会触发重传机制,进行报文的重传,进而保证可靠性。

相关的协议字段:

  • 标识,在计算机软件中,其实就是一个计数器,用来表示一整个完整的ip报文。
  • 标志,在ip报文进行分片的过程中,用于表示ip报文是否完整和分片的位置。目前只有最后两位有效,末位0表示最后一个分片,末位为1表示还有分片,次位1表示不允许分片,次位为0表示允许分片。
  • 13位片偏移,在原ip报文中相对于起始位置的偏移量,实际上×8表示实际的偏移量。

分片与组装的具体过程?

在这里插入图片描述

  1. 首先,网络层在发送报文时,识别到整个报文的字节大于1500,因此会将一个大的报文分割出几个小的报文,并标识相应的字段。
  2. 其次,接收方收到标识号为67的报文之后,就将其聚到一组,从而确保分片能够聚在一起。
  3. 然后,等收集分片完毕之后,我们可以根据原整个ip报文的偏移量进行排序,进而检测报文是否完整。
  4. 接着,如果检测到标志的次低位为1,那么不存在分片。接着可以通过偏移量为0,可以检测出开头的报文是否丢失;可以通过标志0,检测到结尾的报文是否丢失;可以通过偏移量和报文中的数据大小,检测出中间的报文是否丢失;确保报文完整。
  5. 最后,如果报文完整,那么进行组装之后,将形成的ip报文向上交付,如果报文不完整,那么直接丢弃即可。

细节:

  • 8位片偏移要求实际的原报文的偏移量必须是8的倍数,也预示着整个报文进行分割时也是按照8的倍数进行分割的。
  • 我们往下还有链路层,因此实际进行分割时还要为下层的报头预留一部分的空间,即分割之后的ip报文比MTU要小。

分片会产生哪些影响?

  1. 对于ip协议来说,分片也就是在ip报文过大时,将数据在发送方进行拆分,在接收方再组装的过程,由于一旦组装失败就要全部丢弃,所以会导致数据效率的降低,以及数据的不可靠性。
  2. 对于udp协议来说,只负责将用户传来的数据往下进行传输,不管报文的大小,况且udp不保证且无法保证可靠性,所以一旦传到网络层中的ip协议进行封装时,也就加大了分片的概率,也就坐实了udp不可靠的名声。
  3. 对于tcp协议来说,不仅负责数据的传输,还要保证可靠性,那么就要想办法减轻ip报文的分片,因此在协商通信,也就是在"三次握手"之间会协商好一个MSS(Max Segment Size),这个长度是ip报文不会进行分片的最大长度,因为双方通信设备的不同,可能会导致MSS的不同,因此要协商各自的MSS取一个较小值,进而可以达到避免分片的效果。

3.路由

  • 路由,其实就是"路径选择",即在网络中通过网络设备将信息正确的发送到目的地的方式

路由获取方式上分:

  1. 直连路由: 路由器直连网段的路由。
  2. 静态路由:人工配置的路由。
  3. 动态路由:路由器之间通过交互信息自动获取的路由。
  • 查看
# Windows:
route PRINT# Linux:
route

这里以Windows路由表进行举例:
在这里插入图片描述
接口一栏,我们需要借助网卡设备进行理解:
在这里插入图片描述
查看网卡配置:

#Windows
ipconfig
  • 首先,这里的网卡的ip地址就是,路由表里的接口,在进行下面的分析时,我们只分析与WLAN接口相关的内容。
  • 第一部分,当得到网络目标不在剩余的部分当中,我们就会将数据通过接口,发送到网关,也就是路由器上进行转发。
  • 第二部分,在链路上意味着在局域网内,可以直接进行访问。三个网络目标分别为网络号,本机ip,本地广播地址。
  • 第三部分,网络目标224.0.0.0,为组播地址,即向特定的一些主机发送数据包。
  • 第四部分,广播地址,当没有获取到本地广播时,使用该广播代替本地广播进行发送数据。

  • 常见的路由算法,作为了解即可。
  • 最短路径算法:最短路径算法用于确定网络中两个节点之间的最短路径。著名的最短路径算法包括Dijkstra算法和Bellman-Ford算法。

  • 路径向量路由算法:路径向量路由算法类似于距离矢量路由算法,但是每个路由器不仅发送到达目的地的距离信息,还发送到达目的地的路径信息。BGP是一种路径向量路由算法,用于在互联网中实现路由。

  • 距离矢量路由算法:距离矢量路由算法基于每个路由器维护到其他所有路由器的距离矢量,通过交换距离矢量信息来更新路由表。经典的距离矢量路由算法有RIP和IGRP。

三、NAT技术

1.公有和私有

在之前,我们提及过ipv4地址只有42亿多,当今的互联网世界远不止这么多的互联网设备,那么我们要如何让这么多设备接入互联网呢?基本的思路是将一批的ip地址进行复用,一批的ip地址进行公开,即私有ip和公有(网)ip。

图解:
在这里插入图片描述
简单理解就是公有ip就是一个唯一标识,私有ip是一个局部的唯一标识,全局的可重复的标识,比如我在XX理工大学上大学,这个某地我们就可理解为成唯一标识,在这个地方肯定只有一家理工大学,但是在别的地方就会有北京理工大学,武汉理工大学等等,那么理工大学就是一个全局的可重复的标识。

  • 私有地址

范围:
在这里插入图片描述

我们要了解到这样一个常识,即没有连网之前,我们的设备是没有ip地址的,而连了网之后,我们的设备才被分配了ip地址,这个ip地址通常为私有ip地址。

就拿我电脑上的ip地址进行举例:

在这里插入图片描述

我们看到的一般都是私有ip地址,可根据上图的范围图进行对比查看,且我们在网络中进行传递时,因为在全局范围内是重复的,所以只能在局域网内部进行使用。

就拿我租的云服务器的ip地址进行举例:

在这里插入图片描述
从图中我们可以看到,我们服务器内部使用的是私有ip,但是我们访问时使用的是公网ip进行的访问,这就是因为公网ip在全局唯一,是一种全局唯一的标识。


那我们就疑惑了,那么使用公网的ip地址是如何能够访问到局域网目的主机的呢?这中间蕴含着怎样的奥秘呢?

2.NAT

  • NAT,即 Network Address Translation,网络地址转换。NAT是一种私有地址转公有地址的一种网络转换技术。

首先,路由器之间不断在进行转发的过程中,会有一种叫NAT路由器的,负责将我们所在的私有ip转化为公有ip,具体如下图:

在这里插入图片描述

  • 首先这里主机A向公网中的服务器发送一条数据包,经过NAT路由器之后,源私有ip地址转换为了公有ip地址;
  • 然后继续经过路由转发到云服务提供商的手中,会再一次经过NAT路由器的,不过这一次是将报文中的服务器的公网ip转换为私有ip地址;
  • 最终将数据送到了其公司内部的服务器上进行处理。处理完之后,会再一次经过类似的流程,最终将响应返回。上图实际上省略了服务商内部的地址转换的工作,这里简要进行补充。

那么就又会产生一个问题,如果主机A,主机B,主机C 同时 向服务器发送消息,那么就会出现虽然服务器能够收到消息,但不知道是谁发来的,在返回请求时就会出现NAT路由器实际上无法进行从「公有ip」向「私有ip」的转换,因此 NAT技术只能实现单主机在网络内通信。也就引出了下面的NAPT技术,来解决这一问题。

3.NAPT

  • NAPT,即 Network Address Port Translation,网络地址端口转换。主要用于解决NAT技术无法实现多主机并发在网络上访问的情况。

在这里插入图片描述

  • 首先相较于NAT,其多了一个端口号进而来实现一台设备的并发访问,端口号一般来源于TCP和UDP协议;
  • 因此NAT路由器中是具备识别与修改传输层报文的协议字段的能力,那么当多台设备向网络中发送消息时,NAT路由器就可以提取出报文中的ip与端口号进行映射;
  • 虽然是同一个ip地址,但是端口号不同,这就可以在返回应答时,根据端口号再进行映射,从而得出指定主机的ip地址与端口号,从而实现多台网络设备并发的在网络中发送数据。
  • 但是由于端口号的范围在0~65535之间,因此NAT路由器一次最多只能允许这么多台机器同时在网络中进行发送数据。
  • 因此如果实际的主机数超过NAT路由器能够承受的范围,那么会运营商进行子网划分,即将多余的机器分配到其它NAT路由器上的。

四、ARP协议

1.MAC地址

  • 概念:MAC,英文全称Media Access Control address,即媒体访问控制地址,通常被称为物理地址,局域网地址。
  • 表示:用48位二进制数,一般每8位转换成两位16进制数,中间使用 - 号进行隔开。
  • 性质:不随地理位置的变化而变化,且一般网络设备出厂时就确定了。一般来说一个网卡一个MAC地址。
  • 协议层:链路层。
  • 特殊地址:当MAC地址全为1时,被用于广播给局域网内所有的设备。

对比ip地址:最重要的区别在于ip地址是根据地理位置的变化而变化的;MAC地址是随着网络硬件的,只要网络硬件不变,设备的MAC地址是不会发生变化的。

在链路层,我们一般将数据格式称为数据帧,其中MAC帧主要有三种表示形式:

在这里插入图片描述

  • 这里的所有数字都是字节为单位的,这里的CRC校验和的作用相同,用于检测数据帧是否完整。PAD是一段填充字段。
  • 当数据在进行传输的过程中,需要知道下一次传输实际要去哪台「物理设备」,因此需要ARP/RARP协议帮我们获取下一次物理设备的MAC地址。
  • 当知道了下一次传输的物理设备的MAC地址之后,我们再将ip数据报封装成MAC帧传给指定的物理设备即可。

源ip和目的ip就像是当下所在的起点和你要去往的最终目标一样,指定了源头和要实现的目标,给我们了一个明确的方向,而源mac和目的mac就像我们实际的行动一样,需要我们脚踏实地,两者结合最终才能实现我们的目标,即到达目的主机。

2.ARP

  • ARP的全称是地址解析协议(Address Resolution Protocol),使用目的主机的ip进而获取其MAC地址。
  • 首先当数据到达目的主机局域网时,需要经过路由器进行转发,但是其可能并不知道目的主机的MAC地址;
  • 那么我们就无法运输到实际的网络设备上,此时就需要ARP发送报文广播给所有的主机;
  • 让目的主机给我们返回其设备上的MAC地址,路由器就能将报文用目的主机的MAC地址封装,最终将数据包运往到目的主机当中。

协议字段

在这里插入图片描述

ARP粗略过程

  1. 路由器向局域网内所有主机发送ARP请求。
    在这里插入图片描述

  2. 目的主机识别ARP报文,然后向路由器发送ARP应答,其中报文中携带目的主机的MAC地址。

在这里插入图片描述

  • 首先,路由器发送ARP请求时,由于不知道要传给哪台主机,因此给所有主机发送报文,因此目的MAC,全为1表示广播地址。
  • 其次,由于是请求,所以ARP操作字段中添上1表示请求,报文中携带关键信息「目的ip地址」,用于识别目的主机。
  • 然后,让所有的主机收到ARP请求后会进行识别,关键识别目的ip地址,如果不是就直接丢弃,如果是就返回应答报文。
  • 接着,目的主机识别请求,返回ARP应答,其中携带关键信息「目的主机的MAC地址」,定向返回给路由器。
  • 最后,路由器识别之后,会将ip报文用目的主机的MAC地址再进行封装,然后将数据定向的传送给目的主机。

补充:

  1. 路由器只有在其表上查不到目的主机的MAC地址时,才会向所有的主机发送ARP请求报文,获取目的主机MAC地址。
  2. 目的主机的MAC地址在路由器上会被临时缓存起来,当MAC地址失效时,也会重新发送ARP请求。
  3. 当主机收到大量的ARP请求时,会以最新的MAC为准,这也就是ARP欺骗的原理。

五、DHCP协议

  • 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用户IP地址进行动态管理和配置。

 当设备接入网络时,会自动分配ip地址,而在连入到网络之前,设备是没有ip地址的,也就是说ip地址并不属于我们,我们只是临时的进行使用而已,那么DHCP协议就可以帮助我们自动的完成申请ip这一过程,而省去了繁琐的步骤。

查看DHCP信息

DHCP协议一般都是在DHCP服务器下进行的,我们可以在windows下查看到内网的DHCP服务器的ip地址:

ip /all

在这里插入图片描述

基本信息

  • 报文格式:
    在这里插入图片描述
    UDP报头中,DHCP服务器的端口号一般设置为67,客户端一般设置为68

  • 协议字段:
    在这里插入图片描述

  • 跳数:这里指定对应的路由器,我们称之为中继路由器,负责将报文转发到DHCP服务器上,其转发的次数,即为这里的跳数。

  • 秒数:一般来说为客户端申请或者更新ip地址的时间,一般用时间戳的形式表示。

  • 标识:一般为2字节,即16比特,最高位为1时为广播,最高位为0时为单播。

  • 事务标识:DHCP一般是由客户端发起的,所以一般由客户端生成的随机数,用于标识唯一的应答和请求报文。

  • 引导文件名:这里指定是服务器指导客户端在指定文件下配置ip地址等相关信息。

选项中的字段格式:
在这里插入图片描述

说明:选项字段中有一个END字段,用于表示选项位置的结束,因此我们是可以截取出一个完整的DHCP报文的。

选项中的基本信息:

  • 报文的类型:一般有DHCP-DISCOVER报文,即客户端请求报文;DHCP-OFFER报文,服务器响应包;DHCP-REQUEST报文,客户端选择包;DHCP-ACK报文 ,服务器确认包等类型。
  • 其次的是服务器返回的一些关于ip的属性,都有ip地址,子网掩码,租约,网关,DNS服务器的ip等信息。

大致申请的流程。

  • 首先当客户端申请ip地址时,我们是没有ip地址的,那么此时只能用0.0.0.0代替我们的主机地址,其次我们也不知道DHCP的ip地址,因此我们只能用广播地址(全1),在局域网内进行广播,报文类型我们设置为DHCP-OFFER用于表示发送的第一个请求,通过绑定68号端口上的客户端进程进行发送。

  • 当报文经过对应的中继路由器不断进行转发到达相应的DHCP服务器之后,其上67号端口上进程识别对应的报文之后,发送DHCP-OFFER 类型的应答报文,携带配置ip相关信息,比如ip地址,子网掩码,DNS主机名,租约等信息。由于对应主机目前还没有ip地址,于是发送时以广播的形式进行发送给对应局域网的路由器,不过我们转发时可是知道其MAC地址的,因此目的主机最终还是能收到对应的应答的。

  • 当客户端确认收到应答之后, 会对DHCP服务器,发送DHCP-REQUEST类型的报文,用于表示接收DHCP服务器发来的配置信息,这时由于ip地址还是无效的,不能直接用,还是跟最初一样用相应的ip地址作为代替进行发送报文。

  • 当服务器再次收到请求,识别之后会发送相应的 DHCP-ACK报文,此时客户端再次收到报文时,此后ip地址才算生效。

如图:
在这里插入图片描述

六、DNS协议

域名

比如我们所熟知的www.baidu.com,其实就是百度的域名。那么域名只是为了方便我们看到进行记忆,其中还蕴含着目标服务器的ip地址,如何解析域名进而获取ip地址,就是DNS协议的工作了。

分类:

  • 通用顶级域名:常见的有.com(商业)、.org(非盈利组织)、.net(网络服务提供商)、.edu(教育机构)和 .gov(政府机构)等。这些域名可以被任何人注册,并且通常被用于与其领域相关的网站。
  • 国家级域名:常见的有.cn(中国)、.us(美国)、.uk(英国)、.fr代表(法国)等,能在指定境内进行访问。

分析:www.baidu.com.cn

  • 一级域名,为.cn
  • 二级域名,为.com.cn
  • 三级域名,为.baidu.com.cn
  • 四级域名,为www.baidu.com.cn

现在我们可以从.com的角度,证明百度其实是一家商业公司。哈哈,这感觉像是一个冷笑话。


Windows下查看与清除DNS缓存:

  • ipconfig /displaydns —— 查看dns缓存。
  • ipconfig/flushdns —— 清除dns缓存。

大致流程

当我们解析域名时,其实是交给对应的DNS服务器进行处理的,下面我们体验一波DNS解析baidu.com的大致过程:

  • 前提:浏览器中无相应的域名的DNS缓存,且主机上也没有相应的dns缓存,即没有域名对应的ip地址。

  • 第一步,客户端发送请求到本地的DNS服务器上,本地DNS服务器就会查看是否有对应的域名的ip地址,如果有直接返回相应ip的地址,如果没有,就向根dns服务器上发送badu.com的请求。

  • 第二步,根DNS服务器也无法识别baidu.com,但是知道相关顶级域名.com的DNS服务器,于是就返回它的地址让其访问它,看是否有baidu.com的ip地址。

  • 第三步,本地DNS服务器继续向顶级域名.com的服务器发送请求,看其是否有baidu.com的ip地址,这个服务器上也没有对应ip地址,但是知道baidu.com的权威服务器上可能会有,于是又将其返回了。

  • 第四步,本地DNS服务器继续向这个权威服务器发送请求,最终其返回baidu.com的ip地址,然后返回给对应的主机。

简单画张图:
在这里插入图片描述
*总结:DNS服务器如果存在对应域名就会返回对应域名的ip地址,如果不存在对应的域名就 “只指路,不带路”,可把本地DNS服务器累惨了 。

尾序

我是舜华,期待与你的下一次相遇!

相关文章:

【Linux进阶之路】地址篇

文章目录 一、ipv4地址1. 基本概念2. 分类3.CIDR4.特殊的ip地址 二、IP协议1. 协议字段2.分片与重组3.路由 三、NAT技术1.公有和私有2.NAT3.NAPT 四、ARP协议1.MAC地址2.ARP 五、DHCP协议六、DNS协议尾序 一、ipv4地址 1. 基本概念 概念:IP地址,英文全…...

代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 贪心算法,这不就是常识?还能叫贪心?LeetCode:1005.K次取反后最大化的数组和_哔哩哔…...

Rust线程间通信通讯channel的理解和使用

Channel允许在Rust中创建一个消息传递渠道,它返回一个元组结构体,其中包含发送和接收端。发送端用于向通道发送数据,而接收端则用于从通道接收数据。不能使用可变变量的方式,线程外面修改了可变变量的值,线程里面是拿不…...

Vue3组件基础示例

组件是vue中最推崇的,也是最强大的功能之一,就是为了提高重用性,减少重复性的开发。 如何使用原生HTML方法实现组件化 在使用原生HTML开发时,我们也会遇到一些常见的功能、模块,那么如何在原生HTML中使用组件化呢&am…...

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象:表test_0102,others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…...

蓝桥杯刷题 深度优先搜索-[NewOJ P1158]N皇后(C++)

题目描述 n皇后问题:n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 上面布局用序列2 4 6 1 3 5表示,第i个数字表示第i行皇后放的列号。 按照这种格式输出前3个解,并统计总解数。 输入格式 输入一个正整数n&a…...

python实例2.2:编写一个装饰器,计算任何一个函数执行的时间(详解及其知识点拓展)

目录 一、编写一个装饰器,计算任何一个函数执行的时间 二、装饰器详解,及其用法举例...

Jenkins 持续集成 【CICD】

持续集成 (Continuous integration,简称CI) 持续集成是一种开发实践,它倡导团队成员频繁的集成他们的工作,每次集成都通过自动化构建(包括编译、构建、打包、部署、自动化测试)来验证&#xff…...

【CHI】(十二)Memory Tagging

目录 1. Introduction 2. Message extensions 3. Tag coherency 4. Read transaction rules 4.1 TagOp values 4.2 Permitted initial MTE tag states 5. Write transactions 5.1 Permitted TagOp values 5.2 TagOp, TU, and tags relationship 6. Dataless transact…...

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…...

IP网络对讲广播系统审计

前言 这个系统是前两年在一个内网遇到的,当时顺手试了一个admin登陆之后再没有然后了,最近发现有大佬分享关于这个系统的漏洞,于是就把自己当初看的几个漏洞分享一下,系统比较简单,漏洞点很多,不要做坏事哦…...

蓝桥杯刷题--python38

197. 阶乘分解 - AcWing题库 def init(n): for i in range(2,n1): if not st[i]:primes.append(i) j0 while primes[j]*i<n: st[i*primes[j]]1 if i%primes[j]0: break j1 nint(input(…...

【LeetCode热题100】33. 搜索旋转排序数组(二分)

一.题目要求 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], …...

基于Leaflet.js的Marker闪烁特效的实现-模拟预警

目录 前言 一、闪烁组件 1、关于leaflet-icon-pulse 2、 使用leaflet-icon-pulse 3、方法及参数简介 二、闪烁实例开发 1、创建网页 2、Marker闪烁设置 3、实际效果 三、总结 前言 在一些地质灾害或者应急情况当中&#xff0c;或者热门预测当中。我们需要基于时空位置来…...

Vue-05

v-model 应用于其他表单元素 常见的表单元素都可以用v-model绑定关联 → 快速获取或设置表单元素的值 它会根据控件类型自动选取正确的方法来更新元素 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name…...

Mongodb中一个小巧的数据更新命令$inc

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第55篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 $inc是一个很小巧的命令。说它小巧&#xff0c;一个是因为短&#xff0c;只有三个字符。另一个是说…...

Java基于SpringBoot+Vue的专家医院预约挂号系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

STM32一个地址未对齐引起的 HardFault 异常

1. 概述 客户在使用 STM32G070 的时候&#xff0c;KEIL MDK 为编译工具&#xff0c;当编译优化选项设置为Level0 的时候&#xff0c;程序会出现 Hard Fault 异常&#xff0c;而当编译优化选项设置为 Level1 的时候&#xff0c;则程序运行正常。表面上看&#xff0c;这似乎是 K…...

spring事务那些事

实际工作中还会面临千奇百怪的问题&#xff0c;看下面返个例子&#xff08;注意MySql数据库测试&#xff09;&#xff1a; //1.hello1Service 调用 hello2Service Transactional(propagation Propagation.REQUIRED,rollbackFor Exception.class) public void doUpdate() {//…...

设计模式深度解析:AI大模型下的策略模式与模板方法模式对比解析

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 策略模式与模板方法模式对比解析 文章目录 &#x1f31f;引言&#x1f31f;Part 1:…...

贪婪算法python实现

贪婪算法&#xff08;Greedy Algorithm&#xff09;是一种解决问题的策略&#xff0c;它基于一种贪心的思想&#xff1a;在每一步选择中都采取当前状态下最好或最优的选择&#xff0c;从而希望最终能够得到全局最优解。 其核心思想可以简单概括为“当前局部最优选择”&#xff…...

(一)基于IDEA的JAVA基础12

一维数组 为什么使用数组: 当我们需要存储一系列数据的时候&#xff0c;就需要用到数组&#xff0c;如果不使用数组&#xff0c;我们就要需要一个一个的去声明变量&#xff0c;这样浪费内存空间&#xff0c;同时效率低下。 什么是数组: 数组本身就是一个变量&#xff0c;只…...

vue3中封装table表格

封装实例useTable import {ref } from vue export function useTable(api) {const data = ref([])const refre...

【Redis】Redis的使用

登录redis [roottest2 ~]# redis-cli 127.0.0.1:6379> 或[roottest2 ~]# redis-cli -h 192.168.67.12 -p 6379 192.168.67.12:6379> redis-benchmark 测试工具 redis-benchmark 是官方自带的Redis性能测试工具&#xff0c;可以有效的测试Redis服务的性能 基本的测试语…...

【机器学习300问】60、图像分类任务中,训练数据不足会带来什么问题?如何缓解图像数据不足带来的问题?

在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习&#xff08;包括有监督学习和无监督学习&#xff09;&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。就比如图像分类这样的计算机视觉任务&#xff0c;确实依赖于大规模且多样化的训练数据以…...

鸿蒙内核源码分析 (内存管理篇) | 虚拟内存全景图是怎样的

初始化整个内存 OsSysMemInitOsMainmain从 main() 跟踪可看内存部分初始化是在 OsSysMemInit() 中完成的。 UINT32 OsSysMemInit(VOID) {STATUS_T ret;OsKSpaceInit();//内核空间初始化ret OsKHeapInit(OS_KHEAP_BLOCK_SIZE);// 内核动态内存初始化 512K if (ret ! LOS_OK…...

基于深度学习的电动自行车头盔佩戴检测系统

文章目录 1. 文档说明2. 运行环境说明2.1 硬件配置2.2 软件配置2.3 程序依赖库 3. 基本环境配置3.1 软件安装3.1.1 集成开发环境安装与配置3.1.2 数据库安装与配置3.1.3 编程语言安装3.1.4 CUDA和cuDNN安装与配置3.1.5 机器学习库安装 3.2 依赖库安装 4. 运行程序资源下载地 1.…...

GO - 泛型编程

go - 泛型编程 介绍 泛型即开发过程中编写适用于所有类型的模板&#xff0c;只有在具体使用的时候才能确定其真正的类型。随着Go 1.18版本的发布&#xff0c;泛型正式成为了Go语言的一部分。 在编写代码时&#xff0c;我们经常会遇到需要处理不同类型的数据的情况。传统上&am…...

TouchableOpacity和TouchableWithoutFeedback区别

TouchableOpacity和TouchableWithoutFeedback都是React Native中定义的可触摸组件&#xff0c;但它们之间有一些区别&#xff1a; 点击效果&#xff1a;TouchableOpacity在被按下时会有一个透明度变化的点击效果&#xff0c;而TouchableWithoutFeedback则没有点击效果。 子组…...

MySQL EXISTS 语句和IN语句有啥区别

在 MySQL 中&#xff0c;EXISTS 和 IN 是用于子查询的两种不同方式&#xff0c;它们有一些区别&#xff1a; 1. **IN 语句**&#xff1a; - IN 子句用于在 WHERE 子句中指定多个值&#xff0c;并检查主查询中的某个列是否在子查询返回的结果集中。 - IN 子句适用于子查询…...