MTU修改是否影响两个方向?

问题描述:

ifconfig 1.2.3.4 mtu 1492MTU修改是否影响两个方向?

这会将传入,传出数据包或两者的MTU设置为1492?我认为它只用于传入

+8

令人吃惊的是程序员如何纪念这一问题作为题外话。 MTU的大小对于编程中的许多事情非常重要,并且知道它的工作原理,以及它为什么如此工作,我认为非常好。但大多数程序员使用设计模式编写抽象的东西,甚至不愿意理解东西的工作原理。这个问题不是关于如何制作汤或煮鸡,这是关于我们程序员每天处理的事情,它怎么可能是一个脱离主题? – 2011-06-15 19:21:22

+0

名人堂Vlad – cateof 2011-06-16 09:09:41

TLDR: Both。它只会传输有效载荷长度小于或等于该大小的数据包。同样,它只会接受MTU内有效载荷长度的数据包。如果设备发送更大的数据包,则应该使用ICMP不可达(超大)消息进行响应。

的细节问题: 调谐的MTU为您的设备,因为你与你的目的地之间的其它跳可以以另一种形式封装你分组(例如,VPN或PPPoE)。这层周围的分组结果是有用在一个更大的数据包沿着电线发送。如果这个新的,更大的数据包超过了该层的最大尺寸,那么该数据包将被拆分成多个数据包(在完美的世界中)或将完全丢弃(在现实世界中)。

作为一个实际的例子,考虑让计算机通过以太网连接到ADSL调制解调器,该调制解调器向ISP提供PPPoE。以太网允许1500字节的有效载荷,其中8字节将由PPPoE使用。现在我们下降到1492字节,可以在单个数据包中发送到您的ISP。如果要发送1500字节的全尺寸以太网有效负载,它将由您的路由器“分段”,并分成两个数据包(一个带有1492字节有效负载,另一个带有8字节有效负载)。

当你想通过这个连接发送更多数据时,问题就出现了 - 可以说你想发送3000个字节:你的计算机会根据你的MTU分割它 - 在这种情况下,每个包含1500个字节的两个数据包,然后发送给你ADSL调制解调器,然后将它们分开,以便它可以实现其MTU。现在,您的3000字节数据已被分成四个数据包:两个有效负载为1492字节,另外两个有效负载为8字节。这显然效率很低,我们实际上只需要三个数据包来发送这些数据。如果您的计算机配置了正确的网络MTU,它将首先发送三个数据包(两个1492字节数据包和一个16字节数据包)。

为了避免这种低效率,许多IP堆栈翻转在IP标题中有一点叫做“不要碎片”。在这种情况下,我们会将第一个1500字节的数据包发送到ADSL调制解调器,并且它会拒绝数据包,并通过互联网控制(ICMP)消息回复,通知我们数据包太大。然后,我们会用较小的数据包重试传输。这称为路径MTU发现。同样,在TCP层下面的一层,避免分段的另一个因素是MSS(最大分段大小)选项,其中两个主机都回复它们可以传输的最大大小数据包而不会分段。这通常是从MTU计算的。

这里的问题出现在错误配置的防火墙丢弃所有ICMP通信时。当你连接(比如说)一个Web服务器时,你建立一个TCP会话并发送你愿意接受基于你的1500字节MTU的TCP数据包(因为你通过以太网连接到你的路由器。)如果外来网络服务器想给你发送大量的数据,他们会把它分成块(当与TCP和IP头结合使用时)出来1500字节的有效载荷并发送给你。您的ISP会收到其中一个,然后尝试将其封装到一个PPPoE数据包中发送到您的ADSL调制解调器,但它发送太大。所以它会回应一个ICMP不可达,这将(在一个完美的世界)导致远程计算机缩小其MSS连接和重传。但是,如果防火墙出现故障,外部Web服务器永远无法访问此ICMP消息,并且此数据包永远不会向您提供。

最终在您的以太网设备上设置您的MTU是希望将正确尺寸的帧发送到您的ADSL调制解调器(以避免它要求您使用较小的帧进行重新传输),但是影响您发送到远程的MSS尺寸至关重要主机建立TCP连接时。

+0

我也想知道MTU是否真的被传输到下一跳或者总是使用ICMP错误进行计算。在明确传输的情况下,使用哪种协议? – PeterT 2011-06-15 18:57:18

+3

MTU仅从连接层派生(即,以太网帧为1500字节),然后基于ICMP错误(路径MTU发现)进行更新。 – 2011-06-15 19:11:44

+0

需要的ICMP片段可能包含所需的MTU。 – ninjalj 2011-06-15 19:38:49

它是最大传输单元,所以它明确设置传出的最大数据包大小。我不确定是否会拒绝大于MTU的传入数据包。

+3

这就是我所要求的... – cateof 2011-06-15 16:34:13

ifconfig ... mtu <value>设置发送到接口的layer2有效载荷的MTU,并将拒绝在此接口上接收的较大的layer2有效载荷。您必须必须确保您的MTU匹配以太网链路的两端;你不应该在相同的ethernet broadcast domain任何地方有不匹配的MTU值。请注意,以太网报头不包含在您正在设置的MTU中。

另外,ifconfig还没有在Linux中维护的年龄old and deprecated;令人遗憾的是,Linux发行版仍然包含它,因为它们害怕破坏旧脚本。这对鼓励人们继续使用它有非常不利的影响。您应该使用iproute2命令系列:

[[email protected] ~]$ sudo ip link set mtu 1492 eth0 
[[email protected] ~]$ ip link show eth0 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1492 qdisc mq state UP qlen 1000 
    link/ether 00:1e:c9:cd:46:c8 brd ff:ff:ff:ff:ff:ff 
[[email protected] ~]$ 

大的传入数据包可能会根据接口MTU大小丢弃。

例如,在Linux的 2.6 CentOS的缺省的MTU 1500(与以太网控制器测试:Intel公司80003ES2LAN千兆以太网控制器(铜)(修订版01)) 滴巨型分组> 1504。错误出现在ifconfig中,并且在ethtool -S输出中有rx_long_length_errors指示。 增加MTU表示应该支持Jumbo数据包。 的时候根据自己的尺寸过大丢弃数据包的门槛似乎取决于MTU(-4096,-8192,等等)

奥伦