tcp_retransmit_skb 是 TCP 栈中的一个函数,负责处理 TCP 报文的重传。这个函数在处理丢包、超时或其他需要重传数据报文的情形时被调用。我们来看一下函数的具体实现,逐行解释每一部分的作用。
以下是 Linux 内核中 tcp_retransmit_skb 的示例代码,并对其进行详细解释:
int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)
{
struct tcp_sock *tp = tcp_sk(sk);
struct net *net = sock_net(sk);
struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
bool fully_sent = !(scb->tcp_flags & TCPHDR_FIN);
struct sk_buff *rexmit;
unsigned int limit;
int err, orig_pcount, rexmit_count; /* Just for readability with pr_debug */
rexmit = skb; pr_debug("retransmit skb seq %X\n", TCP_SKB_CB(skb)->seq); /* RFC 6298 recommends to restart the RTO timer. */
if (