计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)
IP地址与MAC地址
由于MAC地址已固化在网卡上的ROM 中,因此常常将 MAC地址称为硬件地址或物理地址;物理地址的反义词就是虚拟地址、软件地址或逻辑地址,IP地址就属于这类地址。
从层次的角度看,MAC地址是数据链路层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。
IP地址与MAC地址在层次间的关系
总之,IP地址放在IP数据报的首部,而MAC地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是MAC地址。
IP地址与MAC地址在运输中的关系
- 数据报中间经过的两个路由器的IP地址并不出现在IP数据报的首部中。
- IP数据报被封装在MAC帧中。MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址要发生变化
- 开始在H1到R1间传送时,MAC帧首部中写的是从MAC1地址发送到MAC3地址,路由器R1收到此MAC帧后,在数据链路层,要剥去原来的MAC帧的首部和尾部。在转发时,在数据链路层,要重新添加上MAC 帧的首部和尾部。这时首部中的源地址和目的地址分别变成为MAC4和MAC5。
为什么不能只用MAC地址进行寻址
如果仅使用MAC地址进行通信,则会出现以下主要问题:
- 路由表要记录网络中所有MAC地址:因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的MAC地址。
- 配置路由表很麻烦:手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的MAC地址信息而严重占用通信资源。
- 路由信息的存储和查找很麻烦:包含海量MAC地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延。
因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少:
- 因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址。
- 路由器收到IP数据报后,根据其首部中的目的IP地址的网络号部分,基于自己的路由表进行查表转发。
地址解析协议ARP
已经知道了一个机器的IP地址,需要找出其相应的 MAC地址。地址解析协议ARP就是用来解决这样的问题的。
ARP的要点:
- IP与MAC之间的关系很模糊:网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用链路层的MAC 地址。IP地址和下面链路层的MAC地址之间由于格式不同而不存在简单的映射关系。
- MAC地址也随时发生变动:在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的MAC地址改变(请注意,主机的MAC地址实际上就是其网络适配器的MAC地址)。
地址解析协议ARP解决这个问题的方法是在主机的ARP高速缓存中存放一个从IP地址到MAC地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)
ARP运行流程
那如果A中的ARP高速缓存中没有找到主机B的IP地址呢?
B发送响应分组的流程如下:
MAC地址类型:
- 动态:通过ARP自动获取,生命周期默认为两分钟。
- 静态:手工配置,不同操作系统下的生命周期不同,例如系统重启后不存在或系统重启后依然有效。
设置生存时间的原因:
答:转发表中的MAC地址与交换机接口号的对应关系记录也要周期性删除,因为这种对应关系并不是永久不变的。同理,ARP高速缓存表中的IP地址与MAC地址的对应关系也并不是永久不变的。例如,主机更换了一块新网卡。
主机跨网络寻址
IP数据报的格式
一个IP数据报由首部和数据两部分组成首部的前一部分长度是固定的,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
版本
长度为4个比特,用来表示lP协议的版本;通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)
首部长度
长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报的首部长度。
- 最小取值为二进制的0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。
- 最大取值为二进制的1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分。
以下是对该概念的深入讨论:
大概可以得出首部长度是怎样控制的
区分服务
长度为8个比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组ETF把这个字段改名为区分服务。利用该字段的不同取值可提供不同等级的服务质量。
只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。
总长度
长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)最大取值为二进制的16个比特1,即十进制的65535(很少传输这么长的IPv4数据报)。
总长度与首部长度的关系
标识、标志、片位移
标识:长度为16个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识。
IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段。
标志:
最低位(More Fragment,MF)
- MF=1表示本分片后面还有分片
- MF=0表示本分片后面没有分片
中间位(Don't Fragment,DF)
- DF=1表示不允许分片
- DF=0表示允许分片
最高位为保留位,必须设置为0
片位移:长度为13个比特,该字段的取值以8字节为单位,用来指出分片lPv4数据报的数据载荷偏移其在原IPv4数据报的位置有多远。
数据报的划分
对划分的数据报进行再划分
练习
正确的做法如下:
生存时间、协议、首部检验和
生存时间(Time To Live,TTL)
长度为8个比特,最大取值为二进制的111111,即十进制的255。该字段的取值最初以秒为单位。因此,IPv4数据报的最大生存时间最初为255秒。路由器转发IPv4数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为0就转发,否则就丢弃。
生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃。
协议
长度为8个比特,用来指明IPv4数据报的数据载荷是何种协议数据单元PDU。
首部检验和
长度为16个比特,用于检测IPv4数据报在传输过程中其首部是否出现了差错。
IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
首部检验和的计算方法
二进制反码求和的运算
源IP地址与目的IP地址
源IP地址
长度为32个比特,用来填写发送IPv4数据报的源主机的IPv4地址。
目的IP地址
长度为32个比特,用来填写接收IPv4数据报的目的主机的IPv4地址。
可变部分(可选字段+填充)
可选字段
长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。
虽然可选字段增加了IPv4数据报的功能,但这同时也使得IPv4数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理IPv4数据报的开销。实际上,可选字段很少被使用。
填充
用来确保IPv4数据报的首部长度是4字节的整数倍,使用全0进行填充。
IP转发分组
分组在互联网上传送和转发是基于分组首部中的目的地址的,因此这种转发方式称为基于终点的转发。
因此,分组每到达一个路由器,路由器就根据分组中的终点(目的地址)查找转发表,然后就得知下一跳应当到哪一个路由器。
但是路由器路由器中的转发表却不是按目的IP地址来直接查出下一跳路由器的
路由器的寻址方法:而是先查找目的网络(网络前缀),在找到了目的网络之后,就把分组在这个网络上直接交付目的主机。
由于互联网上的网络数远远小于主机数,这样就可以大大压缩转发表的大小,加速分组在路由器中的转发。这就是基于终点的转发过程。
IP转发分组的工作流程
我们用如下网络来进行举例
直接交付与间接交付
- 直接交付:同一个网络中的主机之间可以直接通信。
- 间接交付:不同网络中的主机之间的通信需要通过路由器来中转。
源主机如何判断自己与目的主机在同一网络
源主机C如何知道需要经由哪个路由器
实际上用户为了让本网络中的各主机能与其他网络中的各主机进行通信,就要必须给本网络中的各主机指定本网络中的一个路由器,由该路由器帮忙进行转发。所指定的路由器也被称为默认网关。
假设主机A要给主机D发送IP数据包
路由器配置IP地址时就生成了路由表条目
路由器收到IP数据报后的表现
主机A发送广播
静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。
人工配置方式简单、开销小、但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
进行静态路由配置需要认真考虑和谨慎操作,否则可能出现以下问题:
- 路由条目配置错误,甚至导致出现路由环路。
- 聚合路由条目时可能引入不存在的网络。
当R1向蓝色网络群发送IP数据
默认路由
我们思考一个问题:如果下述情况需要针对英特网中的每一个网络给R1添加一条相应的路由条目吗?
回答是否定的。试想一下,如果针对因特网中的每一个网络给R1添加一条静态路由条目,这会给人工配置带来巨大的工作量,并且使R1的路由表变得非常大,降低了转发的速度。
特定主机路由
出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,特别是在对网络的连接或路由表进行排错时,指明到某一台主机的特定主机路由是十分有用的。
最长前缀匹配
分组目的地址可能出现与路由器多个项目匹配的情况
得出最长前缀匹配如下:
使用二叉树线索查找转发表
为了进行更加有效的查找,通常是把无分类编址的转发表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索(binary trie)。
二叉线索的结构
IP地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就代表转发表中存放的各个地址。
二叉线索的运作
二叉树存储IP
从二叉线索的根节点自顶向下的深度最多有32层,每一层对应于IP地址中的一位。
一个IP地址存入二叉线索的规则很简单:先检查IP地址左边的第一位,如为0,则第一层的节点就在根节点的左下方;如为1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。由于唯一前缀一般都小于32位,因此用唯一前缀构造的二叉线索的深度往往不到32层。
在二叉树中查找IP地址
以上只是给出了二叉线索这种数据结构的用法,而并没有说明“与唯一前缀匹配”和“与网络前缀匹配”的关系。
显然,要将二叉线索用于转发表中,还必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。当搜索到一个叶节点时,就必须将寻找匹配的目的地址和该叶节点的子网掩码进行按位AND运算,看结果是否与对应的网络前缀相匹配。
若匹配,就按下一跳的接口转发该分组。
否则,就丢弃该分组
总之,二叉线索只是提供了一种可以快速在转发表中找到匹配的叶节点的机制。但这是否和网络前缀匹配,还要和子网掩码进行一次逻辑AND运算。
另外,为了提高二叉线索的查找速度,广泛使用了各种压缩技术。例如下图中的最后两个地址,其最前面的4位都是1011。因此,只要一个地址的前4位是1011,就可以跳过前面4位(即压缩了4个层次)而直接从第5位开始比较。这样就可以减少查找的时间。
网际控制报文ICMP
为了更有效地转发IP数据报以及提高IP数据报交付成功的机会,TCP/IP体系结构的网际层使用了网际控制报文协议ICMP (Internet Control Message Protocol)
ICMP是互联网的标准协议。但ICMP不是高层协议,而是IP层的协议。(看起来好像是高层协议,因为ICMP报文装在IP数据报中,作为其中的数据部分)。
ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。
ICMP报文的种类
ICMP报文有两种,即ICMP差错报告报文和ICMP询问报文。
- 差错报告报文:用来向主机或路由器报告差错情况。
- 询问报文:用来向主机或路由器询问情况。
1、ICMP报文的前4字节是统一的格式,共有三个字段:类型、代码和检验和。
2、接着的4字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型
差错报告报文详解
(1)终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种。
(2)时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向
源点发送时间超过报文。当路由器收到一个目的IP地址不是自己的IP数据报时,会将其首部中生存时间TTL字段的值减1。
- 若结果不为0,则路由器将该数据报转发出去;
- 若结果为0,路由器不但要丢弃该数据报,还要向发送该IP数据报的源点发送时间超过(超时)报文。
另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。
(3)参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
(4)改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(也就是说,找到了更好的路由)。
(5)源点抑制:当路由器或主机由于拥塞而丢弃IP数据报时,就向发送该IP数据报的源点发送源点抑制报文,使源点知道应当把P数据报的发送速率放慢。
同理主机也有可能出现因拥塞而丢弃IP数据报并发送ICMP差错报告报文的情况,如图所示。
不应发送ICMP差错报告报文的情况
- 对ICMP差错报告报文不再发送ICMP差错报告报文。
- 对第一个分片的IP数据报片的所有后续数据报片都不发送ICMP差错报告报文。
- 对具有多播地址的IP数据报都不发送ICMP差错报告报文。
- 对具有特殊地址(例如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文。
询问报文详解
回送请求和回答:
由主机或路由器向一个特定的目的主机或路由器发出,收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送ICMP回送回答报文。
这种询问报文用来测试目的站是否可达以及了解其有关状态。
时间戳请求和回答:
用来请求某个主机或路由器回答当前的日期和时间。
在ICMP时间戳回答报文中有一个32比特的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。
这种询问报文用来进行时钟同步和测量时间。
ICMP的典型应用——分组网间探测PING
分组网间探测PING用来测试主机或路由器之间的连通性。
- PING是TCP/IP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP。
- PING应用所使用的ICMP报文类型为回送请求和回答。
ICMP的典型应用——跟踪路由
跟踪路由应用traceroute,用于探测IP数据报从源主机到达目的主机要经过哪些路由器。
在不同操作系统中,traceroute应用的命令和实现机制有所不同:
- 在UNIX版本中,具体命令为“traceroute”,其在运输层使用UDP协议,在网络层使用ICMP报文类型只有差错报告报文。
- 在Windows版本中,具体命令为“tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。
跟踪路由的运行过程
![]()
接着H1在发送一段TTL=2的ICMP回送请求
接着H1在发送一段TTL=3的ICMP回送请求
IPV6
互联网经过几十年的飞速发展,在2011年2月3日,IANA 开始停止向地区互联网注册机构RIR分配IPv4地址,因为 IPv4地址已经全部耗尽了。
不久,各地区互联网地址分配机构也相继宣布地址耗尽。我国在2014年至2015年也逐步停止了向新用户和应用分配IPv4地址,同时全面开始商用部署IPv6。
解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的IP,即 IPv6。经过多年的研究和试验,2017年7月终于发布了IPv6的正式标准。
IPV6的优势
IPV6的基本首部
IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。
有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分。但请注意,所有的扩展首部并不属于IPv6 数据报的基本首部。
与IPV4相比,IPV6首部某些字段发生更改
- 取消了首部长度字段,因为它的首部长度是固定的(40字节)
- 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
- 取消了总长度字段,改用有效载荷长度字段。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
- 把 TTL字段改称为跳数限制字段,但作用是一样的(名称与作用更加一致)。
- 取消了协议字段,改用下一个首部字段。
- 取消了检验和字段,这样就加快了路由器处理数据报的速度。
- 取消了选项字段,而用扩展首部来实现选项功能。
IPv6基本首部中各字段的作用
版本字段:长度为4比特,用来表示IP协议的版本。对于IPv6该字段的值是6。
通信量类字段:长度为8比特,该字段用来区分不同的IPv6数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
流标号字段:长度为20比特。IPv6提出了流的抽象概念。“流”就是因特网上从特定源点到特定终点(单播或多播)的一系列IPv6数据报(如实时音视频数据的传送),而在这个“流”所经过的路径上的所有路由器都保证指明的服务质量。所有属于同一个流的IlPv6数据报都具有同样的流标号。换句话说,流标号用于资源分配。
- 流标号对实时音频/视频数据的传送特别有用。
- 对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为0即可。
有效载荷长度字段:长度为16比特,它指明IPv6数据报基本首部后面的有效载荷(包括扩展首部和数据部分)的字节数量。
该字段以字节为单位,最大取值为65535,因此IPv6数据报基本首部后面的有效载荷的最大长度为65535字节。
下一个首部字段:长度为8比特。该字段相当于IPv4数据报首部中的协议字段或可选字段。
当IPv6数据报没有扩展首部时,该字段的作用与IPv4的协议字段一样,它的值指出了IPv6数据报基本首部后面的数据是何种协议数据单元PDU。
当IPv6数据报基本首部后面带有扩展首部时,该字段的值就标识后面第一个扩展首部的类型。
跳数限制字段:长度为8比特。该字段用来防止IPv6数据报在因特网中永久兜圈。
- 源点在每个IPv6数据报发出时即设定某个跳数限制(最大255跳)。每个路由器在转发IPv6数据报时,要先把跳数限制字段中的值减1。
- 当跳数限制的值为0时,就把这个IPv6数据报丢弃((即不转发)。
该字段的作用与IPv4数据报首部中的生存时间TTL字段完全一样。IPv6将名称改为跳数限制后,可使名称与作用更加一致。
源地址字段和目的地址字段:长度都为128比特。分别用来填写IPv6数据报的发送端的IPv6地址和接收端的IPv6地址。
IPv6数据报的扩展首部
IPv4数据报如果在其首部中使用了选项字段,则在数据报的整个传送路径中的全部路由器,都要对选项字段进行检查,这就降低了路由器处理数据报的速度。
实际上,在路径中的路由器对很多选项是不需要检查的。因此,为了提高路由器对数据报的处理效率,IPv6把原来IPv4首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(除逐跳选项扩展首部)。
IPV6的地址
在IPv6中,每个地址占128个比特。lPv6地址空间大小为
(大于3.4×1038 )
- 如果整个地球表面(包括陆地和水面)都覆盖着需要IPv6地址的通信设备,那么IPv6允许每平方米拥有7×1023个IPv6地址。
- 如果IPv6地址分配速率是每微秒分配100万个IPv6地址,则需要1019年的时间才能将所有可能的地址分配完毕。
很显然,这样巨大的地址空间在采用合理编址方法的情况下,在可预见的未来是不会用完的。
IPV6的表示方法
二进制转化为十六进制的方法如下:
IPV6写作方式说明
在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义
冒号十六进制记法还可结合点分十进制的后缀
IPV6地址的分类
未指明地址:
- 128个比特为“全0”的地址,可缩写为两个冒号“:”。
- 该地址不能用作目的地址,只能用于还没有配置到一个标准IPv6地址的主机用作源地址。
- 未指明地址仅有一个。
环回地址:
- IPv6的环回地址是0:0:0:0:0:0:0:1,可缩写为::1。
- 它的作用和IPv4的环回地址一样。
- 这类地址也是仅此一个。
多播地址:
- 最高8比特为“全1”的地址,可记为FF00:/8。
- IPv6多播地址的功能与IPv4多播地址相同。
- 这类地址占IPv6地址空间的1/256。
本地链路单播地址:
- 最高10比特为1111111010的地址,可记为FE80::/10。
- 即使用户网络没有连接到因特网,但仍然可以使用TCP/IP协议。连接在这种网络上的主机都可以使用本地链路单播地址进行通信,但不能和因特网上的其他主机通信。
- 这类地址占IPv6地址空间的1/1024。
全球单播地址:
- 全球单播地址是使用得最多的一类地址。
- IPv6全球单播地址采用三级结构,这是为了使路由器可以更快地查找路由。
从IPv4向IPv6过渡
- 因特网上使用IPv4的路由器的数量太大,要让所有路由器都改用IPv6并不能一蹴而就。因此,从IPv4转变到IPv6只能采用逐步演进的办法。
- 另外,新部署的IPv6系统必须能够向后兼容,也就是IPv6系统必须能够接收和转发IPv4数据报,并且能够为IPv4数据报选择路由。
下面介绍两种由IPv4向IlPv6过渡的策略:
- 使用双协议栈
- 使用隧道技术
双协议栈
- 双协议栈(Dual Stack)是指在完全过渡到IPv6之前,使一部分主机或路由器装有IPv4和IPv6两套协议栈。
- 双协议栈主机或路由器既可以和IPv6系统通信,又可以和IPv4系统通信。
- 双协议栈主机或路由器记为IPv6/IPv4,表明它具有一个IPv6地址和一个IPv4地址。
- 双协议栈主机在与IPv6主机通信时采用IPv6地址,而与IPv4主机通信时采用IPv4地址。
- 双协议栈主机通过域名系统DNS查询目的主机采用的IP地址:
- 若DNS返回的是IPv4地址,则双协议栈的源主机就使用IPv4地址;
- 若DNS返回的是IPv6地址,则双协议栈的源主机就使用IPv6地址。
双协议栈的工作流程
隧道技术
隧道技术的核心思想:
- 当IPv6数据报要进入IPv4网络时,将IPv6数据报重新封装成IPv4数据报,即整个IPv6数据报成为IPv4数据报的数据载荷。
- 封装有IPv6数据报的IPv4数据报在IPv4网络中传输。
- 当IPv4数据报要离开IPv4网络时,再将其数据载荷(即原来的IPv6数据报)取出并转发到IPv6网络。
隧道技术的工作流程:
本例使用隧道技术,就好像在路由器R1和R4之间为ipv6数据报的传送打通了一条专用的隧道。R1是隧道的入口。R4是隧道的出口。
网际控制报文协议ICMPv6
由于IPv6与IPv4一样,都不确保数据报的可靠交付,因此IPv6也需要使用网际控制报文协议ICMP来向发送Pv6数据报的源主机反馈一些差错信息,相应的ICMP版本为ICMPv6。
- ICMPv6比ICMPv4要复杂得多,它合并了原来的地址解析协议ARP和网际组管理协议IGMP的功能。因此与IPv6配套使用的网际层协议就只有ICMPv6这一个协议。
ICMPv6的封装
有扩展首部的情况
ICMPv6报文的分类
ICMPv6报文可被用来报告差错、获取信息、探测邻站或管理多播通信。
相关文章:

计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)
IP地址与MAC地址 由于MAC地址已固化在网卡上的ROM 中,因此常常将 MAC地址称为硬件地址或物理地址;物理地址的反义词就是虚拟地址、软件地址或逻辑地址,IP地址就属于这类地址。 从层次的角度看,MAC地址是数据链路层使用的地址&…...

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式(又译作色度采样结构、像素格式): 在vlc中也可以获取到色彩格式(vlc底层也使用了FFmpeg进行解码): 这个色彩格式就是之前的文章《音视频入门基础…...

WEB前端05-JavaScrip基本对象
JavaScript对象 1.Function对象 函数的创建 //方法一:自定义函数 function 函数名([参数]) {函数体[return 表达式] }//方法二:匿名函数 (function([参数]) {函数体[return 表达式] }); **使用场景一:定义后直接调用使用(只使用一次) (fun…...

新手教学系列——简单的服务配置项集中管理
前言 在开发和运维过程中,配置管理是一个非常重要但经常被忽视的环节。常用的配置文件格式包括env、ini和yaml等,它们非常适合模块级别的系统配置,尤其是一些敏感信息的配置,例如数据库连接字符串和密码等。但是,对于…...

《0基础》学习Python——第十三讲__面向对象
<类(class)> 一、面向对象概念 1、面向对象是一种编程思想和技术,它是一种将程序设计问题分解成对象的方式。每个对象都有自己的状态(数据)和行为(方法),并且可以通过相互之间…...

前端JS特效第42波:纯CSS实现的卡片切换效果
纯CSS实现的卡片切换效果,先来看看效果: 部分核心的代码如下: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><title>纯CSS实现的卡片切换效果演示</title><l…...

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel
1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…...
中文科技核心论文发表
中文科技核心论文题目如下: 1.混凝土结构用纤维增强塑料筋的耐久性评述:适合建筑、结构、材料等专业 2.建筑工程用阻燃塑料的研究进展:适合建筑、材料专业 3.纤维增强热塑性塑料在面部护具中的应用研究:适合化工、医学、材料等专…...

使用 Flask 3 搭建问答平台(一):项目结构搭建
一、项目基本结构 二、app.py from flask import Flask import config from exts import db from models import UserModel from blueprints.qa import bp as qa_bp from blueprints.auth import bp as auth_bp# 创建一个Flask应用实例,__name__参数帮助Flask确定应…...

力扣经典题目之->用队列实现栈 的详细讲解和实现,看这一篇就够了!
一:题目 二:思路 1:先看两个概念: 更清晰的对比: 理解这两张图的不同对题目的一个函数( 返回栈顶元素) 会更好做 由图可知 : 返回栈顶函数即返回队列队尾即可 2:题…...
[JS]认识feach
介绍 feach是浏览器内置的api, 用于发送网络请求 请求方式对比 AJAX: 基于XMLHttpRequest接收请求, 使用繁琐Axios: 基于Promise的请求客户端, 在浏览器和node中均可使用, 使用简单fetch: 浏览器内置的api, 基于Promise, 功能简单 基础语法 <body><button>发请求…...
tomcat如何进行调优?
从两个方面考虑:内存和线程 首先启动Tomcat,实际上就是启动了一个JVM,所以可以按JVM调优的方式来进行调整,从而达到Tomcat优化的目的。 另外Tomcat中设计了一些缓存区,比如appReadBufSize、bufferPoolSize等缓存区来提…...

复现GMM文章(一):图1代码和数据
介绍 复现GMM文章的的Fig1图。 加载R包 library(tidyr)library(tidyverse)library(dplyr)library(ggsci)library(ggpubr)导入数据 所有的数据可以通过下列链接下载: 百度网盘链接: https://pan.baidu.com/s/1isKEK1G5I6X90KYqLufmWw 提取码: t9ca 图1B 数据 …...

链接追踪系列-07.logstash安装json_lines插件
进入docker中的logstash 容器内: jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …...

火山引擎数据飞轮实践:在电商场景中,如何建设全链路数据血缘?
数据作为新型生产要素,正支撑企业的数智化转型。但企业数字化建设也存在管理成本高、数据产品使用门槛高、数据资产价值不够的问题,其原因在于业务和数据之间没有形成双向良性驱动。 结合新时代企业数字化转型需求,火山引擎基于字节跳动十余…...

使用加密软件对企业来说有什么好处
泄密时间近年来层出不穷,一旦重要文件或数据被盗,无疑会对企业带来巨大的损失。 2024年3月,我国某高新科技企业遭境外黑客攻击,相关信息化系统及数据被加密锁定,生产经营活动被迫停止。企业生产经营活动受阻ÿ…...

STM32入门开发操作记录(二)——LED与蜂鸣器
目录 一、工程模板二、点亮主板1. 配置寄存器2. 调用库函数 三、LED1. 闪烁2. 流水灯 四、蜂鸣器 一、工程模板 参照第一篇,新建工程目录ProjectMould,将先前打包好的Start,Library和User文件^C^V过来,并在Keil5内完成器件支持包的…...
n3.平滑升级和回滚
平滑升级和回滚 1. 平滑升级流程2. 平滑升级和回滚案例 有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级 1. 平滑升级流程 平…...
C#WPF DialogHost.Show 弹出对话框并返回数据
在WPF中,使用DialogHost.Show方法显示一个对话框并获取返回数据,你需要定义一个对话框,并在对话框关闭时返回数据。以下是一个简单的例子: 首先,在主窗口中添加DialogHost控件: <MaterialDesign:DialogHost x:Name="dialogHost" /> 然后,创建一个对话…...

Kafka Producer发送消息流程之分区器和数据收集器
文章目录 1. Partitioner分区器2. 自定义分区器3. RecordAccumulator数据收集器 1. Partitioner分区器 clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java,中doSend方法,记录了生产者将消息发送的流程,其中有一步…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...