【Linux】网络编程 —— 数据链路层 欢迎来到Linux专栏 ~~ 网络编程博客主页张小姐的猫~江湖背景所属专栏Linux ~ 不破不立作者水平很有限如果发现错误可在评论区指正感谢网络编程欢迎来到Linux专栏 ~~ 网络编程认识以太网以太网的帧格式数据链路层的发送实况交换机ARP协议✅ARP的原理✅ARP的缓存表✅ARP欺骗RARP协议写在最后所谓的跨网络通信本质上其实还是把多个局域网进行串联的过程 ——实际上在网络里跑的报文都是数据帧数据链路层中的所以我们就需要学习局域网的通信协议以太网的数据链路层认识以太网以太网不是⼀种具体的网络而是一种技术标准既包含了数据链路层的内容也包含了⼀些物理层的内容。例如规定了网络拓扑结构访问控制方式传输速率等例如以太网中的网线必须使用双绞线传输速率有10M100M1000M等以太网是当前应用最广泛的局域网技术和以太网并列的还有令牌环网无线LAN等也就是站在IP层时看不到底层网络的任何特点的一切皆IP——虚拟化技术的体现以太网的帧格式源地址和目的地址是指网卡的硬件地址(也叫MAC地址)长度是48位是在网卡出厂时固化的帧协议类型字段有三种值分别对应IP、ARP、RARP帧末尾CRC校验码mac地址用来表征在局域网内的唯一性——六字节mac地址类似于我们的身份证在全球上也是唯一的但是只能在中国能用并且唯一在全球上唯一不代表就能在全球范围上使用实际上在数据链路层收到的报文有可能是网络层orARPorRARP三者的其中一个发的同理未来接收方收到数据帧同样要向上进行交付这三者的其一。1️⃣接收方如何分离报头和有效载荷采用的是固定长度的格式前面的目的地址 源地址 类型共14字节分离后面的4字节的CRC也分离 —— 剩下的就是有效载荷了拼接也是同理的2️⃣接收方如何进行分用根据2字节的类型来决定交付给上层的什么协议对比理解MAC地址和IP地址还是[唐僧西行的例子]IP地址描述的是路途总体的起点和终点MAC地址描述的是路途上的每一个区间的起点和终点数据链路层的发送实况局域网的通信原理一个主机发送报文所有的主机都能收到大家根据目的mac地址来判断是不是发给自己的不是的就丢弃造成了我们认为主机A给主机B通信是单独通信的错觉在一个局域网里A和B想通信B和C也想通信等等大家都往一个以太网里发送数据的话必然会出现光电信号的干扰—— 所以一个以太网也是一个碰撞域为了防止数据碰撞就要进行数据检测和避免碰撞避免的本质是在数据链路层对数据进行延迟重发—— 重传机制凡是出现数据碰撞的就都要进行延迟重发让其他数据先传不就是要求任何时刻只允许一台主机发送数据吗就会引出两个问题1️⃣数据帧长度是否影响碰撞的概率如果一个数据帧的长度很长导致这一批的数据都要进行重传 —— 代价过高mac帧在通信的本质利用以太网的空闲进行通信 利用所有主机的通信间隙来进行通信所以制造出更多的通信间隙要求每一台主机发送数据时不要长时间占用以太网不就可以提升通信的效率一个一万大小的报文 和 十个一千大小的报文更加倾向于十个一千大小的报文造成九个间隙也不用过多的担心数据碰撞 ——光电信号速度很快它的这个物理特性就导致它的效率不会太低 —— 所以不用太担心因为碰撞避免导致效率问题2️⃣主机增多会增加碰撞概率吗客观上是你肯定的但是我们是感受不到发生了碰撞的 —— 应该会感觉到网速变慢本质就是单位时间内通过局域网出去和进来的报文数量减少了局域网发送碰撞了进而做碰撞避免 —— 单位时间的吞吐量降低那么为了避免在局域网中主机增多尽可能不要减少我们数据发送碰撞的一种设备 —— 交换机交换机交换机存在的意义划分碰撞域下图不就划分了两个碰撞域ABD 和 CE 那么左侧区域进行通信时不就和右侧不冲突了嘛接着来聊聊交换机的原理交换机通过学习设备的MAC地址建立MAC地址表然后根据目的MAC地址把数据帧转发到正确的端口交换机会自己进行学习对局域网内部信息做动态学习的设备如果收到了左侧的A设备的数据就能知道主机A肯定是在左侧就记录下MACA的地址 —— 就把数据传给右侧后续主机E接收到报文进行返回时交换机也一定能知道macE是一定在交换机的右侧不断学习就能知道左右两侧有哪些mac地址了左侧的主机A继续给D发数据数据先经过交换机交换机一看发现A 和 D都在我的左侧就不做通信直接把该数据帧丢弃后续让A 和 D自己通信数据链路层只保证在局域网中发出并且不发生碰撞至于对方有没有收到是不确定的因为没有应答IP地址负责确定最终/下一跳的逻辑位置MAC地址负责在当前局域网中把帧送到具体设备比如得知了下一跳的IP地址是192.168.1.1 这个包下一步应该交给 IP 地址为 192.168.1.1 的路由器但是网卡不能直接把一个IP地址 放到以太网里进行转发┌──────────── 以太网帧 ────────────┐│ 目的 MAC │ 源 MAC │ IP 数据包 │└─────────────────────────────────┘所以我们必须要知道192.168.1.1→ 对应哪个MACARP协议ARP不是⼀个单纯的数据链路层的协议而是⼀个介于数据链路层和网络层之间的协议ARP协议建⽴了主机IP地址和MAC地址的映射关系在网络通讯时源主机的应用程序知道目的主机的IP地址和端口号却不知道目的主机的硬件地址数据包首先是被网卡接收到再去处理上层协议的如果接收到的数据包的硬件地址与本机不符则直接丢弃因此在通讯前必须获得目的主机的硬件地址目的ip —— 子网掩码 目标网络 —— 下一跳ip地址下一跳ip地址不等于目的ip那我们知道了下一跳ip这个mac地址我们是如何得知的呢——在同一个网段中必须要能把下一跳IP地址转化为下一跳主机的MAC地址✅ARP的原理ARP的过程是先进行广播然后再1:1发送MAC地址的过程ARP协议的工作流程源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);目的主机接收到广播的ARP请求发现其中的IP地址与本机相符则发送⼀个ARP应答数据包给源主机将自己的硬件地址mac填写在应答包中再想⼀想结合我们刚才讲的工作流程ARP的数据报应该是⼀个什么样的格式?所以arp报文就存放在mac帧的有效载荷里大小为固定长度28字节注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现⼀次对于链路层为以太网的情况是多余的但如果链路层是其它类型的网络则有可能是必要的硬件类型指链路层网络类型1为以太网协议类型指要转换的地址类型0x0800为IP地址硬件地址长度对于以太网地址为6字节协议地址长度对于和IP地址为4字节 —— 一般前四个都固定op字段为1表示ARP请求op字段为2表示ARP应答任何主机可能被别人发起ARP该主机可能会受到ARP请求任何主机也可能曾经向别人发起过ARP未来一定会得到对应的应答该主机也可能会受到ARP应答接下来继续完整具体的通信过程因为该mac帧是广播类型的所以任何主机都能收到并且拆分此报文继续向上传递给arp层但发现目的ip地址是IPE只要不是主机E收到此报文就会进行丢弃 —— 在arp层进行丢弃主机E收到报文拆分完后首先看op字符是多少1 — arp请求2 — arp应答接着再去看目的IP地址对比发现就是发给我的 —— 于是开始构建arp应答了继续向下封装mac帧把这个mac帧发送到局域网里主机B能收到这个报文但是对比了以太网目的地址后发现macA不是自己就直接丢弃请求的丢弃和应答的丢弃是不一样的请求因为是广播要到arp层才丢弃应答的丢弃则是在mac帧层就丢弃了所以对于任何的arp报文只要对应的层收到arp请求永远先看OP字段因为不知道收到的是什么请求还是应答。如果发现op是2就直接看报文中发送端的以太网地址macE这样主机A不就能得到主机A的mac地址了吗 —— 实现了arp的作用这一通操作下来我已经知道了对方的mac地址了 —— 接着不就是封装mac帧进一步地发送数据如果我在美国要发数据给中国的一个主机先通过ARP广播 — 应答拿到对方的mac地址。不就可以封装好自己mac帧 正常发送数据了✅ARP的缓存表在整个通信的过程中ARP的工作是在每个各自的局域网里可能会一直产生所以这样沿路不断产生arp对网络压力有点大arp的本质ip地址和mac地址的映射关系。主机会将这种关系缓存起来 ——提高效率每台主机都维护⼀个ARP缓存表可以用arp-a命令查看。缓存表中的表项有过期时间(⼀般为20分钟)如果20分钟内没有再次使用某个表项则该表项失效下次还要发ARP请求来获得目的主机的硬件地址如果我想要得到局域网内网中所有的IP地址和所对应的mac地址该怎么做ping命令可以直接使用网络层的一些功能直接向目标主机发送IP报文不需要tcp、udp就必然会进行arp拿到mac地址所以ping命令可以用它来促使我们向目标主机发送ARP的过程可以先构建出一批虚拟的ip地址再逐个进行ping它最后就能知道哪些是有效的ARP缓存表的缓存时间默认是分钟级别的为什么不能设置成缓存永远生效因为用户的主机有可能会离线同一个电脑会向路由器申请多个IP地址也就是IP地址会变如果把缓存表里的ip与mac地址映射关系定死了不就是拿前朝的剑斩本朝的官吗还有可能就是主机的mac地址变换了主机更换一个网卡这样地址映射关系就要重新进行✅ARP欺骗因为ARP缓存对同记录只会记录最新的信息中间人攻击—— 可以盗取两个主机通信的数据了RARP协议那么如果需要将 mac 转化成 IP 地址呢 ——逆地址解析协议这样的实现一定比ARP更加容易的因为我已经知道了你的mac地址了不就可以直接向你发你应答时把你对应的IP地址给我不就可以了ARP 仍然广泛使用而RARP基本已经被 BOOTP/DHCP取代写在最后接下来登场的是 NAT