【网络编程】-40 数据链路层之以太网、MAC、MTU详解

  • #【网络编程】-40 数据链路层之以太网、MAC、MTU详解

    2018-05-28 19:42:25 更多

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/baidu_37964071/article/details/80487582

    作用

    之前介绍了网络中各层的作用,可见链接这里写链接内容

    我们都知道,在数据链路层,数据不再是以比特流的形式传输,而是分割成一个一个的帧再进行传输。也就是说,数据链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现,它的各种机制可以让数据的传输更准确可靠。

    我们今天学习更多关于数据链路层的细节,让我们对其更加了解。

    认识以太网

    以太网不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。
    例如: 规定了网络拓扑结构,访问控制方式, 传输速率等;
    以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等。

    以太网帧格式

    如下:
    这里写图片描述
    解释:
    \1. 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的
    \2. 帧协议类型字段有三种值,分别对应IP、ARP、RARP
    \3. 帧末尾是CRC校验码

    认识MAC地址

    1. MAC地址用来识别数据链路层中相连的节点
    2. 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
    3. mac地址在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)

    对比MAC地址和IP地址

    (1)IP地址描述的类似于路途的起点和终点。比如北京-上海。
    (2)MAC地址描述的是路途上的每一个区间的起点和终点。
    比如,从北京到上海,我们肯定要经过很多站,这些XX站就可以看作是MAC地址。而北京、上海就是IP地址。

    认识MTU

    我们发送快递时,对尺寸会有一定限制,发送数据也有一定的限制, 这个限制是不同的数据链路对应的物理层,产生的限制。
    MTU是指数据链路层向网络层发数据的最大传输单元。
    \1. 不同网络类型的MTU是不同的
    \2. 以太网帧中的数据长度规定最小46字节,最大1500字节
    \3. ARP数据包的长度不够46字节,要在后面补填充位

    那如果数据包的长度大于1500字节呢?

    如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。

    MTU对IP协议的影响

    受到数据链路层的MTU的限制,对于较大的IP数据包需要进行分包。
    过程如下:
    \1. 将较大的IP包分成多个小包,并给每个小包打上标签(将每个小包IP协议头的16位标识(id) 设为相同)
    \2. 每个小包的IP协议头的3位标志字段中,第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0)
    \3. 到达对端时再将这些小包进行顺序重组,拼装到一起返回给传输层
    \4. 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败
    IP层不会负责重新传输数据
    为了方便理解,这是之前介绍IP的文章这里写链接内容
    截取里面的报头如下:
    这里写图片描述

    MTU对UDP协议的影响

    我们回忆一下UDP协议,数据包在传输层需要加上8个字节的UDP首部,在网络层需要增加20个字节的IP首部。所以:
    一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
    这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。

    那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就会大大增加。

    MTU对于TCP协议的影响

    TCP的一个数据报也受制于MTU。
    TCP的单个数据报的最大消息长度,称为 MSS(Max Segment Size)

    TCP在建立连接的过程中, 通信双方会进行MSS协商。
    (最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度)
    MSS协商的过程:
    \1. 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
    \2. 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS
    ( MSS的值就是在TCP首部的40字节变长选项中(kind=2))
    MSS和MTU的关系
    由上文的解释,大家可能已经明白了:
    这里写图片描述
    查看
    我们用ifconfig查看一下:
    这里写图片描述

    Android 查看和修改网络mtu

https://www.cnblogs.com/lialong1st/p/10623256.html

CPU:RK3288

系统:Android 5.1
MTU:通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。

查看当前网络mtu:

8000 已经超出了当前的 mtu,所以报错,并且后面括号中显示了当前网络 mtu 值为 1500

`root@rk3288:/ ``# ping -c 2 -M do -s 8000 www.baidu.com``ping` `-c 2 -M ``do` `-s 8000 www.baidu.com``PING www.a.shifen.com (14.215.177.38) 8000(8028) bytes of data.``From android-59027ac919feb197 (192.168.0.178): icmp_seq=1 Frag needed and DF ``set` `(mtu = 1500)``From android-59027ac919feb197 (192.168.0.178): icmp_seq=1 Frag needed and DF ``set` `(mtu = 1500)` `--- www.a.shifen.com ``ping` `statistics ---``0 packets transmitted, 0 received, +2 errors`

