「网络编程」数据链路层协议_ 以太网协议学习

news2024/11/15 13:45:07

「前言」文章内容是数据链路层以太网协议的讲解。

「归属专栏」网络编程

「主页链接」个人主页

「笔者」枫叶先生(fy)

目录

  • 一、以太网协议简介
  • 二、以太网帧格式(报头)
  • 三、MTU对上层协议的影响
  • 四、ARP协议
    • 4.1 ARP协议的作用
    • 4.2 ARP协议报头

一、以太网协议简介

以太网协议是TCP/IP体系中的数据链层协议

以太网协议位于数据链路层:
在这里插入图片描述

链路层解决的问题

  • 网络层解决的问题是:将数据从一台主机跨网络送到另一台主机,也就是数据的路由(路径选择)
  • 网络层的数据包封装成IP报文之后,依旧要继续向下交付,交付给下一层:数据链路层
  • 再由数据链路层把IP报文封装成数据帧,再由数据链路层发送到网络里。这时,所谓的“数据包”才真正意义的进入网络
  • 即在网络(网线)上跑的是数据帧,不是IP报文
  • 网络层的IP协议是为数据的路由提供决策(提供跨网络传输的能力,有能力不一定能做到),而真正的对数据进行转发的是数据链路层(正真做事的)
  • 把数据帧转发给与当前主机直接相连的下一跳主机(两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题)

即数据链路层要解决的问题是:把数据帧转发给与当前主机直接相连的下一跳主机,即解决两台直接相连的主机之间的通信问题

:不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)

跨网络传输的本质是无数个子网(局域网)转发的结果
在这里插入图片描述

要彻底理解跨网络转发,首先要理解一个局域网中报文的转发原理

基本概念

  • “以太网”不是一种具体的网络,而是一种技术标准:既包含了数据链路层的内容,也包含了一些物理层的内容
  • 例如:以太网规定了网络拓扑结构,访问控制方式,传输速率等
  • 例如:以太网中的网线必须使用双绞线;传输速率有10M,100M,1000M等
  • 以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等

局域网技术

不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:

  • 以太网:以太网是一种局域网(LAN)技术,应用最普遍的局域网技术。以太网的特点是具有较高的数据传输速率和较低的成本
  • 令牌环网:令牌环网是一种早期的局域网技术,令牌环网使用了一种称为令牌传递的机制来控制数据传输(只有持有令牌的设备才能发送数据)
  • 无线局域网(WLAN)和无线广域网(WAN)是无线网络技术。WLAN使用无线电波代替有线电缆来连接设备,使设备可以无线访问局域网。

MAC地址

  • 在同一局域网的两台主机能够直接进行通信
  • 每一台主机都有自己的“名字”:每一台主机都有网卡,每一张网卡都有自己的地址,这个地址称为MAC地址,表明自己在局域网中的唯一性(主机唯一)
  • MAC地址长度为48位,6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19

在Linux查看自己的主机的MAC地址:使用ifconfig命令查看, ether对应就有”以太“的意思(但实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能虚拟技术模拟模拟出来的)
在这里插入图片描述

以太网通信原理

以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据
在这里插入图片描述

  • 例如,当局域网中的主机A想要发送数据给主机E时,其实局域网当中的每一台主机都能收到主机A发出去的数据
  • 各个主机在对比自己的MAC地址和数据帧中的目的MAC地址,发现数据帧中的目的MAC地址与自己的MAC地址不匹配,就直接丢弃该报文,不进行向上交付(在数据链路层丢弃)
  • 只最终只有主机E会将主机A发来的数据向上进行交付

补充

  • 网络抓包工具(局域网抓包),不进能抓自己主机的数据报文,也能抓该局域网下其他主机的报文
  • 原理是:网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接收所有经过它的数据帧,不管该数据包是不是自己主机的,只要接收到数据帧就直接向上交付

令牌环网(简单赘述)

  • 在令牌环网中,令牌按照固定的顺序在节点之间传递。每个节点在拥有令牌时可以访问共享资源,然后将令牌传递给下一个节点。当一个节点完成对共享资源的访问后,它将令牌传递给下一个节点(按顺序传递)
  • 在令牌环网中,只有持有令牌的主机才能发送数据(令牌相当于互斥锁)

二、以太网帧格式(报头)

以太网帧格式如下:
在这里插入图片描述
字段解释:

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的
  • 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议
  • 帧末尾是CRC校验码

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

  • 简单粗暴:固定字长
  • 以太网MAC帧的帧头和帧尾都是固定长度的(18字节),因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了

