目录
一、认识以太网
前面,我们讲到了网络层的IP协议,它通过目的IP,子网划分,路由表查找及其算法等方式让IP报文能够从一个主机到另一个主机。但是,IP协议没有解决设备转发的具体功能,而只是提供了一个转发的策略。
在局域网中,数据报文的具体转发,怎么从一个主机到另一个主机的具体方式是由数据链路层协议来实现的。
要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机,而两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题。
所以说,数据链路层解决的是同一个局域网中两台相连主机之间的数据传输的问题。
以太网
"以太网" 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容, 例如:规定了网络拓扑结构,访问控制方式,传输速率等。
例如以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等。
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等。
二、以太网帧格式
以太网帧格式如下:
源地址和目的地址是指网卡的硬件地址(即MAC地址),长度是48位,是在网卡出厂时就标定好了的。 且每个主机的MAC地址是全球唯一的。
帧协议类型字段有三种值,0800,0860,8035分别对应IP协议、ARP协议和RARP协议,后面两种协议后面会讲。
帧末尾是CRC校验码。
MAC帧如何将报头与有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的,因此当数据链路层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
MAC帧如何知道将有效载荷交付给上层的哪一个协议?
数据链路层MAC帧对应的上层网络层的协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
局域网通信原理
MAC地址用来识别数据链路层中相连的节点。
长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示。
对于上图。现在主机1想要给主机6发送消息。主机1封装MAC帧当中的目的地址就是主机6的MAC地址,源地址就是主机1的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应就是CRC校验。
当主机1将该MAC帧发送到局域网当中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机1自己。
主机6收到该MAC帧后,提取出MAC帧当中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就会将有效载荷交付给上层IP层进行进一步处理。
局域网中的其他主机收到该MAC帧后,也会提取出MAC帧当中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃掉。
主机1收到该MAC帧后,可以对收到的MAC帧进行CRC校验,如果校验失败则说明数据发送过程中产生了碰撞,此时主机1就会执行碰撞避免算法,后续进行MAC帧重发。
总结:当主机的数据链路层收到一个MAC帧后,会根据MAC帧当中的目的地址来判断该MAC帧是否是发给自己的,如果是发送给自己的则会再对其进行CRC校验,如果校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理。
碰撞避免算法
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。
所以说,当局域网中有多个主机在同时发送消息的时候,就会发生数据碰撞。
那么只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法,即:主机在等待一段时间后重新发送数据。
数据跨网络传输原理
我们现在要将主机A的消息传输给主机B。
首先,主机A要将数据传输给与自己在同一个局域网的路由器A,于是它从上到下封装数据。在网络层通过查询路由表,知道了下一步应该去往路由器A,于是向下交付给数据链路层封装MAC帧,目的地址就是路由器A的MAC地址,源地址就是主机A的MAC地址。
此时主机A所在局域网当中的所有主机都能收到这个MAC帧,但最终只有路由器A发现该MAC帧当中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给网络层IP协议。
路由器A的网络层IP协议,将IP报头和有效载荷分离后,提取出了目的IP,然后通过查询路由表后确定需要将该数据转发给路由器B。于是向下交付给数据链路层封装MAC帧,目的地址就是路由器B的MAC地址,源地址就是路由器A的MAC地址。这样就可以去往路由器B了。
就这样,数据报经过一跳一跳,最终就能够到达主机B了。
所以,数据在进行跨网络传输时,其对应的源IP地址和目的IP地址一般是不会变化的,而该数据的源MAC地址和目的MAC地址却是一直在变化的。
三、MTU
1、以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
2、最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
3、如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(IP协议)。
4、不同的数据链路层标准的MTU是不同的。
MUT对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片,然后才能将分片后的数据向下交付。IP报文的分片和组装在上一文中已经讲过了。这就不再赘述了。
MTU对TCP协议的影响
对于TCP来说,分片会增加TCP报文丢包的概率,而TCP丢包后还需要进行重传,因此TCP应该尽量减少因为分片导致的数据重传。
所以TCP发送的数据报不能无限大,应该受制于MTU,我们将TCP的单个数据报的最大报文长度,称为MSS。
TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。MSS的值实际就是在TCP首部的40字节的选项字段当中。
当然,在将IP协议的时候我们也说过了,最理想的情况是TCP协议严格控制每次传输数据的大小,使报文不会被分片。
四、ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
为什么要有ARP协议?
上面我们讲到,IP报文在向下交给数据链路层后,将由其对IP报文进行封装,形成MAC帧,这样才能在局域网中,进行转发,到达下一个主机。可是,数据链路层能够封装MAC帧的前提应该是先知道下一个主机的MAC地址,那么怎么才能知道同一局域网中其他主机的MAC地址呢?
对于IP地址,我们有专门的路由表,这样主机就可以知道另一个主机的IP地址,通过路由表我们就能够知道报文该去往哪个网段。那么可不可以像路由表一样将局域网中所有主机的MAC地址保存起来呢?当然是不行的,因为一个局域网中就有大量的主机,主机数量可比局域网多多了,这样维护成本就太大了。
也就是说,在同一个局域网中要给对方发消息,就必须得知道对方的MAC地址,而实际大部分情况下我们只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。
ARP协议
ARP协议和RARP协议也是属于数据链路层协议。
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议。也就是说,MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议,就是位于MAC帧的上层。
ARP协议格式
硬件类型指链路层的网络类型,1为以太网。
协议类型指要转换的地址类型,0x0800为IP地址。
硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
协议地址长度对于IP地址为4字节,因为IP地址是32位的。
op字段为1表示ARP请求,op字段为2表示ARP应答。
ARP协议的工作过程
主机A想要给主机B发信息,那么主机A要先知道主机B的MAC地址。于是主机A构建ARP请求。
ARP请求
因为构建的是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地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播。
ARP请求构建完成后,还需要将ARP数据包向下交付给MAC帧协议,封装成MAC帧。
MAC帧封装完毕后,主机A就可以将封装好的MAC帧以广播的方式发送到局域网当中了。
因为这个MAC帧是以广播的方式发出的,因此局域网当中的每台主机收到这个MAC帧后,都会对该MAC帧进行解包。当这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层。
当ARP层收到这个数据包后,发现ARP数据包当中的op字段为1,于是判定这是一个ARP请求,然后再提取出ARP数据包当中的目的IP地址字段,虽然局域网当中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机B发现ARP数据包当中的目的IP地址与自己相同,因此只有主机B会对该ARP请求进行应答,而局域网当中的其他主机在识别到ARP数据包当中的目的IP地址与自己不匹配后,就会直接将这个ARP请求报文丢弃。
ARP应答
因为主机B构建的是ARP应答,因此ARP应答当中的op字段设置为2。
ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求当中设置的值相同。
ARP应答当中的发送端以太网地址和发送端IP地址,对应就是主机B的MAC地址和IP地址。
ARP应答当中的目的以太网地址和目的IP地址,对应就是主机A的MAC地址和IP地址。
ARP协议封装好后,向下交付封装MAC帧。最终的MAC帧如下:
MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网当中了。
此时局域网当中的每台主机在底层都能收到这个MAC帧,但大部分的主机,在发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终只有主机A会将解包后MAC帧的有效载荷向上交付给自己的ARP层。
当主机A的ARP层收到这个数据包后,发现ARP数据包当中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包当中的发送端以太网的地址和发送端IP地址,此时主机A就拿到了主机B的MAC地址。
ARP缓存表
实际上,我们并不是每次都要在获取对方的MAC地址时都需要发起ARP请求,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,我们可以用arp -a命令进行查看。
当然,这个缓存表并不是能够一直保存映射关系,它是有过期时间的,一般是20分钟。20分钟过后就会失效,需要重新发送ARP请求来获取MAC地址。
什么时候需要发起ARP请求?
我们刚才说的只是主机A要将数据发送给主机B的时候,需要通过ARP请求获得主机B的MAC地址,但实际数据在路由过程中的每一跳可能都需要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时我们一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的。
ARP请求不能够跨网络传输,它只在局域网内有效。