TCP的7種定時器

2021-08-01 11:38:16 字數 2162 閱讀 5872

我們知道tcp是面向 連線 的, 可靠 的, 流式 傳輸的協議, 在tcp的裡面有7種定時器, 分別是:

建立連線定時器(connection-establishment timer)

重傳定時器(retransmission timer)

延遲應答定時器(delayed ack timer)

堅持定時器(persist timer)

保活定時器(keepalive timer)

fin_wait_2定時器(fin_wait_2 timer)

time_wait定時器 (time_wait timer, 也叫 2msl timer)

下面分別介紹一下這幾種定時器:

顧名思義,這個定時器是在建立連線的時候使用的, 我們知道, tcp建立連線需要3次握手, 如下圖所示:

如果client在連線server的時候, 在傳送syn的時候, 會啟動乙個定時器(預設應該是3秒),如果syn包丟失了, 那麼3秒以後會重新傳送syn包的(當然還會啟動乙個新的定時器, 設定成6秒超時),當然也不會一直沒完沒了的發syn包, 在/proc/sys/net/ipv4/tcp_syn_retries 可以設定到底要重新傳送幾次syn包。

對於tcp傳送出去的資料報, 需要等待對端發來ack才能從記憶體裡面刪除, 那麼如果對端沒有傳送ack怎麼辦? 重傳唄, 在傳送資料的同時,在設定乙個超時時間(一般設定成2個rtt的時間),如果在這個超時時間內, 沒有收到ack,那麼就重傳剛才傳送的資料。

顧名思義, 這個定時器是在延遲應答的時候使用的。 為什麼要延遲應答呢? 比如客戶端發一段資料給服務端, 服務端本應該立刻回ack給客戶端的, 延遲應答是為了提高網路傳輸的效率, 比如服務端收到客戶端的資料後, 不是立刻回ack給客戶端, 而是等一段時間(一般最大200ms),這樣如果服務端要是有資料需要發給客戶端,那麼這個ack就和服務端的資料一起發給客戶端了, 這樣比立即回給客戶端乙個ack節省了乙個資料報。

堅持定時器是在收到receive window為0的時候開始啟動的, 為什麼需要這個呢?

比如最後乙個ack丟了, 那麼傳送端就永遠認為接收端的視窗是0, 那麼就發不了資料了。這個時候就需要堅持定時器,每隔一段時間(第乙個探測包是在收到視窗為0的訊息後的5秒)傳送乙個位元組的探測包給服務端, 如果服務端視窗不是0了, 會在ack裡面更新視窗大小的。

如果客戶端和服務端長時間沒有資料互動,那麼需要保活定時器來判斷是否對端還活著,但是這個其實很不實用,因為預設是2小時沒有資料互動才探測,時間實在是太長了。如果你真的要確認對端是否活著, 那麼應該自己實現心跳包,而不是依賴於這個保活定時器。

tcp的狀態圖如下所示:

在主動關閉的一端呼叫完close以後(發fin包給對端, 並且收到對端對fin的ack)則進入到fin_wait_2狀態, 那麼這個時候如果和對端之間的網路壞了或者對端程式有問題了一直不close, 或者對端機器直接掉電了, 本端不能一直傻等吧, 所以就需要這個定時器, 如果在這個定時器超時的時候,還是沒收到對端的fin包, 那麼不好意思, 不等了, 直接釋放這個鏈結。這個定時器的時間是多少呢?可以從/proc/sys/net/ipv4/tcp_fin_timeout裡面看到。

time_wait是主動關閉連線的一端最後進入的狀態, 而不是直接變成closed的狀態, 為什麼呢?第乙個原因是萬一最後乙個ack丟失了, 對端會重傳的, 這個在超時之前的重新收到對端的fin也可以回ack, 而不是rst。另外乙個原因是防止老的連線的包在新的連線裡面出現, 影響了新的連線。有這個2msl的時間,可以在2個msl時間之內不會建立同樣四元組(源ip, 源埠,目的ip,目的埠)的連線,也就不會出現老的包影響新連線的事情。

tcp包括兩個定時器函式:乙個函式為200ms呼叫一次(快速定時器);另乙個函式每500ms呼叫一次(慢速定時器)。延遲ack定時器與其它6個定時器有所不同,如果摸個連線上設定了延遲ack定時器,那麼下乙個200ms定時器超時後,延遲的ack必須被傳送(ack的延時時間必須在0-200ms之間)。其它的定時器每500ms遞減一次,計時器減為0時,就觸發相應的動作。

tcp四種定時器

定時器在tcp可靠傳輸的過程中起著舉足輕重的作用。tcp在建立連線之後可能 保活keep alive定時器是可選的 會 啟動四個定時器。tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 k...

tcp四種定時器

tcp使用四種定時器 timer,也稱為 計時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 時間等待計時器 time wait timer。1 重傳計時器 重傳定時器 為了控制丟失的報文段或丟棄的報文...

TCP的四種定時器

tcp在建立連線後會啟動四個定時器 重傳計時器 retransmission timer 堅持計時器 persistent timer 保活計時器 keeplive timer 2msl定時器 time wait timer 1 重傳計時器 tcp的傳送方沒有在規定的時間內收到確認就要重傳已傳送的報...