MAC帧如何决定将有效载荷交付给上层的哪一个协议?(如何分用)

  • MAC帧的帧头当中有2个字节的类型字段,该字段填写有协议的编号,如果是0800就是交付给IP协议,0806就是交付给ARP协议,0838交付给RARP协议
  • 因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可

数据碰撞

  • 由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰
  • 站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用
  • 在同一局域网中,如果多台主机同时发生数据(同一时刻),发送的数据就会互相干扰,就会造成数据碰撞,这些数据就变成了无效的数据,只能被丢弃
  • 每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞

如何知道发生数据碰撞了??

  • 通过碰撞检测算法进行检测,发生碰撞了通过碰撞避免算法解决

  • 如果检测到发生碰撞了,在数据链路层的协议就会触发策略,发生数据碰撞的主机就不发数据了,等一段时间再进行发送

  • 数据碰撞发生的概率比较低,如果局域网中的主机过多或者发送数据过多,也会容易发生碰撞

一个局域网不能很大,为什么??

  • 局域网太大,就意味着主机多,任何时刻发生碰撞的概率就增加了

如果一个局域网过大,就要引入一种设备,叫做交换机,交换机是工作在数据链路层的

  • 交换机的作用之一就是隔离,交换机可以识别局部性的碰撞,对碰撞的数据不进行转发
  • 例如,主机A和主机D发生了数据碰撞,交换机识别到了数据碰撞,就对该碰撞的数据不进行转发到右边的网络里,右侧的网络在一定程度上发生碰撞的概率就降低了
  • 交换机有效的对碰撞域进行了分割(划分碰撞域)

在这里插入图片描述

一台主机发送数据的时候,发送数据量长了好,还是短了好??

  • 数据量长了容易发生碰撞,数据量短了效率也低
  • 所以,对发送的数据帧要有一定的范围大小,既不能太大,也不能太小
  • 在以太网协议里,就有对发送数据的有效载荷大小有规定,有效载荷最小46字节,最大1500字节
  • 如果发送数据量小于46字节,则需要在数据后面补填充位,超过1500字节无法发送

在这里插入图片描述

最大传输单元 MTU

最大发送的有效载荷1500字节,1500字节就是MTU

  • 最大传输单元(Maximum Transmission Unit,MTU)是指在网络通信中,数据链路层能够传输的最大有效载荷的大小。MTU的大小通常由网络设备或网络协议规定,它限制了一次可传输的数据量
  • MTU默认的大小一般是1500字节,不同的数据链路层标准的MTU是不同的
  • 如果一次要发送的数据超过了MTU,则需要在IP层对数据进行分片

在Linux下使用ifconfig命令可以查看对应的MTU
在这里插入图片描述

三、MTU对上层协议的影响

MTU对IP协议的影响

  • 由于数据链路层MTU的限制,对于较大的IP数据包要进行分片
  • 分片已经在IP协议谈过了,不再赘述

MTU对UDP协议的影响

  • IP报头当中如果不携带选项字段,那么IP报头的长度就是20字节,而UDP采用的是定长的8字节报头
  • 因此如果UDP一次携带的数据超过了 1500 − 20 − 8 = 1472字节,此时数据就需要在IP层进行分片
  • 那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了

MTU对于TCP协议的影响

对于TCP来说,分片也会增加TCP报文丢包的概率,但与UDP不同的是TCP丢包后还需要进行重传,因此TCP应该尽量减少因为分片导致的数据重传

  • TCP的一个数据报也不能无限大, 还是受制于MTU
  • TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size)
  • TCP在建立连接的过程中,通信双方会进行MSS协商
  • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)
  • 双方在发送SYN的时候会在TCP报头写入自己能支持的MSS值
  • 然后双方得知对方的MSS值之后,选择较小的作为最终MSS
  • MSS的值就是在TCP首部的40字节变长选项中

MSS和MTU的关系如下:
在这里插入图片描述

  • 假设IP报头当中如果不携带选项字段,那么IP报头的长度就是20字节;TCP报头当中如果不携带选项字段那么IP报头的长度就是20字节
  • 即TCP的有效载荷最多1500-20-20 = 1460字节,即MSS的最大值

四、ARP协议

4.1 ARP协议的作用

