数据链路层
在讲这个之前思考两个问题。
你为什么要把数据交给路由器F??
是因为我们的IP报文和目的IP不在一个子网内,需要跨子网通信,由目的网络的网络号决定的。
你怎么把数据交给路由器F??
这个就是我们这里要讲的东西了。
网络层是解决你为什么要交给路由器的,而数据链路层是解决你如何给它的。
以太⽹帧格式
认识MAC地址
MAC地址⽤来识别数据链路层中相连的节点;
⻓度为48位, 及6个字节. ⼀般⽤16进制数字加上冒号的形式来表⽰(例如: 08:00:27:03:fb:19)
在⽹卡出⼚时就确定了, 不能修改. mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地
址, 可能会冲突; 也有些⽹卡⽀持⽤⼾配置mac地址).
MTU对UDP协议的影响
让我们回顾⼀下UDP协议:
⼀旦UDP携带的数据超过1472(1500 - 20(IP⾸部) - 8(UDP⾸部)), 那么就会在⽹络层分成多个IP数
据报.
这多个IP数据报有任意⼀个丢失, 都会引起接收端⽹络层重组失败. 那么这就意味着, 如果UDP数据
报在⽹络层被分⽚, 整个数据被丢失的概率就⼤ 增加了.
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);
我们mac数据真,越长越好还是越短越好??
越长就发送时间越长,碰撞了概率就增加,就是我们之前讲的局域网通信。
mac越短,此时发送的效率也就很低了, 因为每次发送的字节数太少,所以要约定有效载荷的范围值46-1500,做实验做出来的。
一个局域网中,主机越多越好还是越少越好呢??
越少越好,因为越多碰撞的概率越大。
如果一个局域网中主机很多,怎么有效减少碰撞呢??
答案是存在一个交换机。
比如我们主机A要发送给主机E,此时你交换机左侧全部收到了,交换机也收到了,但是我的交换机此时只知道你的主机A是从我的左边来的,主机E我不知道在哪,此时我就往右侧发送我们的这个Mac帧,此时经过这个交换机不断学习的话,此时这个交换机就能清楚的知道我的主机的分布,知道之后,比如我主机A要给主机D发送消息,此时我就不让主机A的MAC帧去右侧,我知道你主机D在左侧,只需要让左侧主机收到即可。此时减少右侧数据碰撞的概率,这个交换机的作用就是划分碰撞域交换机也叫网桥。
此时如果交换机多了,这个大的局域网碰撞域划分为多个小碰撞域,此时就能减少碰撞概率了。
我们主机B通过去路由器F查路由表,查到了就去,查不到走缺省路由,然后继续向后找我们要走的路,但是此时有问题,你主机B到我的路由器F,我只知道你的IP地址啊,我不知道你的mac地址我如何做mac帧封装呢??
因为局域网中规定只有mac地址才能在局域网中传输,即使我们达到路由器D,我也只知道这个主机在我的这个子网中,我只知道它的IP,并不知道它的mac帧啊,那我怎么找到它呢??
简单来说就是我如何通过IP地址拿到mac地址呢??
因为只有mac地址才能在局域网中通信,所以,此时我们该如何做呢??
此时就要引出一个协议了。
ARP协议
我要给主机B通信,此时我就先得查路由表看看这个主机是否在我的局域网内,然后我会以广播的形式给主机B发送一个ARP请求包,此时这个局域网内都能收到,但是只有目的IP才能响应,此时他就给你响应过来它的MAC,此时你主机A就拿到了主机B的MAC地址,这就是一个ARP的过程。
注意到源MAC地址、⽬的MAC地址在以太⽹⾸部和ARP请求中各出现⼀次,对于链路层为以太⽹的
情况是多余的,但如果链路层是其它类型的⽹络则有可能是必要的。
硬件类型指链路层⽹络类型,1为以太⽹;
协议类型指要转换的地址类型,0x0800为IP地址;
硬件地址⻓度对于以太⽹地址为6字节;
协议地址⻓度对于和IP地址为4字节;
op字段为1表⽰ARP请求,op字段为2表⽰ARP应答。
我们ARP协议是存在在我们的数据链路层的,我们的MAC帧是需要发送ARP请求拿到的,此时我们的MAC帧就相当于ARP的下层,但是我们的ARP不需要再向上层交付,因为我没有用到上层的一些东西,所以此时这个ARP就是独立在数据链路层的,我们的一个主机不仅能收到对方ARP的响应就是你向对方发送一个ARP请求,对方应答你,然后其它主机也可能向你发送请求啊,你既可以是请求也可以收到应答。
这里的以太网首部其实就是MAC帧的报头的一部分内容。
我们拿一个图来填充一下这个应答头帮助我们的理解。
我们的路由R想去主机E发送ARP请求怎么填充的。
首先我们需要先填充后面的部分,就是如图的字段,前四个基本都是固定的格式,上面都有讲解,op就是代表我们是请求还是应答了,发送端的以太网地址就是我们的MAC地址,我们是知道的,就是macr表示,发送端IP我们也知道是IPr,目的以太网的地址我们是不知道的,就是对方的MAC地址我们不知道,但是我们知道是以广播的形式传播的,所以是FFFF FFFF FFFF 因为占六个字节48位,所以是12个F,目的IP我们也是知道的就是IPE,此时我们就把ARP封装好了,此时我们交给数据链路层的时候还要封装前面的就是这几个字段,以太网的目的地址依然是全FFFF FFFF FFFF 的因为是广播的形式传播,以太网的源地址我知道就是macr,帧类型
我们ARP请求时0806,此时填上即可,此时我们就完成了数据链路层的ARP封装了,此时就交到我们的这个局域网中,此时你觉得主机A会让这个ARP请求进入数据链路层吗??
答案是会的,因为以太网的目的IP时广播,都可以收到,进去之后,把数据链路层解析了,拿到我们封装的ARP了,此时通过目的IP我们可以确定不是我主机A,此时在主机A的ARP层就被丢弃了,这就是这个过程,直到我们找到主机E,主机E解析之后发现是我们,此时更改一下这个ARP封装,此时你主机E就可以把MAC帧地址放进去了,此时继续看这个图。
首先前四个还是固定的,op就变成2了,因为我是应答ARP的,发送端以太网地址就是MACE了,发送端IP地址是IPE,目的以太网地址我们还是直到MACR,因为发送的时候带的有,目的IP也知道是IPR,此时就完成了ARP封装,然后交给数据链路层封装,此时就是以太网目的地址是MACR,以太网源地址是MACE,帧类型还是0806代表ARP,此时就完成了封装,重新发送到网络中的时候,此时其它主机收到了,数据链路层收到了,但是通过对比自己的以太网目的地址发现不是自己,直接在数据链路层就丢弃了,直到发给我们的路由器R,此时就拿到目的主机的MAC帧地址了。
所以我们跨国通信也是需要发送ARP请求拿到我们中国的国际路由的MAC地址了。
我们难道每次访问这个主机,每次都要进行ARP吗??
不是的,我们的ARP会自动缓存就是该主机IP和该主机ARP的映射关系。
缓存不是永久的,因为我们的这台主机重启一次可能IP和MAC地址都会发生改变的。
RARP就是把MAC地址转化为IP地址,不过多讲解。
