Соотношение между MTU и размером skb в функции xmit
Я сталкиваюсь с некоторой проблемой при разработке драйвера сетевой карты в Linux. Как мы все знаем, MTU относится к максимальному размеру IP-пакета без фрагмента. И к skb, отправленному в функцию xmit, будет добавлено 14 байтов, включая dst mac addr, src mac addr и lengh. но очень странно, что когда я использую разные значения для MTU, добавляемый к нему размер отличается, иногда это 10 байтов, иногда это 14 байтов. Это зависит от размера MTU. Например, я использую 7828 в качестве размера полезной нагрузки UDP, когда MTU равен 7700, размер skb в функции xmit равен 7714, а когда MTU равен 7800, размер skb равен 7810. Кто-нибудь может это объяснить? Я думаю, может быть, есть некоторые ограничения на выравнивание для IP-пакетов, но я не нашел этого.
1 ответ
Я искал ответ из интернета и обнаружил, что существует ограничение выравнивания для поля полезной нагрузки IP-кадра. Поле полезной нагрузки должно быть выровнено до 8 байтов. Поэтому, если MTU равен 7700, истинный размер IP-кадра должен быть 7680+20 = 7700, потому что 7680 может делиться на 8. В то время как если MTU равен 7800, истинный размер IP-кадра должен быть 7776+20 = 7796, потому что 7780 не может быть кратно 8, последние 4 байта будут назначены следующему фрагменту IP.