擅长:python、mysql、java
<p>这是我最后选择的路线。我跟随SashaN在D.Shwley的答案评论中发布的链接,了解了为什么在Linux的UDP包中设置“don't fragment”位。原来这和PMTU的发现有关。长话短说,在Python中,可以通过使用socket对象中的setsockopts函数清除UDP包中的don't fragment位。在</p>
<pre><code>import socket
IP_MTU_DISCOVER = 10
IP_PMTUDISC_DONT = 0 # Never send DF frames.
IP_PMTUDISC_WANT = 1 # Use per route hints.
IP_PMTUDISC_DO = 2 # Always DF.
IP_PMTUDISC_PROBE = 3 # Ignore dst pmtu.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("10.0.0.1", 8000))
s.send("Hello World!") # DF bit is set in this packet
s.setsockopt(socket.SOL_IP, IP_MTU_DISCOVER, IP_PMTUDISC_DONT)
s.send("Hello World!") # DF bit is cleared in this packet
</code></pre>