Networking 如何准确地确定和分配分配给待传输分组skb的空间量?
据我所知,当内核堆栈(在Tx路径上)分配套接字缓冲区(skb)时,“head”和“tail”指针指向保留内存空间的开始和结束 我的问题是:究竟是什么决定了这个数量:(尾)八位元? 是max MTU吗?这看起来不像是一个小实验,它表明字节数(尾部)可能非常小(320字节,等等)。那么,是套接字应用程序在这里发挥了作用吗 此外,这样做的目的是保留足够的内存,以便在协议栈的更深处不需要更多的alloc,即保留的空间可以大于有效负载。如果是这样,那么进一步封装的情况(如VoIP、SSL等)如何 更新: 这有助于回答问题吗Networking 如何准确地确定和分配分配给待传输分组skb的空间量?,networking,linux-kernel,kernel,Networking,Linux Kernel,Kernel,据我所知,当内核堆栈(在Tx路径上)分配套接字缓冲区(skb)时,“head”和“tail”指针指向保留内存空间的开始和结束 我的问题是:究竟是什么决定了这个数量:(尾)八位元? 是max MTU吗?这看起来不像是一个小实验,它表明字节数(尾部)可能非常小(320字节,等等)。那么,是套接字应用程序在这里发挥了作用吗 此外,这样做的目的是保留足够的内存,以便在协议栈的更深处不需要更多的alloc,即保留的空间可以大于有效负载。如果是这样,那么进一步封装的情况(如VoIP、SSL等)如何 更新:
默认的“mss”是512 首先进行小修正-缓冲区位于
头部
和末端
之间,而不是尾部
(与数据
配对)
你的基本想法是正确的。TCP根据需要的数据进行分配,并为较低层的头文件留出空间。由于这些报头实际上事先并不知道,TCP根据可能的最大值进行分配(这很可能比实际需要的多得多)
如果这还不够,可以重新分配数据包(pskb\u expand\u head
)
在大多数情况下,向数据包添加数据的代码首先检查是否有足够的顶部空间(希望如此),如果没有,则重新分配
“默认”MSS不是很重要-它只在找不到更好的值时使用。通常情况下,MSS为MTU-40,通常为1460。谢谢ugoren!什么是MTU-40?接口是MTU(1500)减去40。