目录
一、数据链路层解决的问题
二、以太网协议
2.1 认识以太网
2.2 以太网帧格式
2.3 MAC地址
2.3.1 认识MAC地址
2.3.2 对比MAC地址和IP地址
2.4 MTU
2.4.1 认识MTU
2.4.2 MUT对IP协议的影响
2.4.3 MTU对UDP协议的影响
2.4.4 MTU对TCP协议的影响
2.5 数据跨网络传输的过程
三、ARP协议
3.1 认识ARP协议
3.2 ARP数据格式
3.3 ARP协议的工作流程
一、数据链路层解决的问题
- IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP协议为其提供可靠性保证。如数据丢包后TCP让IP重发数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机
- 但数据在网络传输时需要一跳一跳的从一台主机跳到另一台主机,最终才能将数据转发到目标主机,因此要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机。两台主机直接相连也意味着两台主机属于同一网段,因此将数据转发到下一跳主机实际是局域网通信,这也是链路层需要解决的问题
- 网络层IP提供的是跨网络发送数据的能力,传输层TCP是为数据发送提供可靠性保证的,而链路层解决的则是两台相连主机之间的通信问题
二、以太网协议
2.1 认识以太网
局域网技术
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
- 以太网:以太网是一种计算机局域网技术,应用最普遍
- 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为"令牌",在环路上持续地传输来确定一个节点何时可以发送包
- 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已是计算机网络的一个重要组织部分
虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议而言,并不需要关心底层具体使用的是哪种局域网技术
- 数据在发送之前先进行数据封装,此时数据链路层给数据封装上对应的局域网的报头
- 若数据要进行跨网络传输,那么就需经过路由器转发
- 当数据在路由器数据链路层进行向上交付时,会将该数据对应的局域网报头去掉
- 而当路由器该数据转发给下一跳之前,又会给该数据封装下一跳网络所对应的局域网报头
网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越
以太网通信原理
- "以太网"不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了部分物理层的内容。如:以太网规定了网络拓扑结构,访问控制方式,传输速率等
- 以太网中的网线必须使用双绞线,传输速率有10M,100M,1000M等
- 以太网中所有的主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能够收到该数据
- 如当局域网中的主机A想要发送数据给主机B时,其实局域网中的每一台主机都能收到主机A发出去的数据,只不过最终只有主机B会将主机A发来的数据向上进行交付
- 局域网中的其他主机虽然也收到了主机A发出的数据,但经过识别后发现这个数据不是发送给自己的,于是就会直接将该数据丢弃而不会向上进行交付
即在进行局域网通信的时候,局域网中的所有主机都能够看到局域网中传输的任何数据,只不过每个主机都只关心发送给自己的数据罢了
扩展:
- 网络抓包不仅能够抓到发送给本机的报文数据,也能抓取到发给其他机器的报文数据,实际就是因为在进行网络抓包时,主机将从局域网中收到的所有报文数据都向上交付了而已
- 网卡有一种模式叫做混杂模式,被设置为混杂模式的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它
碰撞避免算法
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用
- 对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,就执行碰撞避免算法
- 碰撞避免算法:当主机发送出去的数据产生碰撞时,该主机等待随机时间(避免再次碰撞)后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网中的数据消散
- 以太网中主机发送的数据产生碰撞后该主机会执行碰撞避免算法,所以说以太网是基于碰撞区和碰撞检测的局域网通信标准
碰撞避免算法就是主机等待一段时间后重新发送数据,因此以太网底层也有重传机制,只不过以太网的重传机制只是为了保证将数据从局域网中的一台主机发送到另一台主机
令牌环网
- 令牌环网(Token-ring network)的传输方法在物理上采用了星形拓扑结构,但逻辑上是环形拓扑结构
- 令牌环网的通信传输介质可以是无屏蔽双绞线、屏蔽双绞线和光纤等
- 令牌环网中各节点间采用多站访问部件(Multistation Access Unit,MAU)连接在一起,MAU是一种专业化集线器,用来围绕工作站计算机的环路进行传输
在令牌环网中有一种专门的帧被称为"令牌","令牌"会在环路上持续地传输,只有拿到"令牌"的主机才能发送数据,因此数据不会发生碰撞
- 令牌环网中的"令牌"就像系统中用于保护临界资源的互斥锁,"令牌"与互斥锁一样也有"忙"和"闲"两种状态,"忙"表示令牌已被占用,"闲"则表示令牌没有被占用
- 想要发送数据的计算机必须首先检测到"闲"令牌,并将其置为"忙"状态,然后才可以发送数据,与申请互斥锁的过程类似
- 由于"令牌"在网环上是按顺序依次传递的,因此对于所有入网的计算机而言,获取令牌的机会相等,因此不会造成饥饿问题
2.2 以太网帧格式
- 源地址和目的地址是指网卡的硬件地址(即MAC地址,网卡出厂时固化),长度是48位
- 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议
- 帧末尾是CRC校验码
MAC帧如何将报头与有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的。当底层收到一个MAC帧后,提取出MAC帧中固定长度的帧头和帧尾,剩下的就是有效载荷
MAC帧如何决定将有效载荷交付给上层的哪一个协议?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需确定将分离出来的有效载荷交付给上层的哪个协议
在MAC帧的帧头中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可
举例理解
假设局域网中的主机A想要将IP数据报发送给同一局域网中的主机B,那么主机A封装MAC帧中的目的地址就是主机B的MAC地址,源地址就是主机A的MAC地址,而帧协议的类型对应就是0800,紧接着就是要发送的IP数据报,帧尾部分对应CRC校验
当主机A将该MAC帧发送到局域网中后,局域网当中的所有主机都可以收到这个MAC帧,包括主机A自己
- 主机A收到该MAC帧后,对收到的MAC帧进行CRC校验,若校验失败则说明数据发送过程中产生了碰撞,此时主机A就会执行碰撞避免算法,后续进行MAC帧重发
- 主机B收到该MAC帧后,提取出MAC帧中的目的地址,发现该目的地址与自己的MAC地址相同,于是在CRC校验成功后就将有效载荷交付给上层IP层进行进一步处理
- 局域网中的其他主机收到该MAC帧后,也会提取出MAC帧中的目的地址,但发现该目的地址与自己的MAC地址不匹配,于是就会直接将这个MAC帧丢弃
即当底层收到一个MAC帧后,会根据MAC帧中的目的地址来判断该MAC帧是否是发给自己的,若是发送给自己的则会再对其进行CRC校验,若校验成功则会根据该MAC帧的帧协议类型,将该MAC交付给对应的上层协议进行处理
2.3 MAC地址
2.3.1 认识MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示。如:08:00:27:03:fb:19
- 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)
可以使用 ifconfig 命令来查看MAC地址
2.3.2 对比MAC地址和IP地址
数据在路由过程中会存在两套地址,源IP地址和目的IP地址,源MAC地址和目的MAC地址
- IP地址描述的是路途总体的起点和终点
- MAC地址描述的是路途上的每一个区间的起点和终点
数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的(其实可能会发生变化,NAT技术),而数据每进行一跳后其源MAC地址和目的MAC地址都会变化
2.4 MTU
2.4.1 认识MTU
MTU(Maximum Transmission Unit,最大传输单元)描述底层数据帧一次最多可以发送的数据量,该限制是不同的数据链路层对应的物理层产生的
- 以太网对应MTU的值一般是1500字节,不同的网络类型有不同的MTU。若一次要发送的数据超过了MTU,则需要在IP层对数据进行分片(fragmentation)
- 以太网规定MAC帧中数据的最小长度为46字节,若发送数据量小于46字节,则需要在数据后面补填充位,如ARP数据包的长度就是不够46字节的
2.4.2 MUT对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以若IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片(前提IP层没有设置禁止分片,否则报文直接丢弃),然后才能将分片后的数据向下交付
数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,若传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片
具体分片与组装过程可浏览博主另一篇文章:
(28条消息) 网络层——IP协议_GG_Bond19的博客-CSDN博客https://blog.csdn.net/GG_Bruse/article/details/130640438
2.4.3 MTU对UDP协议的影响
IP报头中若不携带选项字段,那么IP报头的长度为20字节,而UDP采用的是定长的8字节报头,因此若UDP一次携带的数据超过了1500 − 20 − 8 = 1472 字节,此时数据就需要在IP层进行分片
分片后得到的多个IP数据报中有任意一个在传输过程中丢失,都会引起接收端IP层重组失败。假设在网络传输时丢包的概率是万分之一,若将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包就等同于整个报文整体丢失,因此分片会增加UDP报文丢包的概率
2.4.4 MTU对TCP协议的影响
对于TCP来说,分片也会增加TCP报文丢包的概率,与UDP不同的是TCP丢包后会进行重传,因此TCP应该尽量减少因为分片导致的数据重传
- TCP发送的数据报不能无限大,还是受制于MTU,TCP的单个数据报的最大报文长度被称为MSS(Max Segment Size)
- TCP通信双方在建立连接的过程中,会进行MSS协商,最终选取双方支持的MSS值中的较小值作为最终MSS
- MSS的值在TCP首部的40字节的选项字段中(kind=2)
- 最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度
2.5 数据跨网络传输的过程
以主机A将数据跨网络传输给主机B为例,数据路由的过程如下:
- 主机A要想将数据跨网络传输给主机B,需要先将数据交给同局域网中的路由器A,因此主机A需要将封装好的MAC帧发送到当前局域网中,此时MAC帧中的源MAC地址和目的MAC地址,对应就是主机A的MAC地址和路由器A的MAC地址
- 主机A所在局域网中的所有主机都能收到这个MAC帧,但最终只有路由器A发现该MAC帧中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层
- 路由器A的IP层拿到解包后的IP数据报后,会提取出IP报头中的目的IP地址,然后通过查询路由表后确定需要将该数据转发给路由器B,于是路由器A再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧中的源MAC地址和目的MAC地址,就变成了路由器A的MAC地址和路由器B的MAC地址
- 与路由器A直接相连的主机虽然也可能有很多,但最终只有路由器B发现该MAC帧中的目的MAC地址与自己的MAC地址相同,于是才会对该MAC帧进行解包,并将解包后剩下的IP数据报交付给IP层
- 路由器B的IP层拿到解包后的IP数据报后,同样会提取出IP报头中的目的IP地址,并通过查询路由表后确定需要将该数据转发给路由器C,于是路由器B再将数据向下进行交付,重新封装MAC帧的帧头和帧尾,但此时封装后的MAC帧当中的源MAC地址和目的MAC地址又变了,变成了路由器B的MAC地址和路由器C的MAC地址
- …
- 不断重复上述过程,直到最终数据转发至主机B
因此数据在进行跨网络传输时,其对应的源IP地址和目的IP地址一般是不会变化的,而该数据的源MAC地址和目的MAC地址却是一直在变化的,根本原因就是因为该数据对应的上一跳主机和下一跳主机在不断变化
三、ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议
3.1 认识ARP协议
为什么会存在ARP这样的协议?
以刚才的例子为例,当数据从主机A经过各种路由转发到达路由器D,此时路由器D就需要将数据转发给主机B完成数据的路由
- 由于路由器D和主机B是属于同一个局域网的,因此路由器D能够直接将数据交给主机B,但要给同局域网中的一台主机发送数据,前提是得先知道对方的MAC地址(MAC帧中的目的地址)
- 但路由器D此时只知道主机B的IP地址,因此路由器D必须通过某种方式得到主机B的MAC地址
即在同一个局域网中要给对方发消息,就必须知道对方的MAC地址,而实际大部分情况下只知道对方的IP地址,因此需要通过ARP协议来根据IP地址来获取目标主机的MAC地址。
ARP协议的定位
在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层
其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议
- MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议
- 与之类似的,网络层中的ICMP协议和IGMP协议,这两个协议虽然与IP协议都属于网络层,但这两个协议属于IP的上层协议
3.2 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字节的填充字段
3.3 ARP协议的工作流程
还以之前的例子为例,路由器D要将数据转发给同一局域网当中的主机B,前提是路由器D必须知道主机B的MAC地址,而现在路由器D只知道主机B的IP地址,因此路由器D现在需要向主机B发起ARP请求,然后等待主机B发送ARP应答得知主机B的MAC地址
ARP请求的过程
首先路由器D需要先构建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数据包向下交付给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请求,以广播的方式发送给每一个主机
- 每台主机都能识别接收,然后根据MAC帧的帧类型字段将有效载荷交付给每个主机的ARP层
- 其他不相关主机立马根据目的IP,在ARP协议栈内部丢弃ARP请求,仅有目标主机处理请求
ARP应答的过程
主机B在应答时首先需要构建ARP应答
- 因为主机B构建的是ARP应答,因此ARP应答中的op字段设置为2
- ARP应答当中的硬件类型、协议类型、硬件地址长度、协议地址长度的值与ARP请求中设置的值相同
- ARP应答中的发送端以太网地址和发送端IP地址,对应就是本机的MAC地址和IP地址
- ARP应答中的目的以太网地址和目的IP地址,对应就是路由器D的MAC地址和IP地址。路由器D发来的ARP请求中告知了其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层
ARP缓存表
实际不是每次要获取对方的MAC地址时都需要发起ARP请求,每次发起ARP请求后都会建立对应主机IP地址和MAC地址的映射关系,每台主机都维护了一个ARP缓存表,可以使用 arp -a 命令进行查看
缓存表中的表项有过期时间,一般为20分钟,若20分钟内没有再次使用某个表项,那么该表项就会失效,下次使用时就需重新发起ARP请求获得目的主机的MAC地址
什么时候需要发起ARP请求?
上面说的只是路由器D要将数据发送给主机B的时候,需要通过ARP获得主机B的MAC地址,但实际数据在路由过程中的每一跳可能都需要发起ARP请求,询问下一跳主机对应的MAC地址,因为在每一跳时一般都是只知道下一跳的IP地址,而并不知道其对应的MAC地址的
注意:ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求
MAC帧的报头中已经涵盖了源和目的MAC地址,为什么ARP的报头中还有这两个字段?
- MAC帧和ARP虽然都在数据链路层,但毕竟是上下层的关系,因此不会互相关心彼此的数据
- 若底层网络采用的不是以太网,而是其他类型的网络,此时ARP层的MAC地址就是必要的了
在进行局域网通信时,为什么不直接以广播的方式发送数据?
在进行局域网通信时,就算只知道对方的IP地址,而不知道对方的MAC地址,也可以以广播的方式将数据发送到局域网中,此时局域网中的主机也能够在IP层比对目的IP地址与自己是否相符,来判断收到的这个数据是否是发送给自己的
理论上可以,但并不妥
- 对于局域网中的大多数主机来说,收到的这个报文其实早就应该被丢弃,而现在这个报文却交付到了IP层,这对网络资源和系统资源来说都是一种浪费。因此在底层MAC帧层就应该判定这个报文是不是发送给当前主机的,而不是当数据向上交付到了IP层再来判断
- 此外,若无脑使用广播的方式来进行数据的发送,会使得广播和单播的概念变得模糊不清,明明是想发送数据给局域网中的一台主机,但却采用了广播的方式,这显然是不合理的
RARP协议
RARP(Reverse Address Resolution Protocol,反向地址转换协议),是根据MAC地址获取IP地址的一个TCP/IP协议
在某些情况下可能只知道一台主机的MAC地址,此时要得知该主机的IP地址就可以使用RARP协议
理论上来说,RARP协议一定比ARP协议简单,因为已经知道一台主机的MAC地址了,那么就已经可以直接向给主机发送消息了,直接发消息询问对方的IP地址即可