為 TCP 的重新傳輸實現更低的計時器粒度

2021-04-13 13:58:50 字數 2588 閱讀 2453

2007 年 10 月 22 日

使用實現重新傳輸計時器的計時器輪演算法來減少每個計時單元 (tick) 處理的開銷。aix® 傳輸控制協議(tran**ission control protocol,tcp)共有七個計時器(每個連線),並使用全域性計時器函式和兩種粒度來實現這些計時器。在本文中,將研究如何通過使用 aix tcp 快速計時器使重新傳輸計時器實現更低的粒度,並了解使用更低的計時器粒度的其他優點。
引言

aix® 傳輸控制協議(tran**ission control protocol,tcp)為每個連線維護七個計時器:

為了實現這些每個連線都包含的計時器,tcp 使用了一些全域性計時器函式,它們提供了兩種粒度:

在 tcp 的重新傳輸計時器實現中,將重新傳輸超時儲存於 tcp 控制塊的計時單元中,其中乙個計時單元 = 500 毫秒。當 tcp 的慢速計時器每隔 500 毫秒計時到期的時候,將呼叫tcp_slowtimo。這個例程將遍歷 tcp 控制塊表,並且對每個連線的超時(以計時單元為單位進行指定)進行遞減操作,即每次減一。當計時器的計時單元數達到零時,它將呼叫超時處理程式例程為該連線處理相應的超時。這個實現要求 tcp 計時器的下限為 500 毫秒。

正如您所知道的,tcp 根據所測量的往返時間,動態地計算超時。目前,tcp 重新傳輸超時的最小時間為 3 秒。然而,對於一些高速網路,如千兆位的乙太網和萬兆位的乙太網,預期的往返時間(因此重新傳輸超時)要低得多。如果不進行傳輸,那麼每秒鐘將損失掉 120mb 的吞吐量。因此,我們需要一種更好的方法來處理高速的和低延遲的網路。

使用重新傳輸計時器來實現更低粒度的一種方式是,使用 tcp 的快速計時器(200 毫秒),可以將其預設值設定為 50 毫秒,取代了原來的 200 毫秒。這種方法所帶來的缺點是,處理以更高的速率掃瞄所有協議控制塊 (pcb) 的開銷。pcb 是為連線儲存控制資訊的一種內部結構。本文說明了基於計時器輪演算法實現 tcp 的重新傳輸計時器的一種備選方法。

計時器輪演算法

乙個計時輪包含 n 個槽位。乙個槽位代表乙個時間單元,如si(槽位時間間隔)。每經過乙個時間單元,計時輪中的指標移動乙個位置,就像時鐘中的秒針一樣。當指標移動到乙個槽位時,例如cs(當前槽),這表示在這個槽位中的計時器列表(如果存在的話)立即計時到期,或者當指標在後續週期中到達相同槽位時計時到期。

在將具有某個計時間隔的新的計時器,如ti(時間間隔),新增到這個計時器輪時,將計算出這個新計時器的槽位ts(計時器槽位),具體如下所示:

ts = ( cs + (ti / si)) % n

假定所有計時器的最大計時時間間隔都不超過某個上限(tmax)。如果 n 足夠大,能夠在從當前指標位置開始的一周之內容納tmax,那麼當指標移動到乙個特定的槽位時,該槽位中的所有計時器立即同時計時到期(而不是後繼週期)。這樣可以避免遍歷該列表以檢查現在哪些計時器計時到期,以及在後繼週期中哪些計時器將計時到期。

例如,在下面的圖 1 所示的計時輪中,共有 8 個槽位,編號從 0 到 7。您可以觀察以槽位 1、3、5、4 和 6 為中心的計時器條目。目前,指標處於槽位 1。以該槽位為中心的三個計時器將立即計時到期、或者在後繼週期中當指標達到相同槽處時計時到期。

圖 1. 計時輪

使用計時器輪演算法的 rto 實現

這個部分說明了在 aix 中使用計時器輪演算法的重新傳輸超時 (rto) 實現。在 aix 中,將計時器輪中的槽位數目選擇為 n=7000。該計時器輪實現的槽位時間間隔 (si) 可以使用no選項和timer_wheel_tick來進行配置。timer_wheel_tick的取值範圍從 0 到 100 個計時單元,其中每個計時單元 = 10 毫秒。因此,如果將timer_wheel_tick設定為 1,例如 10 毫秒,那麼該計時器每個週期的計時時長是 n x si = 70 秒。因為 aix tcp rto 的最大值 (tmax) 是 64 秒,所以這個值足夠大,可以確保在乙個槽位中所有的重新傳輸計時器同時計時到期,而不需要等到後繼的週期。

可以使用no選項和tcp_low_rto來配置 rto 值。tcp_low_rto的取值範圍從 0 到 3000 毫秒。如果配置了該值,那麼會將這個 rto 值設定為該系統中所有 tcp 連線的初始重新傳輸超時。

即使配置了tcp_low_rto,也只有在出現丟包的情況下,該演算法才會對連線生效,如下面的圖 2 所示。否則,使用這個演算法是無效的。在重新傳輸計時器實現(用於未出現丟包情況的連線)的傳統方法中,您所需要做的是,在 tcp 的控制塊中設定計時單元數以啟動重新傳輸計時器。當確認資訊到達的時候,通過將該值設定為 0 來停止重新傳輸計時器。在重新傳輸計時器不可能計時到期的情況下,使用這一方法來進行啟動或者停止是最有效的。

您可以繼續使用重新傳輸計時器實現的傳統方法,直到出現下面的任何一種情形為止:

重新傳輸計時器計時到期

對於某個連線,開啟了快速重新傳輸階段

TCP可靠傳輸的實現

1.概述 為方便描述可靠傳輸原理,假定資料傳輸只在乙個方向上進行,即a傳送資料,b給出確認 2.以位元組為單位的滑動視窗 tcp的滑動視窗是以位元組為單位的。為了便於說明,位元組編號取得很小。先假定a收到b發來的確認報文字段,其中視窗是20位元組,而確認號是31位元組。表明b期望接收到的下乙個序號是...

TCP可靠傳輸的實現

滑動視窗是指傳送方維護乙個固定大小的環形鍊錶做資料快取,快取上有三個指標 p1已傳送未確認的首位址,p2已傳送未確認的尾位址 允許傳送但未傳送首位址 p3允許傳送但未傳送尾位址 未傳送首位址 視窗的大小由接收方控制。傳送資料後,需要等待接收方的確認,直到收到確認資訊後,才會移動p1指標,相當於在未接...

TCP可靠傳輸的實現

tcp的滑動視窗是以位元組為單位的。現假設a收到了b發來的確認報文段,其中視窗是20位元組,而確認號是31.根據這兩個資料,a就構造出自己的傳送視窗。如下圖所示。傳送視窗表示 在沒收收到b的確認情況下,a可以連續把視窗內的資料都傳送出去。凡是已經傳送的資料,在未收到確認之前都必須暫時保留,以便超時重...