tcp会无限次重传吗
tcp作为面向连接的,可靠的,字节流。最终要的特点就是可靠,其中重传又是保证可靠的重要前提。那么当tcp发送数据之后,收不到ack的情况下,会无限次重传吗。不会。
# cat /proc/sys/net/ipv4/tcp_retries1
3
# cat /proc/sys/net/ipv4/tcp_retries2
15
root@tegra-ubuntu:/xdata/wyl#
tcp_retries1和tcp_retries2,类似于一次警告,二次罚款。重传次数超过tcp_retries1时不会放弃重传,直到超过tcp_retries2时,才会真正放弃重传。
/proc/sys/net/ipv4/tcp_retries1:
超过这个次数,tcp会将信息报告给网络层,网络层会进行一些操作,比如缓存的更新等。
/proc/sys/net/ipv4/tcp_retries2:
超过这个次数,tcp会放弃重传,然后通过函数tcp_write_err将套接字的状态置错误。socket状态置为错误之后,针对这个socket的阻塞调用,比如read,epoll_wait等便会返回,但是返回值表示错误。
static void sock_def_error_report(struct sock *sk)
{struct socket_wq *wq;rcu_read_lock();wq = rcu_dereference(sk->sk_wq);if (skwq_has_sleeper(wq))wake_up_interruptible_poll(&wq->wait, EPOLLERR);sk_wake_async_rcu(sk, SOCK_WAKE_IO, POLL_ERR);rcu_read_unlock();
}
在代码中,用tcp_retries1和tcp_retries2来判断是否超时,在函数retransmits_timed_out中判断是否超时。
/proc/sys/net/ipv4/tcp_syn_retries:
在建立连接的阶段,syn报文的重传次数。
/proc/sys/net/ipv4/tcp_synack_retries:
在建立连接阶段,syn-ack报文的重传次数。