晒了好几天的图,觉得是时候补充下这部分。
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)) {