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報文的重傳次數。
?