⑴ tcp quickack有什麼用
request.form 獲取表單內容,通常用於獲取客戶遞交信息。如:用戶注冊,留言等。 request 其功能除了包含request.form所具備的功能外,還能獲取url參數。
⑵ Nagle演算法的演算法
TCP/IP協議中,無論發送多少數據,總是要在數據前面加上協議頭,同時,對方接收到數據,也需要發送ACK表示確認。為了盡可能的利用網路帶寬,TCP總是希望盡可能的發送足夠大的數據。(一個連接會設置MSS參數,因此,TCP/IP希望每次都能夠以MSS尺寸的數據塊來發送數據)。Nagle演算法就是為了盡可能發送大塊數據,避免網路中充斥著許多小數據塊。Nagle演算法的基本定義是任意時刻,最多隻能有一個未被確認的小段。 所謂「小段」,指的是小於MSS尺寸的數據塊,所謂「未被確認」,是指一個數據塊發送出去後,沒有收到對方發送的ACK確認該數據已收到。Nagle演算法的規則(可參考tcp_output.c文件里tcp_nagle_check函數注釋):
(1)如果包長度達到MSS,則允許發送;
(2)如果該包含有FIN,則允許發送;
(3)設置了TCP_NODELAY選項,則允許發送;
(4)未設置TCP_CORK選項時,若所有發出去的小數據包(包長度小於MSS)均被確認,則允許發送;
(5)上述條件都未滿足,但發生了超時(一般為200ms),則立即發送。
Nagle演算法只允許一個未被ACK的包存在於網路,它並不管包的大小,因此它事實上就是一個擴展的停-等協議,只不過它是基於包停-等的,而不是基於位元組停-等的。Nagle演算法完全由TCP協議的ACK機制決定,這會帶來一些問題,比如如果對端ACK回復很快的話,Nagle事實上不會拼接太多的數據包,雖然避免了網路擁塞,網路總體的利用率依然很低。
Nagle演算法是silly window syndrome(SWS)預防演算法的一個半集。SWS演算法預防發送少量的數據,Nagle演算法是其在發送方的實現,而接收方要做的是不要通告緩沖空間的很小增長,不通知小窗口,除非緩沖區空間有顯著的增長。這里顯著的增長定義為完全大小的段(MSS)或增長到大於最大窗口的一半。注意:BSD的實現是允許在空閑鏈接上發送大的寫操作剩下的最後的小段,也就是說,當超過1個MSS數據發送時,內核先依次發送完n個MSS的數據包,然後再發送尾部的小數據包,其間不再延時等待。(假設網路不阻塞且接收窗口足夠大)
舉個例子,比如之前的blog中的實驗,一開始client端調用socket的write操作將一個int型數據(稱為A塊)寫入到網路中,由於此時連接是空閑的(也就是說還沒有未被確認的小段),因此這個int型數據會被馬上發送到server端,接著,client端又調用write操作寫入『
』(簡稱B塊),這個時候,A塊的ACK沒有返回,所以可以認為已經存在了一個未被確認的小段,所以B塊沒有立即被發送,一直等待A塊的ACK收到(大概40ms之後),B塊才被發送。整個過程如圖所示:
這里還隱藏了一個問題,就是A塊數據的ACK為什麼40ms之後才收到?這是因為TCP/IP中不僅僅有nagle演算法,還有一個TCP確認延遲機制 。當Server端收到數據之後,它並不會馬上向client端發送ACK,而是會將ACK的發送延遲一段時間(假設為t),它希望在t時間內server端會向client端發送應答數據,這樣ACK就能夠和應答數據一起發送,就像是應答數據捎帶著ACK過去。在我之前的時間中,t大概就是40ms。這就解釋了為什麼'
'(B塊)總是在A塊之後40ms才發出。當然,TCP確認延遲40ms並不是一直不變的,TCP連接的延遲確認時間一般初始化為最小值40ms,隨後根據連接的重傳超時時間(RTO)、上次收到數據包與本次接收數據包的時間間隔等參數進行不斷調整。另外可以通過設置TCP_QUICKACK選項來取消確認延遲。2. TCP_NODELAY 選項
默認情況下,發送數據採用Nagle 演算法。這樣雖然提高了網路吞吐量,但是實時性卻降低了,在一些交互性很強的應用程序來說是不允許的,使用TCP_NODELAY選項可以禁止Nagle 演算法。
此時,應用程序向內核遞交的每個數據包都會立即發送出去。需要注意的是,雖然禁止了Nagle 演算法,但網路的傳輸仍然受到TCP確認延遲機制的影響。3. TCP_CORK 選項
所謂的CORK就是塞子的意思,形象地理解就是用CORK將連接塞住,使得數據先不發出去,等到拔去塞子後再發出去。設置該選項後,內核會盡力把小數據包拼接成一個大的數據包(一個MTU)再發送出去,當然若一定時間後(一般為200ms,該值尚待確認),內核仍然沒有組合成一個MTU時也必須發送現有的數據(不可能讓數據一直等待吧)。然而,TCP_CORK的實現可能並不像你想像的那麼完美,CORK並不會將連接完全塞住。內核其實並不知道應用層到底什麼時候會發送第二批數據用於和第一批數據拼接以達到MTU的大小,因此內核會給出一個時間限制,在該時間內沒有拼接成一個大包(努力接近MTU)的話,內核就會無條件發送。也就是說若應用層程序發送小包數據的間隔不夠短時,TCP_CORK就沒有一點作用,反而失去了數據的實時性(每個小包數據都會延時一定時間再發送)。4. Nagle演算法與CORK演算法區別Nagle演算法和CORK演算法非常類似,但是它們的著眼點不一樣,Nagle演算法主要避免網路因為太多的小包(協議頭的比例非常之大)而擁塞,而CORK演算法則是為了提高網路的利用率,使得總體上協議頭佔用的比例盡可能的小。如此看來這二者在避免發送小包上是一致的,在用戶控制的層面上,Nagle演算法完全不受用戶socket的控制,你只能簡單的設置TCP_NODELAY而禁用它,CORK演算法同樣也是通過設置或者清除TCP_CORK使能或者禁用之,然而Nagle演算法關心的是網路擁塞問題,只要所有的ACK回來則發包,而CORK演算法卻可以關心內容,在前後數據包發送間隔很短的前提下(很重要,否則內核會幫你將分散的包發出),即使你是分散發送多個小數據包,你也可以通過使能CORK演算法將這些內容拼接在一個包內,如果此時用Nagle演算法的話,則可能做不到這一點。
⑶ TCP之Nagle、Cork、Delay ACK(延遲確認)
[TOC]
TCP協議中的Nagle演算法
TCP中的Nagle演算法
linux下TCP延遲確認(Delayed Ack)機制導致的時延問題分析
TCP-IP詳解:Delay ACK
Nagle演算法為了避免網路中存在太多的小數據包,盡可能發送大的數據包。定義為在任意時刻,最多隻有一個未被確認的小段。小段為小於MSS尺寸的數據塊,未被確認是指數據發出去後未收到對端的ack。
Nagle演算法是在網速較慢的時代的產物,目前的網路環境已經不太需要該機制,該演算法在linux系統中默認關閉。
1)如果包長度達到MSS,則允許發送;
2)如果該包含有FIN,則允許發送;
3)設置了TCP_NODELAY選項,則允許發送;
4)未設置TCP_CORK選項時,若所有發出去的包均被確認,或所有發出去的小數據包(包長度小於MSS)均被確認,則允許發送。
對於規則4),就是說要求一個TCP連接上最多隻能有一個未被確認的小數據包,在該分組的確認到達之前,不能發送其他的小數據包。如果某個小分組的確認被延遲了(案例中的40ms),那麼後續小分組的發送就會相應的延遲。也就是說延遲確認影響的並不是被延遲確認的那個數據包,而是後續的應答包。
tcp默認使用nagle演算法,最大限度的進行緩存。
優點 :避免網路中充斥著許多小數據塊,降低網路負載,減少網路擁塞,提高網路吞吐
缺點 :客戶端的延遲會增加,實時性降低,不適合延時要求盡量小的場景;且對於大文件傳輸這種場景,會降低傳輸速度。
用TCP_NODELAY選項可以禁止Negale 演算法。此時,應用程序向內核遞交的每個數據包都會立即發送出去。需要注意的是,雖然禁止了Negale 演算法,但網路的傳輸仍然受到TCP確認延遲機制的影響。
TCP在接收到對端的報文後,並不會立即發送ack,而是等待一段時間發送ack,以便將ack和要發送的數據一塊發送。當然ack不能無限延長,否則對端會認為包超時而造成報文重傳。linux採用動態調節演算法來確定延時的時間。
TCP在何時發送ACK的時候有如下規定:
優點 :減少了數據段的個數,提高了發送效率
缺點 :過多的delay會拉長RTT(往返時延)
可以通過TCP_QUICKACK這個選項來啟動快速ACK:
所謂的CORK就是塞子的意思,形象地理解就是用CORK將連接塞住,使得數據先不發出去,等到拔去塞子後再發出去。Cork演算法與Nagle演算法類似,也有人把Cork演算法稱呼為super-Nagle。Nagle演算法提出的背景是網路因為大量小包小包而導致利用率低下產生網路擁塞,網路發生擁塞的時候性能還會進一步下降,因此Nagle演算法通過ACK確認包來觸發新數據包的發送(ACK確認包意味著對端已經接收到了一個數據包,即有一個數據包已經離開中間網路,此時可以在向中間網路注入一個數據包塊,這稱呼為self-clocking)。Cork演算法則更為激進,一旦打開Cork演算法,TCP不關注是否有收到ACK報文,只要當前緩存中累積的數據量不足以組成一個full-sized數據包就不會將數據包發出,直到一個RTO超時後才會把不滿足一個full-sized的數據包發出去(實際上是通過一個persist timer來設置的這個RTO定時時間,persist timer超時的時候就會強制發送)。
linux中可以通過TCP_CORK選項來設置socket打開Cork演算法。TCP_NODELAY選項和TCP_CORK選項在linux早期版本是互斥的,但目前最新的linux版本已經可以同時打開這兩個選項了,但是TCP_CORK選項的優先順序要比TCP_NODELAY選項的優先順序要高。
Nagle演算法和CORK演算法非常類似,但是它們的著眼點不一樣,Nagle演算法主要避免網路因為太多的小包(協議頭的比例非常之大)而擁塞,而CORK演算法則是為了提高網路的利用率,使得總體上協議頭佔用的比例盡可能的小.如此看來這二者在避免發送小包上是一致的,在用戶控制的層面上,Nagle演算法完全不受用戶socket的控制,你只能簡單的設置TCP_NODELAY而禁用它,CORK演算法同樣也是通過設置或者清除TCP_CORK使能或者禁用之,然而Nagle演算法關心的是網路擁塞問題,只要所有的ACK回來則發包,而CORK演算法卻只關心內容,在前後數據包發送間隔很短的前提下(很重要,否則內核會幫你將分散的包發出),即使你是分散發送多個小數據包,你也可以通過使能CORK演算法將這些內容拼接在一個包內,如果此時用Nagle演算法的話,則可能做不到這一點.
優點 :提高網路的利用率
缺點 :對實時性有影響
使用TCP_CORK參數進行配置
⑷ TCP_QUICKACK、TCP_NODELAY
TCP會偵聽通信兩端,假如通信雙方採用的是一應一答的交互模式,tcp會開啟延遲確認機制。
一應一答的交互模式如下:
1.C->S 發送請求
2.S->C 發送收到請求確認ACK
3.S->C 發送響應
4.C->S 發送收到響應確認ACK
TCP的延遲確認機制:將第二步和第三步合並在一塊,不再單獨發送請求包的單獨ACK回包,而是放在緩沖區中跟響應數據包一起發送出去。如果沒有響應數據包,超時200ms後會把ACK包發送出去。
可以使用TCP_QUICKACK關閉延遲確認機制。
該選項用於控制關閉nagle演算法。
nagle演算法如下:
1.如果當前數據包 > MSS,則發送數據
2.否則檢測當前連接是否有未被確認的小分組
3.如果有,則緩沖當前小分組,知道受到確認分組。
4.如果沒有則發送當前小分組。
nagle演算法的目的在於:保證當前連接任意時刻網路只有一個未被確認的小分組,保證網路不會過分擁塞。
什麼時候禁用nagle演算法:需要網路對小包有實時的響應。
⑸ tcp 選項
TCP_QUICKACK選項來取消確認延遲
TCP_NODELAY選項可以禁止Negale 演算法
TCP_CORK 選項