壅塞與流量控制

TCP 公平性(TCP fairness)

當好幾個人共用一張自助餐桌時,我們對公平有個大致的感覺:不該有人霸佔全部菜餚而讓別人餓肚子。在一條共用的網路連結上,TCP 公平性就是把這個概念套用到頻寬:若有數條 TCP 連線競爭一條瓶頸連結,每條最終都該得到大致相等的份額,而不需要任何中央裁判去分配份量。

這份公平從何而來?它是從 AIMD 自然流出的。假設兩個流共用一條連結。各自加法地增大視窗,連結塞滿,兩者都遺失一個封包,各自把視窗砍半。原本用了較多頻寬的那個流,在砍半時絕對損失也較多,而兩者在每次增大時得到的小增量相同——於是經過許多次鋸齒週期,兩個視窗便趨向相等。一種標準的想像方式,是把流 1 的速率對流 2 的速率作圖:AIMD 會把任何起點推向那條公平、均分的線。結果是近似的、而非完美的相等。甚至有一條大致的 TCP 吞吐量方程式,顯示一個流的平均速率正比於 1 除以(RTT 乘以遺失率的平方根),它捕捉了吞吐量如何取決於往返時間與封包遺失。

三個誠實的提醒,讓這件事貼近現實而非理想化。第一,公平性取決於 RTT:那條吞吐量方程式的分母裡有 RTT,所以往返較短的流會搶到比它「公平」份額更多——只有當各流的 RTT 相等時它們才相等。第二,一個應用程式可以乾脆開很多條並行的 TCP 連線(瀏覽器與下載管理員就這麼做),合起來宣稱好幾份份額。第三,公平性唯有在大家都選擇執行一個守規矩、AIMD 式的控制器時才被維持;一個使用更激進演算法、或根本不用的流,能把那些有禮貌的餓死。「TCP 友善」(TCP-friendly)一詞,指的是一個非 TCP 的流(比方說一個透過 UDP 的影片應用程式)自願把自己限制在大致與一個 TCP 流會佔用的量相當,以免當個惡霸。

兩個 RTT 相等的下載共用一條 100 Mbps 的瓶頸;AIMD 把它們驅向各約 50 Mbps。現在假設一個下載的 RTT 是 20 毫秒、另一個是 200 毫秒:短 RTT 的流向上試探的頻率高十倍,所以它可能搶到 70 至 80 Mbps,只留給長 RTT 的流 20 至 30——看起來相同的演算法,卻是不相等的份額,純粹因為距離。

AIMD 在 RTT 相等的流之間大致均分連結,但 RTT 較短的流會系統性地搶到更多。

TCP 公平性只是近似的,且受 RTT 偏倚——相等的份額假設了相等的往返時間。它也會被「開很多條並行連線」所擊破,而且它之所以成立,純粹是因為守規矩的流自願執行 AIMD;網路裡沒有任何東西能逼一個激進或非 TCP 的流公平相待。

又称
fairnessTCP friendlinessTCP 公平性TCP 友善性