确定和分配分配给待传输数据包skb的空间量究竟是多少?

时间:2012-06-23 13:39:40

标签: networking linux-kernel kernel

根据我的理解,当内核堆栈(在Tx路径上)分配套接字缓冲区(skb)时,“head”和“tail”指针指向start&保留内存空间的结尾。

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

另外,AFAIK,其想法是保留足够的存储器,使得在协议栈下不再需要进一步的分配,即,预留空间可以多于有效载荷。如果是这样,那么进一步封装的情况如何(如VoIP,SSL等?)?

更新的 这有助于回答qs吗?

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

    ... tcp_make_synack() {... skb = sock_wmalloc(sk,MAX_TCP_HEADER + 15 + s_data_desired,1,GFP_ATOMIC); ... }

  2. 这似乎是TCP状态m / c的SYN-ACK部分。 因此,“尺寸”似乎可以达到320左右。

    1. TCP分段数据包.. 默认'mss'是512? < - 基于tcp_base_mss?
    2. TIA!

1 个答案:

答案 0 :(得分:2)

首先进行小修正 - 缓冲区介于headend之间,而不是tail(与data配对)。

你的基本想法是正确的。 TCP根据所需的数据进行分配,并为较低层标头提供空间。由于这些标头事先并不是真正知道的,因此TCP会根据可能的最大值进行分配(这很可能比实际需要的多得多)。

如果结果不够,可以重新分配数据包(可以使用pskb_expand_head)。
在大多数情况下,将数据添加到数据包的代码首先检查是否有足够的顶空(希望是这种情况),如果不是,则重新分配。

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