网络帧的传输
本文主要简单回顾一下网络数据包的封装、分片、传输以及重新组装的过程,帮助我们理解实际的网络传输。
注意,下文中的IP协议如果未作特殊说明指的实IPv4版本。
1. 网络的分层
刚开始学网络协议的时候,我们会学习OSI七层参考模型。 《Effective TCP/IP Programming》 这本书里面提到一个技巧:Don’t Take the OSI Seven-Layer Reference Mode Too Seriously,翻译过来就是不要把OSI七层参考模型太当回事。事实上,OSI七层参考模型只是理论上的标准,TCP/IP模型 才是事实上的标准,因此下面的例子不会对OSI七层参考模型做过多的介绍,主要以TCP/IP四层模型为依据的。
请看OSI七层参考模型与TCP/IP四层模型的对比图,下图对相应的层做了相关的映射。
说明:
- TCP/IP模型和OSI七层参考模型中的六层相对应;
- TCP/IP模型不包含OSI七层参考模型中的物理层,也就是不包含硬件;
- TCP/IP模型中的传输层、网际层和网络接口层分别相当于OSI七层参考模型中传输层、网络层和数据链路层;
- TCP/IP模型中的应用层相当于OSI七层参考模型中的应用层、表示层和会话层。
2.网络帧的封装
刚开始学习网络协议的时候,一脸懵逼:
网络协议的分层有什么意义?
为什么还要分那么多层?
可能大学时代翘课太多,导致这种疑惑一直持续到大学毕业以后,直到后来看了几本有关网络协议的书,有些疑惑才慢慢解开。下面还是以图为例描述网络数据包的封装。
请看下图,以HTTP为例,比较形象的说明了数据是怎么经过层层封装传到网络中,最后接收者又是怎样经过层层解析获取网络数据包。
说明:
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端段在层与层传输数据时,每经过一层时会把对应的首部消去。
经过层层封装之后,完整的数据包结构如下:
上图只是一个网络帧的大概结构,如果对IEEE 802.3规定的帧结构进行详细讲解需要比较长的篇幅,这里不展开讲。我们需要知道的是最终在网络上以二进制流传输的结构大概如上图所示。
术语说明:
这里需要对几个有关网络包的术语进行说明,以区分每个术语具体指网络帧的哪一部分。
下图比较清楚说明了Segment、Packet、Frame的区别,很多文章和书籍并不严格区分Packet和Frame的区别。
Segment(数据段):传输层传递给网络层的数据是一个段,它通常包含传输层头和数据。
Packet(数据包):段数据+IP头部=Packet(数据包)
Frame(帧):真正在网络上传输的单元,以太网头部+Packet+FCS=帧;下图未具体标出以太网头部和FCS。
3. 网络帧的传输
网络帧在网络中的传输同样是相对复杂的过程,涉及到组装、分片、重组的过程。
1. 相关概念介绍
下面的概念是针对标准的以太网进行说明的,对于不同的网络,最大传输单元并不相同。对于某些启用巨帧的网络,最大传输单元可以很大。
网络帧在网络上传输时有大小限制,无论是何种协议,除去以太网头部和尾部,剩余的大小都不能超过以太网规定的最大传输单元。
下图以TCP为例,较为直观的阐述了标准的以太网对网络中数据大小的限制。
相关概念:
- MSS: 除去以太网头尾部、IP头部和传输层后剩下的大小。
- MTU: 除去以太网头部和尾部剩下的网络数据包的大小。就IPv4而言,标准的以太网MTU最大为1500字节,最小为576字节。
- TCP计算公式:
MTU(1500字节) = IP header + TCP Header + MSS = 20字节 + 20字节 + 1460字节- UDP计算公式:
MTU(1500字节) = IP header + UDP Header + MSS = 20字节 + 8字节 + 1472字节
2. 查看MTU大小
知道了MTU的概念后,就可以使用相应的命令查看系统中网卡的MTU大小。Windows、Linux以及路由器均可设置MTU大小,这里只简单的查看。
1).windows查看MTU
C:\Users\sunft>netsh interface ipv4 show subinterfaces
MTU MediaSenseState Bytes In Bytes Out Interface
------ --------------- --------- --------- -------------
1500 1 29039078516 1931385600 Ethernet
1500 5 0 0 Wi-Fi
4294967295 1 0 1009988 Loopback Pseudo-Interface 1
1500 5 0 0 Local Area Connection* 3
1500 5 0 0 Bluetooth Network Connection
1500 5 0 0 Local Area Connection* 2
1500 1 0 74847 VMware Network Adapter VMnet1
1500 1 0 40655 VMware Network Adapter VMnet8
说明:
除了路由器本地回环接口外,其他的网卡MTU大小均为1500字节。
2). Linux查看MTU
[sunft@localhost ~]$ ifconfig | grep mtu
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
说明:
除了lo网卡外,其他的网卡MTU大小均为1500字节。
3. 数据包分片和重组
既然MTU不能超过1500字节,那么对于MTU超过1500字节的数据包怎么处理呢?
一般情况下,对于MTU超过1500字节的包,会在源机器或者传输途中的网络设备进行分片,而重组只发生在目的机器。
注意:1500字节是针对一般的网络设备而言,某些网络设备的MTU可能大于或者小于1500字节。
1). 分片与重组规则
- 发送方根据自身的MTU大小确定是否分片;
- 数据帧在传输途中也可能发生分片,例如的路由器MTU小于1500字节;
- 数据帧有可能被直接丢弃,若数据包大小大于传输途中网络设备的MTU,而该网络设备没有启用分片机制;
- 重组只发生在目的机器。也就是说,即使中途遇到大于1500字节的网络设备,该网络设备也不会对分片进行重组,而是转发给下一个网络设备。
2) 分片与重组图示
下图比较形象的说明网络数据包的分片与重组过程。
过程描述:
设备A的MTU为3300字节,想要发送12000字节的数据给设备B,于是进行如下操作:
- 数据包大小>3300字节,于是分成4段进行传输;
- 遇到MTU为1300字节的路由器A,于是继续对每个包进行分片;
- 紧接着遇到MTU为3300字节的路由器B,不进行组装,转发出去;
- 到达设备B,设备B对网络数据包进行重组。
4. 相关疑问
读完上面的内容,应该会有以下疑问,以下疑问就留着后续有时间再写吧。
- 分片具体是怎么进行的?过程是怎么样的?
- 组装是按照怎样的规则进行组装的?
- 如果未被分片的包被丢弃会产生什么后果?
参考材料
《The TCP/IP Guide》
《图解HTTP》
《TCP/IP详解 卷1:协议》
欢迎关注我的技术公众号,一起学习技术!