的空间量究竟是如何分配给确定并分配给待传输数据包SKB?(How exactly is the am

2019-07-30 02:36发布

从我的理解,当一个套接字缓存(SKB)由内核堆栈(Tx通道上)分配时,“头”和“尾”指针指向启动和保留的内存空间结束。

我的QS是:究竟是什么决定了这个数额:(尾 - 头)个字节? 它是最大MTU? 似乎并不喜欢它作为一个小实验表明字节(尾头)的#可以相当小(320个字节等)。 因此,它是插座的应用程序,在这里扮演一个角色?

此外,AFAIK,这个想法是预留足够的存储器,使得没有进一步allocs要求进一步向下协议栈,即,保留空间可以比有效载荷更多。 如果是这样,那如果进一步封装完成(如VoIP,SSL等?)的情况下?

更新:这是否有助于回答了QS?

  1. 发现在网/支持IPv4 / tcp_output.c:

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

这似乎是TCP状态M / C的SYN-ACK的一部分。 所以,通过这种方式,“大小”似乎摸出大约320。

  1. TCP分段的数据包..默认的“MSS”是512? < - 基于tcp_base_mss?

TIA!

Answer 1:

小的修正第一-缓冲区之间headend ,而不是tail (其与成对的data )。

你的基本思路是正确的。 TCP根据其需要的数据,再加上空间下部层报头分配。 由于这些标头不事先真正知道,TCP分配根据最大可能的(这是很可能会远远超过实际所需)。

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

“默认” MSS也不是很重要的 - 当无法找到更好的价值它仅使用。 通常情况下,MSS将MTU-40,通常是1460。



文章来源: How exactly is the amount of space allocated to a to-be-transmitted packet skb determined and allocated?