A:重传队列实际上就是发送队列(sk->sk_write_queue),保存着发送且未确认的数据段。 The retransmit queue is implemented using a linked list to hold all the packets currently in flight to the receiver. Q:tcp_clean_rtx_queue()是干什么的? A:tcp_clean_rtx_queue() is called to remove and free...
在tcp_clean_rtx_queue()中,并非对每个ACK都进行时延采样。是否进行时延采样,跟这个ACK是否为 重复的ACK、这个ACK是否确认了重传包,以及是否使用时间戳选项都有关系。 本文主要内容:tcp_clean_rtx_queue()的一些细节,时延采样的条件。 内核版本:3.2.12 Author:zhangskd @ csdn 记分牌 TCP_SKB_CB(skb)->sacked...
struct sk_buff *sk_send_head; struct rb_root tcp_rtx_queue; }; struct sk_buff_head sk_write_queue; __s32 sk_peek_off; int sk_write_pending; __u32 sk_dst_pending_confirm; u32 sk_pacing_status; /* see enum sk_pacing */ long sk_sndtimeo; struct timer_list sk_timer; __u32 ...
buff = sk_stream_alloc_skb(sk, 0, sk->sk_allocation, true); //添加到发送队列sk_write_queue tcp_connect_queue_skb(sk, buff); tcp_ecn_send_syn(sk, buff); tcp_rbtree_insert(&sk->tcp_rtx_queue, buff); //发送syn tcp_transmit_skb err = tp->fastopen_req ? tcp_send_syn_data(s...
tcp_connect_queue_skb(sk, buff); tcp_ecn_send_syn(sk, buff); tcp_rbtree_insert(&sk->tcp_rtx_queue, buff); /* Send off SYN; include data in Fast Open. */ err = tp->fastopen_req ? tcp_send_syn_data(sk, buff) : tcp_transmit_skb(sk, buff, 1, sk->sk_allocation); ...
reqsk_queue_alloc函数中计算了半连接队列的长度,因为有些复杂所以没有在前面展开,这里深入一下。 int reqsk_queue_alloc(struct request_sock_queue *queue, unsigend int nr_table_entries){// 计算半连接队列的长度nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);nr_table_...
tcp_rcv_established->tcp_ack->tcp_clean_rtx_queue->tcp_ack_update_rtt->tcp_set_rto image.png 重传定时器初始化 重传定时器的值类型为ICSK_TIME_RETRANS icsk_retransmit_timer在inet_csk_init_xmit_timers函数中被初始化: /* * Using different timers for retransmit, delayed acks and probes ...
tcp_ack()->tcp_clean_rtx_queue() 客户端修改自己的 socket 状态为 ESTABLISHED,接着打开 TCP 的保活计时器。 在tcp_send_ack 中构造 ack 包,并把它发送了出去。 客户端响应来自服务器端的 synack 时清除了 connect 时设置的重传定时器,把当前 socket 状态设置为 ESTABLISHED,开启保活计时器后发出...
tcp_ack()中会调用tcp_clean_rtx_queue()来删除重传队列中已经被确认的数据段。 在tcp_clean_rtx_queue()中: 如果ACK确认了重传的数据包,则seq_rtt=-1; 否则,seq_rtt = now - scb->when; 然后调用tcp_ack_update_rtt(sk,flag,seq_rtt)来更新RTT和RTO. ...
当 启动了重传定时器,我们就会等待ack的到来,如果超时还没到来,那么就调用重传定时器的回调函数,否则最终会调用tcp_rearm_rto来删除或者 重启定时器,这个函数是在tcp_ack()->tcp_clean_rtx_queue()中被调用的。tcp_ack是专门用来处理ack。 这个函数很简单,就是通过判断packets_out,这个值表示当前还未确认的段的...