相關(guān)資訊
- 《戰(zhàn)國(guó)無(wú)雙4-2》怎么換服裝?戰(zhàn)國(guó)無(wú)
- 關(guān)于責(zé)任的名言警句大全
- 《戰(zhàn)國(guó)無(wú)雙4-2》PC版如何聯(lián)機(jī)? 戰(zhàn)
- 戰(zhàn)國(guó)無(wú)雙4-2技能覺(jué)醒牛逼嗎 全新
- 《戰(zhàn)國(guó)無(wú)雙4-2》手柄無(wú)效怎么解決
- 戰(zhàn)國(guó)無(wú)雙4-2如何設(shè)置語(yǔ)言 戰(zhàn)國(guó)無(wú)雙
- 戰(zhàn)國(guó)無(wú)雙4-2怎么樣跳過(guò)進(jìn)入開(kāi)場(chǎng)動(dòng)畫
- 什么是應(yīng)屆生畢業(yè)生
- 應(yīng)屆生簡(jiǎn)歷自我評(píng)價(jià)
- 應(yīng)屆生簡(jiǎn)歷怎么寫
本類常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416896
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
TCP/IP協(xié)議中,無(wú)論發(fā)送多少數(shù)據(jù),總是要在數(shù)據(jù)前面加上協(xié)議頭,同時(shí),對(duì)方接收到數(shù)據(jù),也需要發(fā)送ACK表示確認(rèn)。為了盡可能的利用網(wǎng)絡(luò)帶寬,TCP總是希望盡可能的發(fā)送足夠大的數(shù)據(jù)。(一個(gè)連接會(huì)設(shè)置MSS參數(shù),因此,TCP/IP希望每次都能夠以MSS尺寸的數(shù)據(jù)塊來(lái)發(fā)送數(shù)據(jù))。
Nagle算法就是為了盡可能發(fā)送大塊數(shù)據(jù),避免網(wǎng)絡(luò)中充斥著許多小數(shù)據(jù)塊。
Nagle算法的基本定義是任意時(shí)刻,最多只能有一個(gè)未被確認(rèn)的小段。 所謂“小段”,指的是小于MSS尺寸的數(shù)據(jù)塊,所謂“未被確認(rèn)”,是指一個(gè)數(shù)據(jù)塊發(fā)送出去后,沒(méi)有收到對(duì)方發(fā)送的ACK確認(rèn)該數(shù)據(jù)已收到。
舉個(gè)例子,比如之前的blog中的實(shí)驗(yàn),一開(kāi)始client端調(diào)用socket的write操作將一個(gè)int型數(shù)據(jù)(稱為A塊)寫入到網(wǎng)絡(luò)中,由于此時(shí)連接是空閑的(也就是說(shuō)還沒(méi)有未被確認(rèn)的小段),因此這個(gè)int型數(shù)據(jù)會(huì)被馬上發(fā)送到server端,接著,client端又調(diào)用write操作寫入‘\r\n’(簡(jiǎn)稱B塊),這個(gè)時(shí)候,A塊的ACK沒(méi)有返回,所以可以認(rèn)為已經(jīng)存在了一個(gè)未被確認(rèn)的小段,所以B塊沒(méi)有立即被發(fā)送,一直等待A塊的ACK收到(大概40ms之后),B塊才被發(fā)送。整個(gè)過(guò)程如圖所示:
這里還隱藏了一個(gè)問(wèn)題,就是A塊數(shù)據(jù)的ACK為什么40ms之后才收到?這是因?yàn)門CP/IP中不僅僅有nagle算法,還有一個(gè)ACK延遲機(jī)制 。當(dāng)Server端收到數(shù)據(jù)之后,它并不會(huì)馬上向client端發(fā)送ACK,而是會(huì)將ACK的發(fā)送延遲一段時(shí)間(假設(shè)為t),它希望在t時(shí)間內(nèi)server端會(huì)向client端發(fā)送應(yīng)答數(shù)據(jù),這樣ACK就能夠和應(yīng)答數(shù)據(jù)一起發(fā)送,就像是應(yīng)答數(shù)據(jù)捎帶著ACK過(guò)去。在我之前的時(shí)間中,t大概就是40ms。這就解釋了為什么'\r\n'(B塊)總是在A塊之后40ms才發(fā)出。
如果你覺(jué)著nagle算法太搗亂了,那么可以通過(guò)設(shè)置TCP_NODELAY將其禁用 。當(dāng)然,更合理的方案還是應(yīng)該使用一次大數(shù)據(jù)的寫操作,而不是多次小數(shù)據(jù)的寫操作。