networking - 待传输数据包skb分配的空间量到底是如何确定和分配的?

标签 networking linux-kernel kernel

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

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

此外,据我所知,这个想法是保留足够的内存,这样协议(protocol)栈中就不再需要进一步的分配,即保留的空间可以大于有效负载。如果是这样,那么进一步封装的情况如何(如 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 ?

TIA!

最佳答案

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

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

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

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

关于networking - 待传输数据包skb分配的空间量到底是如何确定和分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11169961/

相关文章:

linux - IPTable 命令有效但 UFW 无效的原因有哪些?

c - Linux内核源码中遇到的深奥#define宏

linux - 在 Linux 中创建_singlethread_workqueue

c - 嵌入式linux中的PAGE_SIZE

python - 为 python 中的进程编写内核模式分析器

networking - 如果使用本地流量策略,Kubernetes负载均衡器将停止服务流量

networking - 通过 SSH 隧道访问 LDAP

javascript - 在 AWS 上运行的 Node.JS 应用程序性能问题

c - 处理内核模块上的 `Wframe-larger-than` 警告的建议

linux - 在 Linux 中为进程分配物理内存