TCP 传输侧内存管理详解
1. 内存管理概述
在 TCP 传输过程中,内存管理至关重要。当写队列中的套接字缓冲区未传输或未被确认时,会出现内存相关问题。此时,程序会跳转到第 1175 行,为套接字设置 SOCK_NOSPACE 标志,并在第 1180 行调用 wait_for_tcp_memory() 函数等待内存可用。
2. 内存分配函数
2.1 tcp_alloc_pskb()
此函数用于为套接字发送缓冲区分配内存。根据硬件是否支持分散聚合 DMA( NETIF_F_SG 位是否在 sk → route_caps 中设置),分配方式有所不同:
- 若硬件不支持分散聚合 DMA,会为 1 mss 大小的 TCP 有效负载分配内存。
- 若硬件支持且单个 sk_buff 的分页区域能容纳 1 mss 数据,将分配 1 页内存。
- 其他情况,会为完整的 1 mss 分配线性数据区域的内存。
若 tcp_alloc_pskb() 未能分配所需长度的缓冲区,需在第 1180 行调用 wait_for_tcp_memory() 等待内存可用。若缓冲区分配成功,会在第 1071 行调用 skb_charge() 函数记录写入侧套接字分配的内存。
超级会员免费看
订阅专栏 解锁全文
1万+

被折叠的 条评论
为什么被折叠?



