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