【网络编程】-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等。以太网帧格式
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- mac地址在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
对比MAC地址和IP地址
(1)IP地址描述的类似于路途的起点和终点。比如北京-上海。
(2)MAC地址描述的是路途上的每一个区间的起点和终点。
比如,从北京到上海,我们肯定要经过很多站,这些XX站就可以看作是MAC地址。而北京、上海就是IP地址。认识MTU
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的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协议的影响
https://www.cnblogs.com/lialong1st/p/10623256.html
系统:Android 5.1
MTU:通信术语 最大传输单元(Maximum Transmission Unit,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`
`# 查看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`
`# 查看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`
`# 查看以太网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`
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字节。
下面这张图是数据进入协议栈时的封装过程
最大传输单元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
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值引起的问题:
- PPPoE 的最佳值
- 使用 ping 的最大值 (大于此值的信息包会先被分解)
- DHCP的最佳值
- VPN和PPTP 的最佳值
- 拨号连接到ISP的标准值
netsh interface ipv4 show subinterfaces
![](/assets/blank.gif)
![](/assets/blank.gif)
ping -f -l 1450 www.baidu.com
ping -f -l 1451 www.baidu.com
![](/assets/blank.gif)
命令返回:“需要拆分数据包但是设置 DF。” 说明MTU值最大就是1450了。
于是有人就疑问,为什么在modem下测试是1478,而ping值测试 是1450?
上面ping得到的MTU值不能直接用于本地设置上,还应在此基础上加上28(数据包头大小28字节),因此最终在WAN设置页面修改MTU大小为1478。
最后,我就在路由器的WAN接口设置MTU值1478.
【网络编程】-40 数据链路层之以太网、MAC、MTU详解相关推荐
- 网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解
1.SO_REUSEADDR: 在BSD中,SO_REUSEADDR选项有两个用户: 如果有socket绑定了0.0.0.0:port:设置该参数后,其他socket可以绑定本机ip:port.(该功 ...
- 手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解
2019独角兽企业重金招聘Python工程师标准>>> 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中--酝 ...
- 【Java网络编程与IO流】Http协议详解以及面试有关问题
HTTP协议详解以及面试有关题目 1 HTTP请求 一个HTTP请求报文由请求行.请求头部.空行和请求数据四个部分组成. 1.1 请求行 请求行中有请求方法字段.URL字段和HTTP协议版本3个字段组 ...
- Linux后端服务器网络编程之线程模型丨reactor模型详解
前言 上一篇文章<后端服务器网络编程之 IO 模型>中讲到服务器端高性能网络编程的核心在于架构,而架构的核心在于进程/线程模型的选择.本文将主要介绍传统的和目前流行的进程/线程模型,在 ...
- Linux 网络编程学习笔记——二、IP 协议详解
目录 一.IP 服务的特点 IP 协议为上层协议提供无状态.无连接.不可靠的服务: 无状态(stateless):指 IP 通信双方不同步传输数据的状态信息,因此所有 IP 数据报的发送.传输和接收都 ...
- Linux 网络编程学习笔记——三、TCP 协议详解
目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...
- 【Linux网络编程】TCP 和 UDP 数据报格式详解
TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 ...
- 网络编程基础一:TCP/IP 协议详解
前言 我们知道两个进程如果需要进行通讯最基本的一个前提[能够唯一的标示一个进程],在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候 ...
- C++ tcpip网络编程中listen函数和accept函数详解和区别
listen函数 摘要:listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程.在TCP服务器编程中listen函数把进程变为一个服务器,并指定 ...
- [C#]网络编程系列专题二:HTTP协议详解
转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...
最新文章
- 小型网站到大型网站-Mysql优化
- RT-Thread GCC VSCode等开源工具链 在智能小车制作中的应用
- 【解决办法】Oracle登录报错ORA-28000: the account is locked
- python 归纳 (十二)_并发队列Queue的使用
- ffmpeg内存模型及AVPacket和AVFrame API基本使用
- hibernate的多表查询
- 白盒测试中几种逻辑覆盖法及其优缺点
- 如何主动触发时间选择器弹窗_请合理使用Alert弹窗
- Twitter高并发高可用架构
- jq中get()和eq()的区别
- linux文本编辑命令vim查找,Linux编辑器vi中文本搜索与替换操作
- 【计算机组成原理习题(2023王道考研 )】-- 第一章 计算机系统概述(选择+简答)
- 如何查看计算机的硬盘序列号,电脑上的硬盘序列号如何查
- jsp post中文乱码
- 批量替换文件字体,简体-繁体
- OpenHarmony 2.0和HarmonyOS发布会快评
- 无线路由器服务器连接线,有线路由器接无线路由器怎么设置
- IOS支持IPv6 DNS64/NAT64网络
- 慌乱的表情,泄露了我的悲伤:伤感心情日志
- 选购笔记本要看清液晶屏幕及主流技术
热门文章
- 如何用计算机录视频,怎么用电脑录制视频
- ecu故障现象_案例-报ECU系统软件重置故障处理方案
- android沉浸式状态理解
- 深入学习卷积神经网络(CNN)的原理知识
- 解决前端 js 中使用 append 动态追加元素标签后,事件和css样式异常问题
- 有域名和服务器怎么建设网站新手,新手如何快速搭建一个新的网站【零基础】...
- 阿里巴巴矢量图库开源http://www.iconfont.cn/collections/detail?cid=29
- 火山PC隐藏任务栏程序图标教程
- hmailserver的反垃圾邮件功能
- 是什么撑起了极兔快递近200亿美元的估值?