Linux —— 数据链路层
目录1. 认识以太网1.1 以太网帧格式1.2 认识MAC地址1.3 对比理解MAC地址和IP地址1.4 认识MTU1.5 MTU对IP协议的影响1.6 MTU对UDP协议的影响1.7 MTU对于TCP协议的影响2. ARP协议2.1 ARP协议的作用2.2 ARP协议的工作流程2.3 ARP数据报的格式3. RARP协议将主机B的数据跨网络送到主机C1. 为什么要把数据交给路由器FIP报文的目的IP所标识的目标网络所决定的IP解决的是你把报文为什么要交给下一跳的问题。2. 怎么把数据交给路由器F局域网通信的问题 --- 数据链路层解决TCP、UDP提供传送策略IP网络层提供路由的理由链路层提供具体报文从一个局域网到另一个局域网的问题1. 认识以太网以太网 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理层的内容. 例如: 规定了⽹络拓扑结构, 访问控制方式, 传输速率等;例如以太网中的网线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等;以太网是当前应用最⼴泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;双绞线1.1 以太网帧格式以太网的帧格式如下所示源地址和目的地址是指网卡的硬件地址(也叫MAC地址), ⻓度是48位,是在网卡出厂时固化的;帧协议类型字段有三种值,分别对应IP、ARP、RARP;帧末尾是CRC校验码。1.2 认识MAC地址MAC地址⽤来识别数据链路层中相连的节点;长度为48位, 及6个字节. ⼀般⽤16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)在网卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)。mac地址1.3 对比理解MAC地址和IP地址IP地址描述的是路途总体的 起点 和 终点;MAC地址描述的是路途上的每⼀个区间的起点和终点;MAC地址在局域网中有效MAC地址会随封包和解包的过程会一直变化IP地址在广域网中有效尤其是目的IP会随着报文的转发目的IP不变1.4 认识MTUMTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产⽣的限制.以太网帧中的数据长度规定最小46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填充位;最⼤值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;如果⼀个数据包从以太网路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);不同的数据链路层标准的MTU是不同的;1.5 MTU对IP协议的影响由于数据链路层MTU的限制, 对于较⼤的IP数据包要进行分包.将较大的IP包分成多个小包, 并给每个小包打上标签;每个小包IP协议头的 16位标识(id) 都是相同的;每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后⼀个小包, 是的话置为1, 否则置为0);到达对端时再将这些小包, 会按顺序重组, 拼装到⼀起返回给传输层;⼀旦这些小包中任意⼀个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;1.6 MTU对UDP协议的影响让我们回顾⼀下UDP协议:⼀旦UDP携带的数据超过1472(1500 - 20(IP⾸部) - 8(UDP⾸部)), 那么就会在网络层分成多个IP数据报。这多个IP数据报有任意⼀个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大增加了.1.7 MTU对于TCP协议的影响让我们再回顾⼀下TCP协议:TCP的⼀个数据报也不能⽆限⼤, 还是受制于MTU. TCP的单个数据报的最⼤消息长度, 称为MSS(Max Segment Size);TCP在建立连接的过程中, 通信双方会进行MSS协商.最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.MSS的值就是在TCP⾸部的40字节变长选项中(kind2);MSS 和 MTU 的关系在局域网中如何完成mac帧数据通信主机B将报文发送到局域网中填写Mac帧封装Mac帧写目标路由器的Mac地址源Mac地址然后再发送下一个整个报文的转发过程本质就是跨局域网/子网通信的过程。为什么交给路由器F是IP决定的如何将报文交给路由器F是Mac帧决定的所以封装Mac帧。主机B将数据交给路由器F主机B一定要知道路由器F的IP地址路由器D只知道目的IP不知道源IP是什么路由器D要将数据转发给主机C必须要将数据封装Mac帧那么就必须要知道目的IP所对应的主机的Mac地址主机B只知道路由器F的 IP地址要把数据发送给路由器F就必须要封装Mac帧就必须要知道对方的Mac地址不知道的话即便知道IP也无法发送数据因为局域网通信无法做到(在路上跑的都是Mac帧不是IP报文)在同一个子网中(广域网/局域网一样的)给目标主机发送数据帧必须知道对方的目的mac地址 - 我只知道下一跳主机的IP地址需要将 IP - Mac 就是对应的ARP协议地址解析协议2. ARP协议虽然我们在这⾥介绍ARP协议, 但是需要强调, ARP不是⼀个单纯的数据链路层的协议, ⽽是⼀个介于数据链路层和⽹络层之间的协议;2.1 ARP协议的作用ARP协议建⽴了主机 IP地址 和 MAC地址 的映射关系.在⽹络通讯时,源主机的应⽤程序知道⽬的主机的IP地址和端⼝号,却不知道⽬的主机的硬件地址;数据包⾸先是被⽹卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯前必须获得⽬的主机的硬件地址;2.2 ARP协议的工作流程主机A收到一个报文要去遥远的目标主机在主机A中查找路由表子网掩码目的IP进行按位与得到应该要将数据发给主机B所以下一跳的地址是主机B所以才有了主机A和主机B通信的需求源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求⼴播到本地网段(以太⽹帧⾸部的硬件地址填FF:FF:FF:FF:FF:FF表示⼴播);⽬的主机接收到⼴播的ARP请求,发现其中的IP地址与本机相符,则发送⼀个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;每台主机都维护⼀个ARP缓存表,可以⽤arp -a命令查看。缓存表中的表项有过期时间(⼀般为20分钟),如果20分钟内没有再次使⽤某个表项,则该表项失效,下次还要发ARP请求来获得⽬的主机的硬件地址想⼀想,为什么要有缓存表? 为什么表项要有过期时间而不是⼀直有效?再想⼀想, 结合我们刚才讲的⼯作流程, ARP的数据报应该是⼀个什么样的格式?2.3 ARP数据报的格式注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现⼀次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网;协议类型指要转换的地址类型,0x0800为IP地址;硬件地址长度对于以太网地址为6字节;协议地址长度对于和IP地址为4字节;op字段为1表示ARP请求,op字段为2表示ARP应答。以主机B为例将报头和有效载荷分离主机B先判定目的Mac地址是全F是广播主机B要受理这个请求识别到帧类型是0806arp将arp请求交给arp层主机B一旦拿到arp就会发现你要请求的是目的IP地址是IPE而我是IPB不相等主机B在ARP层直接丢弃这个报文主机C和主机D都是一样的。主机E先看OP字段(ARP类型)再去看目的IP地址然后主机E构建ARP应答其它的主机也同样收到应答以主机B为例先做报头和有效载荷的分离先看目的Mac地址发现目的Mac地址不是广播了请求的是MacR但是我是MacB此时应答直接在链路层的Mac帧就丢掉了。路由器R收到了应答报头和有效载荷分开发现目的Mac地址就是自己先看OP字段结论无论如何任何主机收到ARP先看OP字段知道是应答提取发送方的Mac地址和发送方的IP地址至此路由器就得知了IPE所对应的MacE的地址然后再把收到的IP报文重新封装源Mac目的Mac从此局域网就发送过去了。ARP会将映射结果进行缓存缓存时间一般都是十几二十分钟级别的为什么不是永久的呢永久记住是不对的路由器本身是构建子网的能力一台主机下线了网断开在重新连接此时的IP地址就会发生变化有可能还会出现更换网卡的情况所以Mac地址极有可能会发生变化缓存也只是一种缓存方式过一段时间要重新缓存以保证获得ARP映射关系是最新的。Linux下arp -aWindows下arp -a3. RARP协议帧类型是8035的时候就是RARP协议RARP协议把Mac地址转换成IP地址
