ifconfig 1.2.3.4 mtu 1492
这会将传入,传出数据包或两者的MTU设置为1492?我认为这仅适用于传入
答案 0 :(得分:15)
TLDR:两者。它只会传输有效负载长度小于或等于该大小的数据包。同样,它只接受有效负载长度在您的MTU内的数据包。如果设备发送更大的数据包,它应该响应ICMP不可达(超大)消息。
细节: 调整设备的MTU非常有用,因为您和目的地之间的其他跃点可能会以另一种形式(例如,VPN或PPPoE)封装您的数据包。您的数据包周围的这一层会导致更大的数据包沿着线路发送。如果这个新的,更大的数据包超过了该层的最大大小,那么该数据包将被分成多个数据包(在一个完美的世界中)或者将完全丢弃(在现实世界中)。
作为一个实际示例,请考虑将计算机通过以太网连接到向ISP发送PPPoE的ADSL调制解调器。以太网允许1500字节的有效载荷,其中8个字节将由PPPoE使用。现在,我们可以将单个数据包中的1492字节传送到您的ISP。如果您要发送1500字节的全尺寸以太网有效负载,它将被路由器“分段”并分成两个数据包(一个具有1492字节的有效负载,另一个具有8字节的负载。)
当您想通过此连接发送更多数据时出现问题 - 假设您要发送3000个字节:您的计算机会根据您的MTU将其拆分 - 在这种情况下,每个包含两个1500字节的数据包,然后发送它们到你的ADSL调制解调器然后将它们分开以便它可以实现其MTU。现在你的3000字节数据被分成四个数据包:两个有效载荷为1492字节,两个有效载荷为8字节。这显然是低效的,我们实际上只需要三个数据包来发送这些数据。如果您的计算机配置了正确的网络MTU,它将首先将其作为三个数据包发送(两个1492字节数据包和一个16字节数据包。)
为了避免这种低效率,许多IP堆栈在名为“Do not Fragment”的IP头中稍微翻转一下。在这种情况下,我们会将第一个1500字节的数据包发送到ADSL调制解调器,它会拒绝该数据包,并通过Internet控制(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连接时。
答案 1 :(得分:10)
ifconfig ... mtu <value>
设置从接口发出的第2层有效负载的MTU,并拒绝在此接口上接收的更大的第2层有效负载。您必须确保您的MTU在以太网链路的两端匹配;你不应该在同一个ethernet broadcast domain的任何地方都有不匹配的mtu值。请注意,以太网标头不包含在您正在设置的MTU中。
此外,ifconfig
尚未在linux中维护,而且是old and deprecated;遗憾的是,Linux发行版仍然包含它,因为它们害怕破坏旧脚本。这会鼓励人们继续使用它,这具有非常负面的影响。您应该使用iproute2
命令系列:
[mpenning@hotcoffee ~]$ sudo ip link set mtu 1492 eth0
[mpenning@hotcoffee ~]$ 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
[mpenning@hotcoffee ~]$
答案 2 :(得分:2)
可以根据接口MTU大小丢弃大量传入数据包。
例如,默认MTU 1500开启 Linux 2.6 CentOS(使用以太网控制器测试:Intel Corporation 80003ES2LAN千兆以太网控制器(铜缆)(rev 01)) 丢弃巨型数据包&gt; 1504。错误出现在ifconfig中,并且在ethtool -S输出中有rx_long_length_errors指示。 增加MTU表示应支持Jumbo数据包。 根据数据量过大而何时丢弃数据包的阈值似乎取决于MTU(-4096,-8192等)
奥伦
答案 3 :(得分:0)
它是最大传输单元,因此它肯定设置了传出的最大数据包大小。我不确定是否会拒绝大于MTU的传入数据包。
答案 4 :(得分:0)
毫无疑问,ifconfig配置的MTU会影响Tx ip碎片,我没有更多的评论。
但是对于Rx方向,我发现参数是否会影响传入的IP数据包,这取决于它。不同的制造商行为不同。 我测试了手头的所有设备,发现了3个案例。
测试用例:
Device0 eth0(192.168.225.1,mtu 2000)&lt; - ETH电缆 - &gt; Device1 eth0 (192.168.225.34,mtu MTU_SIZE)
在Device0上ping 192.168.225.34 -s ICMP_SIZE, 检查MTU_SIZE如何影响Device1的Rx。
案例1 :
Device1 = Linux 4.4.0 with Intel I218-LM:
当MTU_SIZE = 1500时,ping在ICMP_SIZE = 1476处成功,在ICMP_SIZE = 1477及以上时失败。似乎有一个实用的MTU = 1504(20B(IP头)+ 8B(ICMP头)+ 1476B(ICMP数据))。
当MTU_SIZE = 1490时,ping在ICMP_SIZE = 1476成功,在ICMP_SIZE = 1477及以上失败,行为与MTU_SIZE = 1500相同。
当MTU_SIZE = 1501时,ping在ICMP_SIZE = 1476,1478,1600,1900处成功。一旦MTU_SIZE设置为> 1500并且不再有1504限制,似乎开启了巨型帧。
案例2 :
Device1 = Linux 3.18.31,带有Qualcomm Atheros AR8151 v2.0千兆以太网:
当MTU_SIZE = 1500时,ping在ICMP_SIZE = 1476处成功,在ICMP_SIZE = 1477及以上时失败。
当MTU_SIZE = 1490时,ping在ICMP_SIZE = 1466处成功,在ICMP_SIZE = 1467及以上时失败。
当MTU_SIZE = 1501时,ping在ICMP_SIZE = 1477处成功,在ICMP_SIZE = 1478及以上时失败。
当MTU_SIZE = 500时,ping在ICMP_SIZE = 476处成功,在ICMP_SIZE = 477及以上时失败。
当MTU_SIZE = 1900时,ping在ICMP_SIZE = 1876处成功,在ICMP_SIZE = 1877及以上时失败。
这个案例与Edward Thomson所说的完全相同,只是在我的测试中,实际MTU = MTU_SIZE + 4。
案例3 :
Device1 = Linux 4.4.50 with Raspberry Pi 2 Module B ETH:
当MTU_SIZE = 1500时,ping在ICMP_SIZE = 1472处成功,在ICMP_SIZE = 1473及以上时失败。因此,有一个实用的MTU = 1500(20B(IP头)+ 8B(ICMP头)+ 1472B(ICMP数据))。
当MTU_SIZE = 1490时,其行为与MTU_SIZE = 1500相同。
当MTU_SIZE = 1501时,其行为与MTU_SIZE = 1500相同。
当MTU_SIZE = 2000时,表现与MTU_SIZE = 1500相同。
当MTU_SIZE = 500时,表现与MTU_SIZE = 1500相同。
这种情况与Ron Maupin在Why MTU configuration doesn't take effect on receiving direction?中所说的完全相同。
总结一下,在现实世界中,设置ifconfig mtu后,
有时Rx IP数据包在超过1504时会被丢弃,无论您设置的MTU值是多少(除了启用了巨型帧)。
有时Rx IP数据包在超过您在接收设备上设置的MTU + 4时会被丢弃。
有时Rx IP数据包在超过1500时会被丢弃,无论您设置的是什么MTU值。
......