临时修改测试,设备重启后就恢复原始值

1、4G网络

`# 查看4G网络mtu``root@rk3288:/ ``# cat /sys/class/net/ppp0/mtu``cat` `/sys/class/net/ppp0/mtu``1500``# 修改mtu``root@rk3288:/ ``# echo 1492 > /sys/class/net/ppp0/mtu``echo` `1492 > ``/sys/class/net/ppp0/mtu``root@rk3288:/ ``# cat /sys/class/net/ppp0/mtu``cat` `/sys/class/net/ppp0/mtu``1492`

2、WLAN

`# 查看wifi网络mtu``root@rk288:/ ``# cat /sys/class/net/wlan0/mtu``cat` `/sys/class/net/wlan0/mtu``1500``# 修改wifi网络mtu``root@rk3288:/ ``# echo 1492 > /sys/class/net/wlan0/mtu``root@rk3288:/ ``# cat /sys/class/net/wlan0/mtu``1492`

3、以太网

`# 查看以太网mtu``root@rk3288:/ ``# cat /sys/class/net/eth0/mtu``cat` `/sys/class/net/eth0/mtu``1500``# 修改以太网mtu``root@rk3288:/ ``# echo 1492 > /sys/class/net/eth0/mtu``echo` `1492 > ``/sys/class/net/eth0/mtu``1|root@rk3288:/ ``# cat /sys/class/net/eth0/mtu``cat` `/sys/class/net/eth0/mtu``1500``# 修改失败` `# 设备上关闭以太网,不要拔掉网线` `#修改以太网mtu``root@rk3288:/ ``# echo 1492 > /sys/class/net/eth0/mtu``echo` `1492 > ``/sys/class/net/eth0/mtu``# 修改成功``root@rk3288:/ ``# cat /sys/class/net/eth0/mtu``cat` `/sys/class/net/eth0/mtu``1492`

固定网络的 mtu,重启后不恢复
以太网

diff --git a/kernel/include/uapi/linux/if_ether.h b/kernel/include/uapi/linux/if_ether.h
index ade07f1..0b780bf 100755
--- a/kernel/include/uapi/linux/if_ether.h
+++ b/kernel/include/uapi/linux/if_ether.h
@@ -31,7 +31,7 @@
 #define ETH_ALEN       6               /* Octets in one ethernet addr   */
 #define ETH_HLEN       14              /* Total octets in header.       */
 #define ETH_ZLEN       60              /* Min. octets in frame sans FCS */
-#define ETH_DATA_LEN   1500            /* Max. octets in payload        */
+#define ETH_DATA_LEN   1492            /* Max. octets in payload        */
 #define ETH_FRAME_LEN  1514            /* Max. octets in frame sans FCS */
 #define ETH_FCS_LEN    4               /* Octets in the FCS             */

TCP/IP协议:最大传输单元MTU 和 最大分段大小MSS (TCP的分段和IP的分片)

2017-12-07 11:20:10 更多

MTU = MSS + TCP Header + IP Header.
mtu是网络传输最大报文包。 mss是网络传输数据最大值。
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。
MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。

分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。

例如:一个以太网上的主机和一个令牌环网上的主机间建立连接,其中以太网上主机通告的MSS为1460,令牌环网上主机通告的MSS为4096。观察分组,在两个方向上都找不到大于1460字节的数据,为什么?

​ 令牌环网上发送到以太网的数据大小不大于1460字节的原因是因为以太网上主要通告的MSS值就为1460个字节,所以令牌环网上发送出去的数据的长度不能够大于MSS值;令牌环网上主机通告的MSS值为4096,也即是说以太网能够发送到令牌环网上的TCP净荷值为4096,但是以太网的MTU值又是由硬件所决定的,最大只支持1500(包括IP头至少20B和TCP头至少20B),为避免分片,因此以太网发送到令牌环网的数据的净荷也为1500-20-20=1460B,所以两个方向的净数据长度不会大于1460字节。

下面这张图是数据进入协议栈时的封装过程

img

最大传输单元MTU
以太网和8 0 2 . 3对数据帧的长度都有一个限制,其最大值分别是1 5 0 0和1 4 9 2字节。链路层的这个特性称作M T U,最大传输单元。不同类型的网络大多数都有一个上限。
如果I P层有一个数据报要传,而且数据的长度比链路层的M T U还大,那么I P层就需要进行分片( f r a g m e n t a t i o n),把数据报分成若干片,这样每一片都小于M T U。
图2 - 5列出了一些典型的M T U值,它们摘自RFC 1191[Mogul and Deering 1990]。点到点的链路层(如S L I P和P P P)的M T U并非指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间。

路径MTU
当在同一个网络上的两台主机互相进行通信时,该网络的M T U是非常重要的。但是如果
两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的M T U。重要的
不是两台主机所在网络的M T U的值,重要的是两台通信主机路径中的最小M T U。它被称作路
径M T U。
两台主机之间的路径M T U不一定是个常数。它取决于当时所选择的路由。而选路不一定
是对称的(从A到B的路由可能与从B到A的路由不同),因此路径M T U在两个方向上不一定是
一致的。
RFC 1191[Mogul and Deering 1990]描述了路径M T U的发现机制,即在任何时候确定路径
M T U的方法。

MSS 是TCP选项中最经常出现,也是最早出现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头部。TCP在三次握手中,每一方都会通告其期望收到的MSS(MSS只出现在SYN数据包中)如果一方不接受另一方的MSS值则定位默认值536byte。
MSS值太小或太大都是不合适。太小,例如MSS值只有1byte,那么为了传输这1byte数据,至少要消耗20字节IP头部+20字节TCP头部=40byte,这还不包括其二层头部所需要的开销,显然这种数据传输效率是很低的。MSS过大,导致数据包可以封装很大,那么在IP传输中分片的可能性就会增大,接受方在处理分片包所消耗的资源和处理时间都会增大,如果分片在传输中还发生了重传,那么其网络开销也会增大。因此合理的MSS是至关重要的。MSS的合理值应为保证数据包不分片的最大值。对于以太网MSS可以达到1460byte.
与MSS相似的在IP层也有一个类似的概念—MTU(Maximum Transfer Unit)下图可以清晰翻译MSS不MTU 的关系:

MTU =MSS + TCP Header + IP Header.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMt53e7T-1570582907120)(http://support.huawei.com/ecommunity/showimage-10046027-10000035-6fb84a4a7338f2861a3402bf9fdecf4d.jpg)]

TCP/IP详解–TCP的分段和IP的分片

分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片。IP层的分片更多的是为运输层的UDP服务的,由于TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会发生分片的现象。

我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段,在接受时进行重组,同样IP数据报在长度超过一定值时也会发生分片,在接收端再将分片重组。

​ 我们先来看两个与TCP报文段分段和IP数据报分片密切相关的概念。
​ MTU(最大传输单元)
​ MTU前面已经说过了,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节。一个IP数据报在以太网中 传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装。IP数据报的分片与重组是在网络层进完成的。

​ MSS(最大分段大小)
​ MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x2.5时)为576,那么如果不设置,则MSS的默认值就为536个字节。很多时候,MSS的值最好取512的倍数。TCP报文段的分段与重组是在运输层完成的。

​ 到了这里有一个问题自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。

​ 再来看UDP数据报,由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP(在网络层中)同样会出现IP分片情况。

​ 总结:UDP不会分段,就由IP来分。TCP会分段,当然就不用IP来分了

​ 另外,IP数据报分片后,只有第一片带有UDP首部或ICMP首部,其余的分片只有IP头部,到了端点后根据IP头部中的信息再网络层进行重组。而TCP报文段的每个分段中都有TCP首部,到了端点后根据TCP首部的信息在传输层进行重组。IP数据报分片后,只有到达目的地后才进行重组,而不是向其他网络协议,在下一站就要进行重组。

​ 最后一点,对IP分片的数据报来说,即使只丢失一片数据也要重新传整个数据报(既然有重传,说明运输层使用的是具有重传功能的协议,如TCP协议)。这是因为IP层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自TCP报文段的某一段(在IP数据报的某一片中)丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报(可能有多个IP分片),没有办法只重传数据报中的一个数据分片。

