LV06-02-网络基础-06-以太网和数据帧
本文主要是网络基础——以太网和数据帧的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
一、以太网
以太网是现有局域网最常用的通信协议标准,其网络结构通常为星型结构。
1. 拓扑结构
计算机网络的拓扑结构是引用拓扑学中研究与大小、形状无关的点、线关系的方法。它把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,而由点和线组成的几何图形就是计算机网络的拓扑结构。以太网结构主要分为总线型和星型两种。
- 总线型:是指所有计算机通过一条同轴电缆进行连接。
- 星型:是指所有计算机都连接到一个中央网络设备上(如交换机)。
2. 传输介质
不论是以太网的拓扑结构是总线型还是星型,计算机和通信设备之间进行数据传输都需要有传输介质。以太网采用了多种连接介质,如同轴缆、双绞线和光纤等。
- 双绞线多用于从主机到集线器或交换机的连接;
- 光纤则主要用于交换机间的级联和交换机到路由器间的点到点链路上;
- 同轴缆作为早期的主要连接介质,现在已经逐渐被淘汰。
3. 工作机制
有了传输介质以后,以太网中的数据就可以借助传输介质进行传输了。以太网采用附加冲突检测的载波帧听多路访问(CSMA/CD
)机制,以太网中所有节点都可以看到在网络中发送的所有信息。因此,以太网是一种广播网络。
以太网需要判断计算机何时可以把数据发送到访问介质。通过使用 CSMA/CD
,所有计算机都可以监视传输介质的状态,在传输之前等待线路空闲。如果两台计算机尝试同时发送数据,就会发生冲突,计算机会停止发送,等待一个随机的时间间隔,然后再次尝试发送。
当以太网中的一台主机要传输数据时,工作过程如下:
- (1)监听信道上是否有信号在传输。如果有,表示信道处于忙状态,则继续帧听,直到信道空闲为止。
- (2)若没有监听到任何信号,就传输数据。
- (3)传输数据的时候继续监听。如果发现冲突,则执行退避算法。随机等待一段时间后,重新执行步骤
(1)
。当冲突发生时,涉及冲突的计算机会返回监听信道状态。若未发现冲突,则表示发送成功。
4. 以太网数据帧结构
以太网链路传输的数据包称以太网数据帧。在以太网中,网络访问层的软件必须把数据转换成能够通过网络适配器硬件进行传输的格式。
4.1 工作机制
当以太网软件从网络层接收到数据报之后,需要完成如下操作:
- (1)根据需要把网际层的数据分解为较小的块,以符合以太网帧数据段的要求。
以太网数据帧的整体大小必须在 64~1518
字节之间(不包含前导码)。有些系统支持更大的帧,最大可以支持 9000
字节。有些系统支持更大的帧,最大可以支持 9000
字节。
(2)把数据块打包成帧。每一帧都包含数据及其他信息,这些信息是以太网网络适配器处理帧所需要的。
(3)把数据帧传递给对应于
OSI
模型物理层的底层组件,后者把帧转换为比特流,并且通过传输介质发送出去。(4)以太网上的其他网络适配器接收到这个帧,检查其中的目的地址。如果目的地址与网络适配器的地址相匹配,适配器软件就会处理接收到的帧,把数据传递给协议栈中较高的层。
4.2 数据帧的结构
以太网数据起始部分由前同步码和帧开始定界符组成,后面紧跟着一个以太网报头,以 MAC
地址说明目的地址和源地址。以太网数据帧的中部是该帧负载的包含其他协议报头的数据包,如 IP
协议。以太网数据帧由一个 32
位冗余校验码结尾,用于检验数据传输是否出现损坏。以太网数据帧结构如图所示:
点击查看各字段说明
前同步码 | 用来使接收端的适配器在接收 MAC 帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为 7 个字节,1 和 0 交替。 |
帧开始定界符 | 帧的起始符,为 1 个字节。前 6 位 1 和 0 交替,最后的两个连续的 1 表示告诉接收端适配器:“帧信息要来了,准备接收”。 |
目的地址 | 接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。 |
源地址 | 发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。 |
类型 | 上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。 |
数据 | 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。 |
帧检验序列 FCS | 检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。 |
二、数据的封装
网络通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封。这就是数据的封装与拆封。
1. TCP/IP
协议通信模型
若主机上边使用的是FTP
程序,则通信模型可以如下所示:
2. 数据传递
网络通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封。这就是数据的封装与拆封。
点击查看说明
(1)FTP
头也可以是其他App
头,这只是这里以FTP
为例。
(2)CRC
(Cyclic Redundancy Check
),即循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的,通过这个算法会生成的帧检验序列(FCS
)。需要注意的是循环冗余检验CRC
是一种检验方法,而FCS
是添加在数据后面的帧检验序列。检错方法有很多,我们也可以选用别的检错方法。严格来讲,图中的CRC
应当改为FCS
对,但是图中仅仅是为了强调检验方法,所以这里了解一下即可。
(1)当用户发送数据时,将数据向下交给传输层,但是在交给传输层之前,应用层相关协议会对用户数据进行封装,例如MQTT
、HTTP
等协议,其实就是在用户数据前添加一个应用程序头部,这是处于应用层的操作,最后应用层通过调用传输层接口来将封装好的数据交给传输层。
(2)传输层会在数据前面加上传输层首部(此处以TCP
协议为例,图中的传输层头为TCP
头,也可以是UDP
头),然后向下交给网络层。
(3)网络层会在数据前面加上网络层首部(IP
头),然后将数据向下交给链路层。
(4)链路层会对数据进行最后一次封装,即在数据前面加上链路层首部(此处使用以太网接口为例,对应以太网头),然后将数据交给网卡。
(5)最后,由网卡硬件设备将数据转换成物理链路上的电平信号,数据就这样被发送到了网络中。这就是网络数据的发送过程,从图中可以看到,各层协议均会对数据进行相应的封装,可以概括为TCP/IP
模型中的各层协议对数据进行封装的过程。
(6)当数据被目标主机接收到之后,会进行相反的拆封过程,将每一层的首部进行拆解最终得到用户数据。所以,数据的接收过程与发送过程正好相反,可以概括为TCP/IP
模型中的各层协议对数据进行解析的过程。
3. MTU
3.1 什么是MTU
MTU
(MTU(Maximum Transmission Unit
),即最大传输单元。是指网络能够传输的最大数据包大小,以字节为单位。MTU
的大小决定了发送端一次能够发送报文的最大字节数。如果MTU
超过了接收端所能够承受的最大值,或者是超过了发送路径上途经的某台设备所能够承受的最大值,就会造成报文分片甚至丢弃,加重网络传输的负担。如果太小,那实际传送的数据量就会过小,影响传输效率。
3.2 为什么要用MTU
网络中通常以数据包为单位进行信息传递,那么,一次传送多大的包合适、多大的包最高效就成为一个核心问题之一。如果包大小设置的很大,意味着报文中的有效数据也更多,通信效率更高,但传送一个数据包的延迟也越大,数据包中bit
位发生错误的概率也越大。并且如果这个报文丢掉了,重传的代价也很大。如果包大小设置的过小,则意味传输相同的数据量,设备需要处理更多的报文,这样会极大的考验设备的线速转发能力。而通过设置MTU
来调节网络上数据包的大小,可以让不同的网络找到最适宜的MTU
从而提高转发效率。
MTU
是数据链路层的概念,指数据链路层对数据帧长度的限制。每个不同类型的数据链路的使用目的不同,使用目的不同,可承载的 MTU
也就不同,所以不同链路介质类型的网络有不同的默认MTU
值,常见的一些默认值如下:
网络类型 | MTU(单位:字节) | RFC |
Token Ring(16Mbps) | 17914 | --- |
IEEE 802.4 | 8166 | 1042 |
Token Ring(4Mbps) | 4464 | 1042 |
FDDI | 4352 | 1390 |
Ethernet | 1500 | 894 |
IEEE 802.3 | 1492 | 1042 |
x.25 | 576 | 879 |
3.3 分片
若一IP
数据报大小超过相应链路的MTU
的时候,IPV4
和IPV6
都执行分片(fragmentation
),各片段到达目的地前通常不会被重组(re-assembling
)。IPV4
主机对其产生的数据报执行分片,IPV4
路由器对其转发的数据也执行分片。然而IPV6
只在数据产生的主机执行分片;IPV6
路由器对其转发的数据不执行分片。
以以太网为例,来看一看怎么分片的吧。以太网默认MTU=1500
字节,这是以太网接口对IP
层的约束,如果IP
层有1500
字节需要发送,只需要一个IP
包就可以完成发送任务;如果IP
层有大于1500
字节数据需要发送,需要分片才能完成发送。
现在有一个主机需要发送一个数据载荷长度为2000
字节的报文(假设出接口的MTU
值为1500
)。在网络层会对报文进行封装,其结构组成:IP
头部20
字节+数据载荷长度2000
字节,报文封装后,整个报文长度为2020
字节。在出接口进行转发的时候,发现IP
报文的长度超过了MTU
的值1500
,因此要进行分片处理:
所有分片报文在发送至目的主机后,在目的主机进行分片重组,恢复为原报文。在进行重组时,通过IP
标志位中的MF
用来分辨这是不是最后一个分片,片偏移用来分辨这个分片相对原数据报的位置。通过这几个字段,可以准确的完成数据报的重组操作。
4. MSS
MSS
(Maximum Segment Size
),即最大报文长度。是TCP
协议的一个选项,用于在TCP
连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)。也就是TCP
数据包每次能够传输的最大数据分段,只包含TCP Payload
,不包含TCP Header
和TCP Option
。
MSS
是TCP
用来限制应用层最大的发送字节数。为了达到最佳的传输效能,TCP
协议在建立连接的时候通常要协商双方的MSS
值,这个值TCP
协议在实现的时候往往根据MTU
值来计算(需要减去IP
包头20
字节和TCP
包头20
字节),所以通常MSS
为
$$
MSS=1500(MTU)- 20(IP Header) -20 (TCP Header)=1460
$$
5. MTU
与MSS
上边学习的MTU
和MSS
都是限制的了数据的长度,那么他们在一个数据包中究竟有什么关系呢?这里以以太网数据帧为例进行说明,如下图: