Linux:network: mtu: 隐形知识frag_max_size
文章目录
- 问题
- 研究内核代码发现
- frag_max_size这个值是怎么来的呢?
- 来源
- socket级别上的mtu
- 总结
问题
最近发现socket上发出去的分片大小不是route级别设置的MTU值。
研究内核代码发现
在分片的时候,会有一段代码判断,重新选择MTU的值,看是否有frag_max_size,并且小于route的MTU,如果小于,MTU就等于frag_max_size。(也就是从小到大的方向看去,mtu的选择的优先级是,首位的是socket级别设置的MTU,第二位的是这个frag_max_size,然后是pmtu,然后是route级别的mtu,最后是device上MTU,但是中间还穿插着一些限制:比如frag_max_size需要小于当前route mtu的值,如果大于就会返回toobig的错误。详细的还需要根据内核的源代码整理)
if (unlikely(!skb->ignore_df <