在IP层分片时,只有第一个分片存在运输层协议头部,其余分片都不包含运输层协议的首部,这一点很重要。然后TCP的分段,每一个分段都包含TCP首部信息。再有就是IP分片时到达目的地之后再进行重组的,IP层的重组是发生在目的地的IP层TCP的重组是发生在目的地的传输层中

转自:
http://blog.csdn.net/yygydjkthh/article/details/7359281
http://blog.csdn.net/xiaofei0859/article/details/51052752
https://blog.csdn.net/yusiguyuan/article/details/39860303

2. MTU调试

参考:http://www.right.com.cn/forum/thread-147203-1-1.html

openwrt L2TP 配置界面

关于 MTU
MTU (最大传输单元)是网络设备传输的信息包最大值。对于各种路由器,最佳的MTU值通常都是默认值。有时,更改MTU值可提高设备工作性能,做起来很简单,但事实上,这样做往往会导致出现其他问题。最好保持MTU不变,除非有以下情况出现:
1). 当连接不到ISP或者不能使用其他的因特网服务时,且他们的技术支持人员建议更改MTU值
2). 当您使用 VPN,遇到性能问题时可以考虑更改MTU
为了提高网络的某些性能,使用了可优化MTU 值的应用程序,而这引起了连通性和其他性能方面的问题

一个信息包被发送到MTU值较小的设备时,将被分解为若干小块。理论上,在所有电脑、交换机、路由器及您能访问到的因特网的所有设备上的MTU值应该设置为同一大小。但是您不能控制因特网上的 MTU 值,而事实上在一个局域网中的最佳MTU值取决于硬件、软件、无线接口等等。

在一种情形下修改MTU的大小可使设备很好地工作, 但在其他方面却可能引起性能和连接性问题
当具有不同MTU值的设备相互通信时,信息包将会被分成多个以便能传给具有最小的MTU值的设备
Windows XP自动设置MTU ,换句话说,它使MTU对于各种应用综合性能最优化。微软的文章解释了使用Windows XP的宽带用户不能连接到ISP的原因

一旦网络设备分解了一个信息包,此信息包在到达目的地前一直保持分解的状态


各种应用下的最佳MTU值

设置MTU大小是一个反复试验的过程: 由最大值1500开始下降,直至问题解决。使用下列值之一或许能解决一些由MTU值引起的问题:

1500. 以太网信息包最大值,也是默认值。是没有PPPoE和VPN 的网络连接的典型设置。是各种路由器、网络适配器和交换机的默认设置

  1. PPPoE 的最佳值
  2. 使用 ping 的最大值 (大于此值的信息包会先被分解)
  3. DHCP的最佳值
  4. VPN和PPTP 的最佳值
  5. 拨号连接到ISP的标准值


好了,注意一下,以上资料是正常普通情况下MTU的值,不同地区不同运营商不同机房或许也会导致MTU值的不一致!
如何查看MTU值呢?
电脑直接插网线到modem进行ADSL拨号上网,在cmd命令下输入:
netsh interface ipv4 show subinterfaces

这里写图片描述

如上图显示就是当地ADSL运营商MTU值。而并非固件默认的1500.
如何测试MTU值的最大值?
MTU值越大,发包量就大,发包时间减小,理论上是可以提高网络的。怎样测试自己的MTU值的最大值呢?
首先,在CMD命令下输入:

这里写图片描述

ping -f -l 1500 www.baidu.com
1500是默认值,先来测试一下是否能达到1500.
命令返回:“ 需要拆分数据包但是设置 DF。” 说明MTU值过大!我们把MTU值降低试试


这里写图片描述

ping -f -l 1450 www.baidu.com
PING值出来了,说明MTU设置1450可以通过。
再测试一下1451。
ping -f -l 1451 www.baidu.com

这里写图片描述

命令返回:“需要拆分数据包但是设置 DF。” 说明MTU值最大就是1450了。

于是有人就疑问,为什么在modem下测试是1478,而ping值测试 是1450?
上面ping得到的MTU值不能直接用于本地设置上,还应在此基础上加上28(数据包头大小28字节),因此最终在WAN设置页面修改MTU大小为1478。
最后,我就在路由器的WAN接口设置MTU值1478.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值