ARP(Address Resolution Protocol)是一种根据IP地址获取MAC地址的协议,ARP是一个介于数据链路层和网络层之间的协议

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

  • 比如,数据从主机B经过各种路由转发到达主机C
  • 每两个相连的节点隶属于同一个子网,但是想给另一个节点发送数据,就必须知道对方的MAC地址
  • 但是每个节点只知道下一个直接相连节点的IP地址,因此每个主机必须通过某种方式得到下一个主机的MAC地址,只有知道了对方的MAC地址,才能给对方发数据

实际大部分情况下我们只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址
: ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议

ARP协议的定位

介于数据链路层和网络层之间
在这里插入图片描述

4.2 ARP协议报头

ARP协议报头如下:
在这里插入图片描述
字段解释:

  • 硬件类型:指链路层的网络类型,1为以太网
  • 协议类型:指要转换的地址类型,0x0800为IP地址
  • 硬件地址长度:对于以太网地址为6字节,因为MAC地址是48位的
  • 协议地址长度:对于IP地址为4字节,因为IP地址是32位的
  • op字段:为1表示ARP请求,op字段为2表示ARP应答

从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段

ARP请求的过程

同一局域网内,主机A想给主机B发送数据(知道IP地址),但是主机A不知道主机B的MAC地址,此时主机A就会触发ARP请求,把ARP请求广播到该局域网中,然后等待主机B发送ARP应答给主机A,最后得知主机B的MAC地址

主机A构建ARP请求流程如下:

  • 主机A构建的是ARP请求,所以ARP请求当中的op字段设置为1
  • ARP请求当中的硬件类型字段设置为1,表示以 以太网通信
  • ARP请求当中的协议类型设置为0800,代表的是使用另一台主机的IP地址来获取另一台主机的MAC地址
  • ARP请求当中的硬件地址长度和协议地址长度分别设置为6和4字节,因为MAC地址的长度是48位,IP地址的长度是32位
  • ARP请求当中的发送端以太网地址和发送端IP地址,对应就是主机A自己的MAC地址和IP地址
  • ARP请求当中的目的以太网地址和目的IP地址,对应就是主机B的MAC地址和IP地址,但由于主机A不知道主机B的MAC地址,因此将目的以太网MAC地址的二进制序列设置为全1,表示在局域网中进行广播

ARP请求构建完成,如下:
在这里插入图片描述

ARP请求构建完成后,需要向下交付给以太网协议,进行封装MAC帧,然后才能发送到以太网里

  • 封装MAC帧报头时,以太网源MAC地址对应主机A的MAC地址,以太网目的MAC地址对应主机B的MAC地址
  • 但由于主机A不知道主机B的MAC地址,因此MAC帧报头当中的以太网目的地址的二进制序列也只能设置为全1(16进制全F),表示在局域网中进行广播
  • 封装的是一个ARP请求数据包,因此MAC帧当中的帧类型字段设置为0806,代表ARP请求
  • 由于ARP请求数据包的长度只有28字节,不足46字节,因此还需要在MAC帧的有效载荷当中补上18字节的填充字段(PAD)

封装好的数据帧如下:
在这里插入图片描述

封装好MAC帧之后,就可以发送到局域网中了

  • 局域网中的每台主机都收到该数据帧,每台主机都会对该数据帧进行解包
  • 这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP协议
  • ARP协议对该ARP请求进行解包,首先查看OP字段,于是判定这是一个ARP请求
  • 然后再提取出ARP数据包当中的目的IP地址字段,与自己主机的IP地址进行匹配,不匹配直接丢弃该报文
  • 只有IP地址匹配的主机,才会构建ARP应答

ARP应答的过程

主机B进行构建ARP应答:(相同的地方就不再赘述)

  • ARP应答当中的op字段设置为2,代表ARP应答
  • ARP应答当中的源MAC地址和源IP地址,对应就是主机B的MAC地址和IP地址
  • ARP应答当中的目的以太网地址和目的IP地址,对应就主机A的MAC地址和IP地址(从ARP请求里获取)

ARP应答构建完成如下:
在这里插入图片描述

ARP应答构建完成后,需要向下交付给以太网协议,进行封装MAC帧,然后才能发送到以太网里

  • 封装MAC帧报头时,以太网源MAC地址对应主机B的MAC地址,以太网目的MAC地址对应主机A的MAC地址
  • 封装的是一个ARP应答数据包,因此MAC帧当中的帧类型字段设置为0835,代表ARP应答
  • 由于ARP请求数据包的长度只有28字节,不足46字节,因此还需要在MAC帧的有效载荷当中补上18字节的填充字段(PAD)

