2

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

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

此外,AFAIK 的想法是保留足够的内存,以便在协议堆栈的下方不需要进一步的分配,即,保留的空间可以超过有效负载。如果是这样,那么进一步封装的情况(如 VoIP、SSL 等)呢?

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

  1. 在 net/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 ?

蒂亚!

4

1 回答 1

2

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

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

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

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

于 2012-06-24T13:24:09.743 回答