Linux网络编程:数据链路层

目录

一. 数据链路层概述

二. 以太网

2.1 以太网的概念

2.2 以太网数据帧

2.3 对于MAC地址的认识

2.4 数据碰撞问题

三. MTU和MSS

3.1 什么是MTU

3.2 MTU对UDP的影响

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

四. ARP协议

4.1 ARP协议的作用

4.2 ARP数据报

4.3 ARP协议工作流程

五. 总结


一. 数据链路层概述

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

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

Linux网络编程:数据链路层_第1张图片 图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请求或应答。
Linux网络编程:数据链路层_第2张图片 图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地址不匹配后直接丢弃数据。

Linux网络编程:数据链路层_第3张图片 图2.2 数据转发

2.4 数据碰撞问题

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

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

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

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

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

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

Linux网络编程:数据链路层_第4张图片 图2.3 交换机降低数据碰撞影响的原理
Linux网络编程:数据链路层_第5张图片 图2.4 交换机降低网络负载的原理

三. MTU和MSS

3.1 什么是MTU

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

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

Linux网络编程:数据链路层_第6张图片 图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报文中可以携带有效数据的最大长度。
Linux网络编程:数据链路层_第7张图片 图3.2 MTU和MSS的关系

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

Linux网络编程:数据链路层_第8张图片 通过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应答。
Linux网络编程:数据链路层_第9张图片 图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请求和响应,提高通信效率。
Linux网络编程:数据链路层_第10张图片 图4.3 ARP协议的工作流程

五. 总结

  • 数据链路层,负责设备之间数据帧的交换和识别,进行数据帧同步、冲突检测、数据校验等工作,遵循以太网、令牌环网、无线LAN等标准。
  • 以太网不是一种具体的网络,而是一种网络技术标准。
  • MAC地址是在数据链路层用于标识主机唯一性的地址,区别于网络层的IP地址。
  • 在局域网中如果有多台主机同时发送数据则有可能发生数据碰撞,通过交换机可以降低数据碰撞所带来的影响。
  • MTU是数据链路层一次转发数据量的最大值,MSS是TCP协议在不被分片的情况下一次最多发送的数据量。UDP协议,不保证传输的可靠性,分片会大大提高丢包的概率。
  • ARP协议是在两台主机正式通信之前,确定对端MAC地址的协议。

你可能感兴趣的:(Linux系统和网络,linux,网络,网络协议)