封装好的数据帧如下:
在这里插入图片描述
MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网当中了

  • 局域网当中的每台主机在底层都能收到这个MAC帧,只有主机A将解包后MAC帧的有效载荷向上交付给ARP协议
  • ARP收到这个数据包后,发现ARP数据包当中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包当中的源MAC地址和源IP地址
  • 此时主机A就拿到了主机B的MAC地址

ARP缓存表

ARP缓存表(Address Resolution Protocol Cache Table)是一种用于存储IP地址与MAC地址之间映射关系的缓存表

  • 当一台主机需要与另一台主机通信时,首先会检查自己的ARP缓存表,看是否已经有目标主机的IP地址与MAC地址的映射关系
  • 如果有,则直接使用该映射关系进行通信
  • 如果没有,则会发送一个ARP请求广播,询问局域网中的其他主机,以获取目标主机的MAC地址
  • 目标主机收到ARP请求后,会发送一个ARP回应,将自己的IP地址与MAC地址发送给请求方,请求方将这个映射关系存储到自己的ARP缓存表中

也就是说,一台主机需要与另一台主机通信时,并不是每次都会进行ARP请求,而是先去ARP缓存表里面查看是否有另一台主机的MAC地址

注意:ARP缓存表中的映射关系有一定的有效期限,如果在有效期限内没有再次使用该映射关系,系统会自动删除该条目,以保持ARP缓存表的更新和有效性(即ARP缓存表会不断更新,覆盖老的映射关系)

在Linux查看ARP缓存表,使用命令arp -a
在这里插入图片描述

ARP欺骗

