
晒了好几天的图,觉得是时候补充下这部分。
autocork我总认为是TSQ部分的一个重要分支,于是我花时间特意去研究了一下,从内核2.6到5.10的版本迭代,tcp_should_autocork的确发生了不少的变化,觉得有必要说说。
tcp_should_autocork是一个阻塞发送数据报文的判断条件,在kernel中也确实是这么做的。它位于tcp_push函数,并在判断语句前结束了对push、urg标识的分支处理,这确定了TCP-autocork只服务于“普通的”发送至多数据报文的处理。
void tcp_push(struct sock *sk, int flags, int mss_now,
int nonagle, int size_goal)
{
struct tcp_sock *tp = tcp_sk(sk);
struct sk_buff *skb;
skb = tcp_write_queue_tail(sk);
if (!skb)
return;
if (!(flags & MSG_MORE) || forced_push(tp))
tcp_mark_push(tp, skb);
tcp_mark_urg(tp, flags);
//只处理“普通的”发送数据报文的处理
if (tcp_should_autocork(sk, skb, size_goal)) {
//autocork是TSQ阻塞的一种表现形式
/* avoid atomic op if TSQ_THROTTLED bit is already set */
if (!test_bit(TSQ_THROTTLED, &sk->sk_tsq_flags)) {
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPAUTOCORKING);
set_bi

TCP-autocork是TCP Small Queue(TSQ)机制的一部分,旨在限制TCP连接在队列中的skb数量,减少RTT和bufferbloat问题。它通过阻塞符合条件的数据报文,合并skb来优化发送过程。tcp_should_autocork函数根据四个条件判断是否应用TCP-autocork,包括skb未填满、系统cork选项开启、有未确认数据以及套接字缓冲区大于skb缓冲区大小。通过对这些条件的控制,TSQ-autocork确保有效整合资源,提高发送效率。
最低0.47元/天 解锁文章

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



