数据链路层协议
- 一、链路层解决的问题
- 二、以太网协议
- 1、局域网技术
- 2、令牌环网(了解)
- 3、以太网通信原理
- 4、 MAC地址
- 5、以太网帧格式
- 6、碰撞避免
- 7、最大传输单元MTU
- 二、ARP协议
- 1、ARP数据的格式
- 2、ARP协议的工作流程
- 3、ARP缓存表
- 4、ARP协议中的一些问题
- 7、成为中间人的一种方式——ARP欺骗
- 6、RARP协议
一、链路层解决的问题
-
IP拥有将数据跨网络从一台主机送到另一台主机的能力,但是我们会发现但数据在网络传输时需要一跳一跳的从一个局域网跳到另一个局域网,最终才能将数据转发到目标主机。
-
因此要将数据发送到目标主机的前提是:在一个局域网内如何将数据进行转发,而两台主机在一个局域网内也就意味着这两台主机属于同一网段(网络号相同),因此将数据转发到下一跳主机(通常是路由器)实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题。
- 数据链路层属于驱动层,其向下可以屏蔽物理层中介与传输介质的不同,以及通信,规程协议的不同,从逻辑上构建一条性能稳定,不受传输介质类型影响的人物及数据传输通道。
二、以太网协议
1、局域网技术
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
- 以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术。
- 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包。
- 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分。
虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议来说,它们并不需要关心底层具体使用的是哪种局域网技术。
- 数据在发送之前会先进行数据封装,此时链路层会给数据封装上对应的局域网的协议报头。
- 如果数据要进行跨网络传输,那么就需要经过路由器转发。
- 当数据在路由器进行向上交付时,会将该数据对应的局域网报头去掉,而当路由器该数据转发给下一跳之前,又会给该数据封装上下一跳网络所对应的局域网报头。
也就是说,网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越。
2、令牌环网(了解)
- 令牌环网(Token-ring network)的传输方法在物理上采用了星形拓扑结构,但逻辑上是环形拓扑结构。
- 令牌环网的通信传输介质可以是无屏蔽双绞线、屏蔽双绞线和光纤等。
- 令牌环网中各节点间采用多站访问部件(Multistation Access Unit,MAU)连接在一起,MAU是一种专业化集线器,用来围绕工作站计算机的环路进行传输。
在令牌环网中有一种专门的帧称为“令牌”,这个“令牌”会在环路上持续地传输,只有拿到“令牌”的主机才能发送数据,因此发送出去的数据不会发生碰撞。
3、以太网通信原理
-
“以太网”不是一种具体的网络,而是一种技术标准,它既包含了数据链路层的内容,也包含了一些物理层的内容。例如,以太网规定了网络拓扑结构,访问控制方式,传输速率等。
-
以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等。
-
以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据,包括自己。
例如下面的一个以太网
当局域网中的主机A想要发送数据给主机E时,其实局域网当中的每一台主机都能收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付。
局域网当中的其他主机虽然也收到了主机A发出的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付。
扩展:
-
网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接收所有经过它的数据流,并向上交付给IP层而不论其目的地址是否是它,这也是许多抓包攻击的基本原理。
-
网络抓包不仅能够抓到发送给自己的报文数据,也能抓取到发给别人的报文数据,实际就是因为在进行网络抓包时,主机将从局域网中收到的所有报文数据都向上交付了而已。
4、 MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,即6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突。也有些网卡支持用户配置mac地址)
5、以太网帧格式
-
源地址和目的地址是指网卡的硬件地址(也叫MAC地址)。
-
类型字段有三种值,表示MAC帧数据是什么协议的数据,
0800
对应IP协议、0806
对应ARP协议和8035
对应的是RARP协议。 -
MAC帧数据,其大小是有限制的
46~1500
字节。 -
帧末尾是CRC校验码
以太网协议的解包
以太网MAC帧的帧头和帧尾都是固定长度的总共有18个字节,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
以太网协议的分用
以太网MAC帧对应的上层协议不止一种,在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段就可以有效载荷交付给对应的上层协议,完成报文的分用。
6、碰撞避免
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰,所以一个局域网又称为一个碰撞域。
站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。
碰撞避免算法
对于如何解决这个数据相互碰撞的问题,以太网的做法是:
-
先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。
-
所谓的碰撞避免算法就是,由于主机发送出去的数据在局域网内所有主机都能够收到(本主机也能够收到),所以本机就可以对收到的数据与源数据进行CRC检验,如果检验没有出现问题,就说明本次发送的数据没有被经过碰撞。
-
当主机发送出去的数据产生碰撞时,碰撞的所有主机各自等待一段随机时间后再进行数据重发,在发生碰撞的主机等待的时候就能够尽可能让局域网当中的数据消散,以及给其他主机发送数据的机会。
-
不必过于担心数据一直在碰撞导致数据一直无法从局域网中发送出去,因为在一个通信信道内数据的发送速度是很快很快的,接近于光速。
碰撞避免算法就是主机等待一段时间后重新发送数据,因此以太网底层也有重传机制,只不过以太网的重传机制只是为了保证将数据从局域网中的一台主机发送到另一台主机。
从系统角度看:
令牌环网当中的“令牌”就像系统当中用于保护临界资源的互斥锁一样,“令牌”与互斥锁一样也有“忙”和“闲”两种状态,“忙”表示令牌已经被占用,而“闲”则表示令牌没有被占用。
想要发送数据的计算机必须首先检测到“闲”令牌,并将其置为“忙”状态,然后才可以发送数据,这就和申请互斥锁的过程很像。
此外,由于“令牌”在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,它们获取令牌的机会都是相等的,因此不会造成某台主机发送数据的饥饿问题。
交换机
随着网络的发展,局域网中的主机越来越多,为了更好的解决数据碰撞问题,诞生出了一种硬件设备——交换机。
交换机工作在数据链路层,可以用来隔离冲突域,交换机可以对MAC帧数据进行转发,在每个交换机中,都有一张MAC地址表,这个表是交换机自动学习的。
交换机的作用:
- 连接多个以太网物理段,隔离冲突域
- 对MAC帧进行高速而透明的交换转发
- 自行学习和维护MAC地址信息
例如,当区域1中的主机A与主机B进行数据发送时,发生了数据碰撞,其碰撞不会被广播到区域2中,所以在同一时刻主机F也想进行数据发送时,不会受到区域1碰撞的影响,能够成功发送数据。
又或者同一区域内的主机进行通信时不会影响其他区域,当被交换机分割的不同区域需要进行通信时,可以由交换机进行数据的交换,这样就能够将碰撞域进行减小和隔离,来确保较少的发生数据碰撞。
7、最大传输单元MTU
MTU(Maximum Transmission Unit,最大传输单元)描述的是底层数据帧一次最多可以发送的数据量,这个限制是不同的数据链路层对应的物理层产生的。
-
以太网对应MTU的值一般是1500字节,不同的网络类型有不同的MTU,如果一次要发送的数据超过了MTU,则需要在IP层对数据进行分片(fragmentation)。
-
此外,以太网规定MAC帧中数据的最小长度为46字节,如果发送数据量小于46字节,则需要在数据后面补填充位,比如ARP数据包的长度就是不够46字节的。
MUT对IP协议的影响
-
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片,然后才能将分片后的数据向下交付。
-
当对端IP层收到这些分片报文后,需要先将这些分片报文按顺序进行组装,拼装到一起后再向上交付给传输层。
-
数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
MTU对UDP协议的影响
- IP报头当中如果不携带选项字段,那么IP报头的长度就是20字节,而UDP采用的是定长的8字节报头,因此如果UDP一次携带的数据超过了 1500 − 20 − 8 = 1472 1500 − 20 − 8 = 1472 1500−20−8=1472 字节,此时数据就需要在IP层进行分片。
MTU对TCP协议的影响
-
同理,MAC帧的有效载荷最大为
MTU
,因此TCP就要有有效载荷最大为MSS
,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 M S S = M T U − 20 − 20 MSS = MTU - 20 - 20 MSS=MTU−20−20,而以太网MTU的值是1500字节,因此MSS的值一般就是1460字节。 -
TCP通信双方在建立连接的过程中,就会进行
MSS
协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。 -
MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。
MSS和MTU的关系如下:
二、ARP协议
ARP协议,地址解析协议(Address Resolution Protocol,ARP),是根据IP地址获取MAC地址的一个协议,ARP协议工作在数据链路层但是其工作在以太网之上。
为什么会存在ARP这样的协议?
-
实际在进行数据路由时,通过IP路由我们能够将数据交给目标主机所在局域网中的路由器。
-
此时路由器和目标主机是属于同一个局域网的,因此路由器能够直接将数据交给目标主机,但要给同局域网中的一台主机发送数据,前提是得先知道对方的MAC地址。
-
但路由器此时只知道目标主机的IP地址,因此路由器必须通过某种方式得到目标主机的MAC地址。
因此我们就需要有ARP这样的协议来根据IP地址来获取目标主机的MAC地址。
1、ARP数据的格式
- 硬件类型指链路层的网络类型,1为以太网。
- 协议类型指要转换的地址类型,0x0800为IP地址。
- 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
- 协议地址长度对于IP地址为4字节,因为IP地址是32位的。
- op字段为1表示ARP请求,op字段为2表示ARP应答。
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。
2、ARP协议的工作流程
ARP的大致工作原理
虽然路由器不知道目标主机的MAC地址,但是路由器有目标主机的IP地址,而在一个局域网中,所有的主机的IP地址都是不同的,于是路由器就可以在局域网内以广播的形式,在局域网内大喊:IP为"192.168.1.xxx"的主机是谁?
局域网内的所有主机受到报文以后,都会比对自己的IP地址是不是路由器所说的IP,如果不是就不进行处理,如果是就将自己的MAC地址告诉路由器,于是路由器就通过IP地址拿到了MAC地址。
还是以刚才的例子为例,路由器D要将数据转发给同一局域网当中的主机B,前提是路由器D必须知道主机B的MAC地址,而现在路由器D只知道主机B的IP地址,因此路由器D现在需要向主机B发起ARP请求,然后等待主机B发送ARP应答得知主机B的MAC地址。
ARP请求的过程:
- 首先,因为路由器D构建的是ARP请求,因此ARP请求当中的op字段设置为1。
- 其次,ARP请求当中的硬件类型字段设置为1,因为当前使用的是以太网通信。
- ARP请求当中的协议类型设置为0800,因为路由器是要根据主机B的IP地址来获取主机B的MAC地址。
- ARP请求当中的硬件地址长度和协议地址长度分别设置为6和4,因为MAC地址的长度是48位,IP地址的长度是32位。
- ARP请求当中的发送端以太网地址和发送端IP地址,对应就是路由器D的MAC地址和IP地址。
- ARP请求当中的目的以太网地址和目的IP地址,对应就是主机B的MAC地址和IP地址,但由于路由器D不知道主机B的MAC地址,因此将目的以太网地址的二进制序列设置为全1,表示在局域网中进行广播。
ARP请求构建完成后,为了能将ARP请求发送到以太网当中,还需要将ARP数据包向下交付给MAC帧协议,封装成MAC帧。
-
封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是主机B和路由器D的MAC地址,但由于路由器D不知道主机B的MAC地址,因此MAC帧报头当中的以太网目的地址的二进制序列也只能设置为全1,表示在局域网中进行广播。
-
因为这里封装的是一个ARP请求数据包,因此MAC帧当中的帧类型字段设置为0806。
-
由于ARP请求数据包的长度只有28字节,不足46字节,因此还需要在MAC帧的有效载荷当中补上18字节的填充字段,最后再对MAC帧添加CRC校验即可。
MAC帧封装完毕后,路由器D就可以将封装好的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请求报文后,不是在MAC帧层丢弃的,而是在ARP层发现该ARP数据包的目的IP与自己的IP不匹配后丢弃的。
ARP应答的过程 :
-
首先,因为主机B构建的是ARP应答,因此ARP应答当中的op字段设置为2。
-
ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求当中设置的值相同。
-
ARP应答当中的发送端以太网地址和发送端IP地址,对应就是主机B的MAC地址和IP地址。
-
ARP应答当中的目的以太网地址和目的IP地址,对应就是路由器D的MAC地址和IP地址,因为路由器D发来的ARP请求当中告知了主机B它的MAC地址和IP地址,因此主机B是知道的。
同理,ARP应答构建完成后,为了能将ARP应答发送到以太网当中,也需要将ARP数据包向下交付给MAC帧协议,封装成MAC帧。
-
封装MAC帧报头时,以太网目的地址和以太网源地址,对应分别是路由器D和主机B的MAC地址。
-
因为这里封装的是一个ARP应答数据包,因此MAC帧当中的帧类型字段设置为0806。
-
由于ARP应答数据包的长度也只有28字节,不足46字节,因此也需要在MAC帧的有效载荷当中补上18字节的填充字段,最后再对MAC帧添加CRC校验。
MAC帧封装完毕后,主机B就可以将封装好的MAC帧发送到局域网当中了。
-
此时局域网当中的每台主机在底层都能收到这个MAC帧,但局域网当中的不相干的主机,在发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终只有路由器D会将解包后MAC帧的有效载荷向上交付给自己的ARP层。
-
当路由器D的ARP层收到这个数据包后,发现ARP数据包当中的op字段为2,于是判定这是一个ARP应答,然后就会提取出ARP数据包当中的发送端以太网的地址和发送端IP地址,此时路由器D就拿到了主机B的MAC地址。
需要注意的是,局域网当中其他不相干的主机在收到这个ARP应答报文后,直接在MAC帧层就丢弃了,并没有将其交付给自己的ARP层。
3、ARP缓存表
如果每次局域网内的两个主机想要进行通信都要先进行ARP请求,就会导致局域网内存在过多的数据碰撞,所以每台主机都维护了一个ARP缓存表,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,缓存表中的表项有过期时间,这个时间一般为20分钟,如果20分钟内没有再次使用某个表项,那么该表项就会失效,下次使用时就需要重新发起ARP请求来获得目的主机的硬件地址。
我们可以用arp -a
命令进行查看ARP缓存表:
Linux下:
在Windowsh下会更加清晰一些:
4、ARP协议中的一些问题
1、MAC帧的报头当中已经涵盖了源和目的MAC地址,为什么ARP的报头当中还要有这两个字段?
需要注意的是,MAC帧和ARP虽然都在数据链路层,但毕竟是上下层的关系,因此它们不会互相关心彼此报头当中的数据。
此外,如果底层网络采用的不是以太网,而是其他类型的网络,此时ARP层的MAC地址就是必要的了。
2、在局域网内路由器将报文交给目标主机时,为什么不直接以广播的方式发送数据,非要获取目标主机的MAC地址?
在进行局域网通信时,就算只知道对方的IP地址,而不知道对方的MAC地址,也可以以广播的方式将数据发送到局域网当中,此时局域网当中的主机也能够在IP层比对目的IP地址与自己是否相符,来判断收到的这个数据是否是发送给自己的。
理论上确实可以这样,但这种方式是不妥的。
-
对于局域网当中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在这个报文却交付到了IP层,我们都知道IP层是属于操作系统管控的,因此这对网络资源和系统资源来说都是一种浪费。
-
因此在底层MAC帧层就应该判定这个报文是不是发送给当前主机的,而不是当数据向上交付到了IP层再来判断。
此外,如果无脑使用广播的方式来进行数据的发送,会使得广播和单播的概念变得模糊不清,你明明是想发送数据给局域网当中的一台主机,但你却采用了广播的方式,这显然是不合理的。
3、什么时候需要发起ARP请求?
我们刚才说的路由器D要将数据发送给主机B的时候,需要通过ARP获得主机B的MAC地址,但实际数据在路由过程中的每一跳可能都需要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时我们一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的。
注意: ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求
7、成为中间人的一种方式——ARP欺骗
ARP请求和响应没有必然的一对一关系,也就是如果一个主机没有发起过ARP请求其仍然可能收到ARP应答,这是为了保证ARP缓存表能够缓存最新的ARP信息。
于是利用这个特点,当黑客在一个局域网中就可以构建假的ARP响应进行欺骗从而成为中间人。
例如下面:
黑客向主机A发送ARP响应,“我是IPC,我的MAC地址是MACE”,向主机C发送"我是IPA,我的MAC地址是MACE",这样当以后主机A/C给主机C/A通信的数据都会被先发送给主机E,然后由主机E选择进行正常发送还是拦截报文,甚至是修改报文。
6、RARP协议
RARP(Reverse Address Resolution Protocol,反向地址转换协议),是根据MAC地址获取IP地址的一个TCP/IP协议。
也就是说,某些情况下我们可能只知道一台主机的MAC地址,此时要得知该主机的IP地址就可以使用RARP协议。
RARP协议要比ARP协议更加简单,因为既然我们已经知道一台主机的MAC地址了,那么我们就已经可以直接向给主机发送消息了,因此我们可以直接发消息询问对方的IP地址就行了。
参考资料:
数据链路层协议 ——— 以太网协议