当icsk->icsk_retransmit_timer超时后,会调用其处理函数tcp_write_timer()进行处理。 staic void tcp_write_timer(unsigned long data) { struct sock *sk = (struct sock *)data; bh_lock_sock(sk); if (! sock_owned_by_user(sk)) { /* sk没被用户空间占用 */ tcp_write_timer_handler(sk); }...
探测定时器就是当接收到对端的window为0的时候,需要探测对端窗口是否变大,*///真正的probe报文发送在tcp_send_probe0中的tcp_write_wakeup 探测定时器在tcp_ack函数中激活, 或者在__tcp_push_pending_frames中的tcp_check_probe_timer激活//tcp_write_timer包括数据报重传tcp_retransmit_timer和窗口探测定时器tcp...
inet_csk_init_xmit_timers(sk, &tcp_write_timer, &tcp_delack_timer, &tcp_keepalive_timer); ... } 2.1 重传定时器 重传定时器,简单来说就是发送侧发送一个报文之后,就启动一个定时器等接收方的 ack,如果超时没有等到 ack,那么发送方就会认为发生了丢包,然后会重新发送这个报文;反之,如果在超时时间内...
对于重传来说,进入tcp_retransmit_timer。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 1voidtcp_retransmit_timer(struct sock*sk)2{3struct tcp_sock*tp=tcp_sk(sk);4struct inet_connection_sock*icsk=inet_csk(sk);5if(!tp->packets_out)6goto out;7WARN_ON(tcp_write_queue_empty(sk));8...
void tcp_write_timer_handler(struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); int event; tcp_mstamp_refresh(tcp_sk(sk)); event = icsk->icsk_pending; switch (event) { //对应第二次发送剩余的5字节的小包, ...
如果服务端发生了丢包,那么定时器到时候会进入回调函数tcp_write_timer中进行重传(其实不只是握手,连接状态的超时重传也是在这里完成的)。static void tcp_write_timer(unsigned long data) { tcp_write_timer_handler(sk); ... } void tcp_write_timer_handler(struct sock *sk) { // 取出定时器类型 event...
void tcp_write_timer_handler(struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); int event; if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || !icsk->icsk_pending) goto out; if (time_after(icsk->icsk_timeout, jiffies)) ...
void tcp_write_timer_handler(struct sock *sk) { struct inet_connection_sock *icsk = inet_csk(sk); int event; if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || !icsk->icsk_pending) goto out; if (time_after(icsk->icsk_timeout, jiffies)) ...
30 tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN); 31 tcp_mstamp_refresh(tp); 32 tp->retrans_stamp = tcp_time_stamp(tp); 33 tcp_connect_queue_skb(sk, buff); 34 tcp_ecn_send_syn(sk, buff); 35 tcp_rbtree_insert(&sk->tcp_rtx_queue, buff); ...
setup_timer(&sk->sk_timer, keepalive_handler, (unsigned long)sk); icsk->icsk_pending = icsk->icsk_ack.pending = 0; } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 我 们可以看到icsk->icsk_retransmit_timer定时器,也就是重传定时器的回调函数是tcp_write_timer,而 icsk-...