Networking 如何准确地确定和分配分配给待传输分组skb的空间量?

Networking 如何准确地确定和分配分配给待传输分组skb的空间量?,networking,linux-kernel,kernel,Networking,Linux Kernel,Kernel,据我所知,当内核堆栈(在Tx路径上)分配套接字缓冲区(skb)时,“head”和“tail”指针指向保留内存空间的开始和结束 我的问题是:究竟是什么决定了这个数量:(尾)八位元? 是max MTU吗?这看起来不像是一个小实验,它表明字节数(尾部)可能非常小(320字节,等等)。那么,是套接字应用程序在这里发挥了作用吗 此外,这样做的目的是保留足够的内存,以便在协议栈的更深处不需要更多的alloc,即保留的空间可以大于有效负载。如果是这样,那么进一步封装的情况(如VoIP、SSL等)如何 更新:

据我所知,当内核堆栈(在Tx路径上)分配套接字缓冲区(skb)时,“head”和“tail”指针指向保留内存空间的开始和结束

我的问题是:究竟是什么决定了这个数量:(尾)八位元? 是max MTU吗?这看起来不像是一个小实验,它表明字节数(尾部)可能非常小(320字节,等等)。那么,是套接字应用程序在这里发挥了作用吗

此外,这样做的目的是保留足够的内存,以便在协议栈的更深处不需要更多的alloc,即保留的空间可以大于有效负载。如果是这样,那么进一步封装的情况(如VoIP、SSL等)如何

更新: 这有助于回答问题吗

  • 在net/ipv4/tcp_output.c中找到:

    。。。 tcp_make_synack() { ... skb=sock_wmalloc(sk,最大TCP_头+15+s_数据_所需,1,GFP_原子); ... }

  • 这似乎是TCP状态m/c的SYN-ACK部分。 所以,到这个时候,“尺寸”似乎是320左右

  • TCP对数据包进行分段。。
    默认的“mss”是512 首先进行小修正-缓冲区位于
    头部
    末端
    之间,而不是
    尾部
    (与
    数据
    配对)

    你的基本想法是正确的。TCP根据需要的数据进行分配,并为较低层的头文件留出空间。由于这些报头实际上事先并不知道,TCP根据可能的最大值进行分配(这很可能比实际需要的多得多)

    如果这还不够,可以重新分配数据包(
    pskb\u expand\u head
    ) 在大多数情况下,向数据包添加数据的代码首先检查是否有足够的顶部空间(希望如此),如果没有,则重新分配


    “默认”MSS不是很重要-它只在找不到更好的值时使用。通常情况下,MSS为MTU-40,通常为1460。

    谢谢ugoren!什么是MTU-40?接口是MTU(1500)减去40。