福建省建設(shè)執(zhí)業(yè)繼續(xù)教育網(wǎng)站吉林seo排名公司
本文目錄
- 提高TCP的網(wǎng)絡(luò)利用率的二個思考
- 解決方案:Nagle算法和delayed ack(延時發(fā)送和延時應(yīng)答與稍帶應(yīng)答選項)
- Nagle算法和delayed ack算法同時啟動可能會導(dǎo)致的問題
提高TCP的網(wǎng)絡(luò)利用率的二個思考
我們都知道,TCP是一個基于字節(jié)流的可靠傳輸協(xié)議。意思著TCP本身把所有要發(fā)送的數(shù)據(jù)當(dāng)做一個字節(jié)流來處理,而上層應(yīng)用發(fā)送的數(shù)據(jù),總是一段段有長有短,有開始有結(jié)束的有意義的有限長度數(shù)據(jù)報。然后TCP只知道這是個字節(jié)流,它并不知道哪些字節(jié)能組成一個完整的有意義的數(shù)據(jù)報。然而TCP底下的IP層又是一個基于數(shù)據(jù)報文的協(xié)議,所以TCP根據(jù)自己的算法來截斷和組合字節(jié)流形成一個個IP報文。
- 提高有效數(shù)據(jù)和TCPIP首部數(shù)據(jù)長度比:
如果網(wǎng)絡(luò)上大量的發(fā)送小包(比如40個字節(jié)的IP+TCP頭部+1個字節(jié)有有效數(shù)據(jù))的情況下,大部分的網(wǎng)絡(luò)資源都用來傳輸對應(yīng)用層沒有意義的TCPIP首部了,所以網(wǎng)絡(luò)的利用率是很低的,要提高利用率,就可以減少小包的比率,盡量讓每個TCP報文所攜帶的用戶數(shù)據(jù)變長,比如,將多個用戶數(shù)據(jù)報文組合成一個TCP報文后再發(fā)送。 - 減少ACK的數(shù)量:
如果給每一個TCP發(fā)送請求都回復(fù)一個ACK,而TCP的每個ACK通告發(fā)送的端的是在此序列之前的所有TCP數(shù)據(jù)都已經(jīng)傳送完成,那么如何減少ACK這種不傳送有效用戶 數(shù)據(jù)的報文的數(shù)量,就成為了提高網(wǎng)絡(luò)利用率考慮的另外一個方面。
解決方案:Nagle算法和delayed ack(延時發(fā)送和延時應(yīng)答與稍帶應(yīng)答選項)
-
Nagle算法-延時發(fā)送
Nagle算法就是為了盡可能發(fā)送大塊數(shù)據(jù),避免網(wǎng)絡(luò)中充斥著許多小數(shù)據(jù)塊。Nagle算法的核心定義是: 任意時刻,最多只能有一個未收對確認(rèn)報文(發(fā)送端沒有收到接收端發(fā)回的確認(rèn)本報文的ACK消息)的小于MSS尺寸的報文。
具體如以下規(guī)則,以保證發(fā)送方不會過于頻繁的發(fā)送小報文:
(1)如果等待發(fā)送的數(shù)據(jù)的長度達到MSS,則允許發(fā)送;
(2)設(shè)置了TCP_NODELAY選項(關(guān)閉Nagle算法),則允許發(fā)送;
(3)如果所有的小于MSS的報文都已經(jīng)被確認(rèn),則允許發(fā)送;
(4)如果發(fā)生了超時(一般為200ms),則允許發(fā)送。
Nagle算法的目標(biāo)是發(fā)送端做控制,以達到避免網(wǎng)絡(luò)擁塞并提高網(wǎng)絡(luò)有效利用率的目標(biāo)。 -
delayed ack-延時應(yīng)答與稍帶應(yīng)答
我們知道TCP是雙向通信的。所以延時應(yīng)答和稍帶應(yīng)答的邏輯很簡單,收到TCP報文后,并不立刻發(fā)回應(yīng)答,而是等待一段時間,等某些條件滿足后再發(fā)回應(yīng)答。
這樣個延時提供了三個可能性:
(1)多個數(shù)據(jù)一起收全后合并多個應(yīng)答成一個應(yīng)答,從而減少了應(yīng)答數(shù)量
(2)延時這段時間里應(yīng)用層收走了更多的TCP報文,可以給發(fā)送發(fā)通告一個更大的發(fā)送窗口,從而提高了網(wǎng)絡(luò)利用率
(3)應(yīng)答和窗口更新通告以及接收發(fā)發(fā)送給發(fā)送方的反向應(yīng)用層數(shù)據(jù)在一個報文里發(fā)送,從而減少了報文數(shù)量
具體規(guī)則如下:
(1)每到達200ms ---------發(fā)送應(yīng)答
(2)每兩個數(shù)據(jù)包----------發(fā)送應(yīng)答
(3)接收方應(yīng)用層有數(shù)據(jù)要求發(fā)送回發(fā)送方,并且有接收方要發(fā)送的數(shù)據(jù)包達到發(fā)送條件–由數(shù)據(jù)發(fā)送帶回應(yīng)答。
Nagle算法和delayed ack算法同時啟動可能會導(dǎo)致的問題
這在某些應(yīng)用場景下會導(dǎo)致一個典型的“發(fā)-發(fā)-收”的場景問題,即:接收方要在收到二個TCP小報文,并在應(yīng)用層將二個報文合并后再完成應(yīng)用層處理后,然后再把應(yīng)用層響應(yīng)結(jié)果發(fā)送回發(fā)送方的場景。
如下圖所示:
1)發(fā)送方發(fā)送第一個小報文給接收方
2)接收方應(yīng)用層收到第一個報文,并等待第二個小報文的到來
3)接收方delayed ack,不發(fā)回TCP應(yīng)答
4)發(fā)送放Nagle算法,沒有等到第一個小報文的TCP應(yīng)答,則不發(fā)送第二個小報文
5) 接收方和發(fā)送方相互等待死鎖,直到接收方的delayer ack的200ms定時器超時,發(fā)送回TCP應(yīng)答ACK
6)發(fā)送方發(fā)送第二個小報文給接收方
7)接收方應(yīng)用層收到第一和第二兩個小報文,處理后發(fā)回應(yīng)用層響應(yīng)(捎帶回TCP應(yīng)答ACK)
則相比于不開啟nagle或者不開啟delayed ack(二者只要有一個不開啟,或者二個都不開啟),則我們可以看到第5步這里,我們白白的多等待了200ms。