虚拟机通过隧道方式通信时候会碰到mtu问题,导致报文分片影响性能甚至联通, 通过调小虚拟机的mtu可以规避这类问题,
但是如果没有权限客户的mtu或者遇到了链路上新增的隧道(比如新增了ipsec vpn隧道), 这个时候可以通过调整mss来解决这个问题(只对tcp有效)。
通常可以通过iptables在虚拟机所在iptable修改mss配置, 在syn包建立连接的时候,设置mss协商值的大小来修改tcp通信的mss大小,命令如下:
iptables -t mangle -I POSTROUTING -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1424
mss大小值设置小于(链路上最小mtu-外层长度-隧道长度-内层ip头长度-内层tcp头长度)。
在neutron网络下也可以通过使用Open vSwitch的ovs-ofctl工具可以通过OpenFlow协议修改最大报文段长度(MSS)。
要修改MSS,您需要发送一个OpenFlow消息到适当的交换机。下面是使用ovs-ofctl工具修改MSS的示例命令:
ovs-ofctl mod-tcp-segmentation <bridge> <flow> <mss>
其中,是指交换机的名称或ID,是匹配流规则的条件,是要设置的新的MSS值。
请注意,此命令将修改匹配的流的MSS。您需要根据您的网络环境和需求定义正确的流规则。
下面是一个示例命令,将MSS修改为1400:
ovs-ofctl mod-tcp-segmentation br0 "tcp,tcp_flags=SYN" 1400