ARP欺骗(ARP spoofing)是一种网络攻击技术,也被称为ARP缓存投毒(ARP cache poisoning

攻击者通过伪造ARP回应,将自己的MAC地址与其他主机的IP地址进行映射,从而欺骗网络中的其他主机

大致如下:

  • ARP协议是将IP地址转换为MAC地址的协议,它在局域网中进行通信时使用。当一台主机需要与另一台主机通信时,会发送一个ARP请求广播,询问目标主机的MAC地址
  • 目标主机收到ARP请求后,会发送一个ARP回应,将自己的IP地址与MAC地址发送给请求方
  • 目标主机收到ARP请求后,会发送一个ARP回应,将自己的IP地址与MAC地址发送给请求方
  • 在ARP欺骗攻击中,攻击者会发送伪造的ARP回应,将自己的MAC地址与其他主机的IP地址进行映射
  • 这样,当其他主机需要与目标主机通信时,会通过ARP缓存表中的映射关系发送数据给攻击者,而不是真正的目标主机
  • 攻击者可以利用这种方式进行数据窃取、中间人攻击等恶意行为

RARP协议

  • RARP(Reverse Address Resolution Protocol,逆地址解析协议)是一种与ARP相对应的协议
  • 与ARP协议将IP地址解析为MAC地址相反,RARP协议将MAC地址解析为IP地址

--------------------- END ----------------------

「 作者 」 枫叶先生
「 更新 」 2023.10.28
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】IOC快速入门

文章目录 1. Spring简介2. IOC快速入门 1. Spring简介 Spring是一个开放源代码的Java SE/EE一站式轻量级开源框架,由Rod Johnson发起并创立。其核心是IOC(控制反转)和AOP(面向切面编程),使得开发者可以将对…

『 C++类与对象』继承

文章目录 继承的概念继承方式与访问限定符基类和派生类对象赋值转换继承中的作用域隐藏 派生类的默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 继承与友元静态成员与继承关系 继承的概念 继承的机制为,允许在以该类为基础上对类进行扩展,增加功能; 通常原来也就是…

社区买菜系统 JAVA开源项目

目录 项目内容 项目获取 项目截图 项目内容 基于VueSpringBootMySQL的社区买菜系统,包含菜品分类模块、菜品档案模块、菜品订单模块、菜品收藏模块、收货地址模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、…

【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会

How Effective Are Neural Networks for Fixing Security Vulnerabilities 写在最前面摘要贡献发现 介绍背景:漏洞修复需求和Java漏洞修复方向动机方法贡献 数据集先前的数据集和Java漏洞Benchmark数据集扩展要求数据处理工作最终数据集 VJBenchVJBench 与 Vul4J 的…

Unity编辑器扩展之CustomPropertyDrawer理解

一、引言, 在上一篇文章中提到,CustomEditor只能自定义单一类,被其他类持有的类自定义没有作用,这个时候就需要使用CustomPropertyDrawer属性。 二、PropertyDrawer介绍 PropertyDrawer用于自定义属性绘制器的基类。使用Proper…

【办公自动化】wps word首字下沉/文字宽度/段落底纹/图片缩放/装订线(Word的相关操作)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

『第九章』雨燕新量子引擎:结构化并发

在本篇博文中,您将学到如下内容: 1. 千呼万唤始出来:结构化并发2. async/await3. “结构化(structured)”到底是个神马?3.1 async let3.2 TaskGroup4. 非结构化并发(unstructured concurrency)4.1 非异步上下文中的 Task4.2 Detached Task4.3 延时5. 任务(Task)的取消和…

168. Excel表列名称

168. Excel表列名称 Java代码: 26进制,但是每个进制是从1开始的,不是从0开始;因此要计算要构建从0开始的求余! class Solution {public String convertToTitle(int cn) {StringBuilder sb new StringBuilder();whi…

ElasticSearch快速入门实战

全文检索 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子…

Xtuner——报错解决汇总

文章目录 load_dataset读取jsonl文件报错 load_dataset读取jsonl文件报错 alpaca_en dict(typeprocess_hf_dataset,datasetdict(typeload_dataset, data_filesalpaca_file_path),tokenizertokenizer,max_lengthmax_length,dataset_map_fnalpaca_map_fn,template_map_fndict(t…

【C++初阶(三)】引用内联函数auto关键字

目录 前言 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的权限 1.4 引用的使用 1.5 引用与指针的区别 2. 内联函数 2.1 什么是内联函数 2.2 内联函数的特性 3. auto关键字 3.1 auto简介 3.2 auto使用规则 3.3 auto不能使用的场景 4. 基于范围的for循环 4.1 范围for…

一文2000字教你从0到1实现Jmeter 分布式压测

你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子,它模拟了同时有 5000 个用户,循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 ​结果分析 ​但是,实际企业中,这种压测方式根本不满足实际需求。下面…

技术资料MF74:将图像插入单元格注释

【分享成果,随喜正能量】须知往生净土,全仗信、愿。有信、愿,即未得三昧、未得一心不乱,亦可往生。且莫只以一心不乱,及得念佛三昧为志事,不复以信、愿、净念为事。。 我给VBA的定义:VBA是个人…

讯飞星火大模型V3.0 WebApi使用

讯飞星火大模型V3.0 WebApi使用 文档说明:星火认知大模型Web文档 | 讯飞开放平台文档中心 (xfyun.cn) 实现效果 初始化 首先构建一个基础脚手架项目 npm init vuelatest用到如下依赖 "dependencies": {"crypto-js": "^4.2.0",&q…

ClickHouse快速了解

简介 ClickHouse是一个开源列式数据库管理系统(DBMS),用于在线分析处理(OLAP): 列式存储:与传统的行式数据库不同,ClickHouse以列的形式存储数据,这使得在分析大量数据时…

嵌入式中C++ 编程习惯与编程要点分析

以良好的方式编写C class 假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。 ① Header(头文件)中的防卫式声明 complex.h: # ifndef __COMPLEX__ # define __COMPLEX__ class complex {} # endif 防止头文件的内容被多次包含。 …

2.25每日一题(反常积分的计算:被积函数分母出现e的正负x次幂)

注:被积函数分母出现e的正负x次幂,这种情况需要把分母化成全部都是正次幂的情况再进行计算

【C语言】字符函数、字符串函数与内存函数

简单不先于复杂,而是在复杂之后。 目录 0. 前言 1. 函数介绍 1.1 strlen 1.1.1 介绍 1.1.2 strlen 函数模拟实现 1.1.2.1 计数器方法 1.1.2.2 递归方法 1.1.2.3 指针 - 指针方法 1.2 strcpy 1.2.1 介绍 1.2.2 strcpy 函数模拟实现 1.3 strcat 1…

基于标签的电影推荐算法研究_张萌

2 标签推荐算法计算过程 2.1 计算用户对标签的喜好程度 用户对一个标签的认可度可以使用二元关系来表示,这种关系只有“是”“否”两种结果,实际上难以准确地表达出用 户对物品的喜好程度。因此&#x…

云耀服务器L实例搭配负载均衡部署Linux 可视化宝塔面板

云耀服务器L实例搭配负载均衡部署Linux 可视化宝塔面板 1. 华为云云耀服务器L实例介绍 华为云云耀服务器L实例是一种高性能、高可靠性的云服务器实例,适用于大规模企业级应用、大数据分析等场景。它基于华为最新一代的硬件虚拟化技术,提供了更高的计算…