Linux网络编程:数据链路层

目录

[一. 数据链路层概述](#一. 数据链路层概述)

[二. 以太网](#二. 以太网)

[2.1 以太网的概念](#2.1 以太网的概念)

[2.2 以太网数据帧](#2.2 以太网数据帧)

[2.3 对于MAC地址的认识](#2.3 对于MAC地址的认识)

[2.4 数据碰撞问题](#2.4 数据碰撞问题)

[三. MTU和MSS](#三. MTU和MSS)

[3.1 什么是MTU](#3.1 什么是MTU)

[3.2 MTU对UDP的影响](#3.2 MTU对UDP的影响)

[3.3 MTU对TCP的影响(MSS的概念)](#3.3 MTU对TCP的影响(MSS的概念))

[四. ARP协议](#四. ARP协议)

[4.1 ARP协议的作用](#4.1 ARP协议的作用)

[4.2 ARP数据报](#4.2 ARP数据报)

[4.3 ARP协议工作流程](#4.3 ARP协议工作流程)

[五. 总结](#五. 总结)


一. 数据链路层概述

数据链路层在是计算机网络通信中,TCP/IP五层模型的倒数第二层,++TCP/IP五层模型从上层到下层分别为:应用层、传输层、网络层、数据链路层和物理层++。

**数据链路层的基本功能为:**负责设备之间数据帧的交换和识别,进行数据帧同步、冲突检测、数据校验等工作,遵循以太网、令牌环网、无线LAN等标准。工作在数据链路层的典型设备是交换机。数据链路层通过交换报文,实现将数据发送和接收到特定得网络设备中去。
图1.1 TCP/IP五层模型与计算机体系结构的对应关系

二. 以太网

2.1 以太网的概念

  • 以太网不是一种具体的网络,而是一种技术标准,涉及数据链路层和物理层。其规定了网络拓扑结构、访问方式和传输速率等。
  • 以太网必须用到双绞线,也就是我们常说的网线。
  • 以太网是应用最广泛的网络标准,与之并列的还有令牌环网、无线LAN等。

2.2 以太网数据帧

以太网数据帧包含三部分内容:报头、有效数据、CRC校验码。其中数据是指的网络层封装的IP报文数据(IP报头+数据),而以太网帧报头中的源地址和目的地址是数据链路层的MAC地址(以太网地址),这是个6字节数据,区别于4字节IP地址。

  • 以太网数据帧报头位14bytes定长报头,进行解包时,直接拿掉头部的14bytes即可。
  • 报头中的目的地址和源地址为MAC地址,用于在数据链路层标识主机的唯一性,与网络层的IP地址并不相同。这样做的目的,是为了在数据链路层和网络层实现解耦。
  • 两位类型有3种:0800表示IP数据、0806表示ARP请求或应答、0835表示RARP请求或应答。

图2.1 以太网数据帧格式

2.3 对于MAC地址的认识

IP地址用于在网络中表示主机的唯一性,MAC地址用于在数据链路层标识网络设备的唯一性。

如图2.2所示,假设在局域网中有 主机A ~ 主机E,假设主机A要给主机D发送数据,那么主机A会将数据封装好以太网帧报头后,放到当前所处的局域网中,++当前局域网中的主机A~E都可以看到刚才主机A发送的数据++。

++当主机从网络中接收到一个MAC帧报文时,会从报头中提取出目的MAC地址,并在数据链路层与自身的MAC地址进行比较,如果相同就向网络层交付,不同就直接丢弃++。以图2.2为例,假设 主机A~主机E 的MAC地址为 MAC_A ~ MAC_E ,那么主机A向主机E发送数据时,以太网帧报头中的源地址和目的地址分别为MAC_A和MAC_D,这样虽然主机B、C、D能够看到数据帧,但是对比MAC地址不匹配后直接丢弃数据。
图2.2 数据转发

2.4 数据碰撞问题

在同一个局域网中,如果两台主机同时发送数据,那么它们发送的数据可能会在局域网中发生碰撞,而如果数据之间发生了碰撞,那么数据就无效了,需要被丢弃重发。++发送数据的主机是能够识别到碰撞的,如果识别到了碰撞,就要执行碰撞避免算法++。

  • 碰撞避免算法:发送数据的主机休眠随机时间后重发数据。

一个局域网中,如果主机数量过多,那么有两台主机同时发送数据的可能性就会大大增加,这样会导致发送数据碰撞、重新发送数据的可能性大增,从而导致网络拥塞。

为了让一个局域网中能够容纳更多的主机,并且能够保证网络不过度拥塞,交换机作为一种将局域网划分为多个子网的设备,被引入进来。

如图2.3所示,交换机将路由器组成的局域网划分为两个子网,其中主机A、B、C位于一个子网,主机D、E位于另一个子网,假设主机A要给主机D发送数据,同时主机B也向局域网中发送了数据,那么数据就会在AB所在的子网内生碰撞,交换机能够检查出碰撞,就不会将数据再向主机D、E发送了,这样就大大降低了数据发生碰撞所带来的影响。

如图2.4所示,假设主机A要给主机C发送数据,这就相当于是局域网内部通信,当交换机发现数据已经被主机C读走了,就不会继续向主机D、E发送了,这样就有效降低了局域网的负载。
图2.3 交换机降低数据碰撞影响的原理
图2.4 交换机降低网络负载的原理

三. MTU和MSS

3.1 什么是MTU

MTU就是数据链路层单次传输数据大小的限制,这是由数据链路层的硬件条件所限制的。不同的数据链路层,MTU的大小不同,在以太网中,MTU大小为1500bytes。

MTU数据数据链路层,如果上层的IP报文过大,那么就需要进行分片,这样数据链路层才可以对报文进行转发。如果IP报文太小(小于46bytes),那么就需要对报文进行填充,这样才可以转发。
图3.1 IP报文分片

对于MTU,我们有以下几点理解:

  • 在以太网中,MTU为1500bytes,以太网一次可以发送的报文数据大小位于46bytes~1500bytes之间,对于ARP和PARP报文,由于其长度不足46bytes,因此要进行填充。
  • 如果网络层IP报文过长(超过MTU),那么就要对IP报文进行分片处理,但这会大大增加丢包的概率,因此分片是一种不推荐的行为。
  • 在不同的数据链路层中,MTU的长度是不同的。

3.2 MTU对UDP的影响

MTU的大小会限制单条报文最大的长度,UDP协议全程用户数据报协议,面向数据报,一条报文不能被拆分为多个,即:发送与接收是一一对应的。

UDP协议没有可靠性保证机制,如果数据在网络传输的过程中发生了丢包,那么对端主机就永远不会接收到这条报文了。那么,如果一个UDP报文携带了太多的数据(超过1472bytes:1500 - 20字节IP报头 + 8字节UDP报头),那么这条UDP报文中的数据就要在网络层被分片,这样就增加了丢包的概率,从而进一步降低UDP协议的可靠性。因此,使用UDP协议进行数据传输时,要额外注意控制单条报文的大小,尽可能的避免分片情况。

3.3 MTU对TCP的影响(MSS的概念)

  • 单个TCP报文可以传输的有效数据大小受制于MTU,而TCP报文中能够传输的有效数据的最大值称为MSS,我们可以认为:MSS = MTU - IP报头长度 - TCP报头长度。
  • 在通信双方三次握手建立链接时,通信双方会协商MSS,会取通信双方设备中较小的MSS为通信所使用的MSS,MSS会被写入到TCP报头中,位于TCP报头的选项字段中。
  • 最理想情况下,MSS是IP报文不会被分片的、TCP报文中可以携带有效数据的最大长度。

图3.2 MTU和MSS的关系

通过ifconfig指令,可以查看当前设备的MAC地址和MTU(见图3.3)。
通过ifconfig指令查看设备的MAC地址和MTU

四. ARP协议

4.1 ARP协议的作用

当我们希望与另一台主机进行通信时,我们可以知道对端的IP地址,但是难以得知其MAC地址,ARP请求/响应,就是用于获取并缓存目的主机的MAC地址的。

ARP协议,可用于在主机内部建立IP地址与MAC地址的映射关系。当主机ARP请求/应答获取某台主机的MAC地址后,会缓存 IP地址<->MAC地址 的映射关系,并维持一段时间,之后一段时间再向这台主机发送消息就不用ARP获取MAC地址了。

  • 指令arp -a:获取当前主机内部缓存的IP和MAC地址之间的映射关系。

图4.1 arp -a查看当前主机中缓存的IP地址与MAC地址映射关系

4.2 ARP数据报

在ARP应答/请求报文格式如图4.2所示,其中每部分的含义为:

报头:

  • 源MAC地址:发送报文的主机MAC地址。
  • 目的MAC地址:接收报文的主机MAC地址(ARP请求填FF...FFF,表示广播地址)。
  • 帧类型:该MAC帧携带的数据时IP报文、ARP请求或ARPA请求。

数据:

  • 硬件类型:指数据链路层网络类型,表明是以太网、令牌环网还是无线WAN,1表示以太网。
  • 协议类型:指明要转换的类型,一般设置为0x0800表示IP地址。
  • 硬件地址长度:一般为MAC地址的长度,填6字节。
  • 协议地址长度:一般为IP地址的长度,填4字节。
  • op:操作方式,1表示ARP请求,2表示ARP应答。

图4.2 ARP协议报文格式

4.3 ARP协议工作流程

在两台主机正式进行通信之前,发送数据的主机,要通过ARP请求,获取目的主机的MAC地址,并缓存目的主机的IP地址和MAC地址之间的映射关系:

  • 发送端主机向局域网中发送ARP请求,其中目的MAC地址填写FF...FFF表示广播地址,目的IP地址就是接收数据的主机的IP地址。
  • 由于目的MAC地址是广播地址,所有的主机都会收到ARP请求报文并向上交付到ARP层,对比目的IP和当前主机的IP,如果不匹配,那么就直接丢弃报文,如果匹配,那就向局域网中发送ARP响应报文。
  • ARP请求报文中会携带发送端主机的MAC地址,因此接收端主机在发送ARP响应报文的时候,会将目的MAC地址填写为发送端主机的MAC地址,这样发送端主机在收到响应报文后,就可以得知目的主机的ARP地址。
  • 发送端主机会将目的主机的 IP地址与MAC地址的映射关系缓存起来,以避免每次通信之前都进行ARP请求和响应,提高通信效率。

图4.3 ARP协议的工作流程

五. 总结

  • 数据链路层,负责设备之间数据帧的交换和识别,进行数据帧同步、冲突检测、数据校验等工作,遵循以太网、令牌环网、无线LAN等标准。
  • 以太网不是一种具体的网络,而是一种网络技术标准。
  • MAC地址是在数据链路层用于标识主机唯一性的地址,区别于网络层的IP地址。
  • 在局域网中如果有多台主机同时发送数据则有可能发生数据碰撞,通过交换机可以降低数据碰撞所带来的影响。
  • MTU是数据链路层一次转发数据量的最大值,MSS是TCP协议在不被分片的情况下一次最多发送的数据量。UDP协议,不保证传输的可靠性,分片会大大提高丢包的概率。
  • ARP协议是在两台主机正式通信之前,确定对端MAC地址的协议。
相关推荐
南种北李6 分钟前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
小飞猪Jay11 分钟前
面试速通宝典——10
linux·服务器·c++·面试
暗恋 懒羊羊1 小时前
Linux 生产者消费者模型
linux·开发语言·ubuntu
安红豆.2 小时前
Linux基础入门 --13 DAY(SHELL脚本编程基础)
linux·运维·操作系统
..空空的人2 小时前
linux基础指令的认识
linux·运维·服务器
penny_tcf2 小时前
Linux基础命令halt详解
linux·运维·服务器
什么鬼昵称2 小时前
Pikachu-xxe-xxe漏洞
网络·安全·xxe
荣世蓥2 小时前
10.2 Linux_进程_进程相关函数
linux·运维·服务器
#欲速则不达#4 小时前
高级I/O
c++·网络协议