理解Linux内核中的TCP内存管理

理解Linux内核中的TCP内存管理,tcp,linux-kernel,network-programming,Tcp,Linux Kernel,Network Programming,我正在UDP之上实现一个自定义传输层协议,以提供健壮的传递服务,并需要确保适当的内存管理。我试图使用TCP作为参考,看看函数TCP\u sendmsg()如何处理内存约束 在tcp\u sendmsg()的内核代码中 因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢?tcp\u sendmsg()函数如何知道位已被清除,并且可以继续发送数据 编辑1:正如Maxim在回答中所建议的那样,函数sk_stream\u wait\u memory()处理等待TCP。我的建

我正在UDP之上实现一个自定义传输层协议,以提供健壮的传递服务,并需要确保适当的内存管理。我试图使用TCP作为参考,看看函数
TCP\u sendmsg()
如何处理内存约束

tcp\u sendmsg()
的内核代码中

因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢?
tcp\u sendmsg()
函数如何知道位已被清除,并且可以继续发送数据

编辑1:正如Maxim在回答中所建议的那样,函数
sk_stream\u wait\u memory()
处理等待TCP。我的建立在UDP之上的协议也可以使用这个“流”功能吗

因此,为套接字设置了SOCK_NOSPACE标志。但是稍后如何以及在哪里清除位呢

当排队规程将数据从传出套接字缓冲区复制(或删除)到设备的传出队列时,此位被清除

tcp_sendmsg()函数如何知道该位已被清除,并且可以继续发送数据


其中有一个带有
sk\u stream\u wait\u内存
调用的循环<代码>密钥流\u等待\u内存执行等待。

谢谢Maxim。我也可以使用
sk_stream_wait_memory
作为我的协议吗?我的协议运行在UDP之上,因此不是“流”protocol@GauravSuman我必须阅读内核代码才能回答这个问题。
if (!sk_stream_memory_free(sk))
    goto wait_for_sndbuf;

wait_for_sndbuf:
    set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);