《HTTP 權(quán)威指南》閱讀隨筆
為什么要使用 Nagle 算法
TCP 有一個數(shù)據(jù)流接口,應(yīng)用程序可以通過它將任意尺寸的數(shù)據(jù)放入 TCP 棧中,即使一次只放入一個字節(jié)也可以。但是 TCP 段中至少包含了 40 個字節(jié)的標(biāo)記和首部,所以如果 TCP 發(fā)送了大量包含少量數(shù)據(jù)的分組時,網(wǎng)絡(luò)的性能就會嚴(yán)重下降。此時需要引入 Nagle 算法來解決這種性能問題。
什么是 Nagle 算法
Nagle 算法(以其發(fā)明者 John Nagle 命名)試圖在發(fā)送一個分組之前,將大量 TCP 數(shù)據(jù)綁定在一起,以提高網(wǎng)路效率。Nagle 算法鼓勵發(fā)送全尺寸的段,只有當(dāng)其他分組都被確認(rèn)之后,Nagle 算法才允許發(fā)送非全尺寸的分組,如果其他分組仍然在傳輸過程中,就將那部分?jǐn)?shù)據(jù)緩存起來,只有當(dāng)掛起分組被確認(rèn),或者緩存中積累夠一個全尺寸分組數(shù)據(jù)時,才會將緩存的數(shù)據(jù)發(fā)送出去。
Nagle 算法的弊端以及如何解決
Nagle 算法主要存在兩個問題:
- 對于零散的小的 HTTP 報文,可能會因為等待那些永遠(yuǎn)也不會到來的額外數(shù)據(jù)而產(chǎn)生時延;
- Nagle 算法會阻止數(shù)據(jù)發(fā)送,直到確認(rèn)分組抵達(dá)為止,但確認(rèn)分組會被遲延確認(rèn)算法延遲一小段時間(一般是 100~200 毫米)。
對于上面兩種情況,HTTP 應(yīng)用程序通??梢栽跅V性O(shè)置參數(shù) TCP_NODELAY 來禁用 Nagle 算法以提高性能。如果這么做的話,就要盡量保證發(fā)送包含大數(shù)據(jù)塊的 TCP 分組,來避免網(wǎng)絡(luò)性能的下降。