目录
1. 认识以太网
1.1 以太网帧格式
1.2 认识MAC地址
1.3 对比理解MAC地址和IP地址
1.4 认识MTU
1.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的数据跨网络送到主机C:
1. 为什么要把数据交给路由器F??
IP报文的目的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 认识MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产⽣的限制.
- 以太网帧中的数据长度规定最小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字节变长选项中(kind=2);
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要受理这个请求,识别到帧类型是0806,arp,将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 -a
Windows下:arp -a
3. RARP协议
帧类型是8035的时候就是RARP协议,RARP协议:把Mac地址转换成IP地址