TCP/IP之Nagle演算法與40ms延遲提到了Nagle 演算法。這樣雖然提高了網路吞吐量,但是實時性卻降低了,在一些交互性很強的應用程式來說是不允許的,使用TCP_NODELAY選項可以禁止Nagle 演算法。禁止Nagle後應用程式向內核遞交的每個數據包都會立即發送出去。但是禁止Nagle,網路傳 ...
TCP/IP之Nagle演算法與40ms延遲提到了Nagle 演算法。這樣雖然提高了網路吞吐量,但是實時性卻降低了,在一些交互性很強的應用程式來說是不允許的,使用TCP_NODELAY選項可以禁止Nagle 演算法。禁止Nagle後應用程式向內核遞交的每個數據包都會立即發送出去。但是禁止Nagle,網路傳輸仍然受到TCP確認延遲機制的影響。 CORK意思是塞子,TCP中的CORK意思是將連接塞住,使得數據先不發出去,等到拔去塞子後再發出去。設置該選項後,內核會儘力把小數據包拼接成一個大的數據包(一個MTU)再發送出去,一定時間後,內核仍然沒有組合成一個MTU時也必鬚髮送現有的數據。然而,TCP_CORK的實現可能並不像你想象的那麼完美,CORK並不會將連接完全塞住。內核其實並不知道應用層到底什麼時候會發送第二批數據用於和第一批數據拼接以達到MTU的大小,因此內核會給出一個時間限制,在該時間內沒有拼接成一個大包(努力接近MTU)的話,內核就會無條件發送。也就是說若應用層程式發送小包數據的間隔不夠短時,TCP_CORK就沒有一點作用,反而失去了數據的實時性(每個小包數據都會延時一定時間再發送,這個時間超過了內核的時間限制)。 Nagle演算法和CORK演算法非常類似,但是它們的著眼點不一樣,Nagle演算法主要避免網路因為太多的小包(協議頭的比例非常之大)而擁塞,而CORK演算法則是為了提高網路的利用率,使得總體上協議頭占用的比例儘可能的小。如此看來這二者在避免發送小包上是一致的,在用戶控制的層面上,Nagle演算法完全不受用戶socket的控制,你只能簡單的設置TCP_NODELAY而禁用它,CORK演算法同樣也是通過設置或者清除TCP_CORK使能或者禁用之,然而Nagle演算法關心的是網路擁塞問題,只要所有的ACK回來則發包,而CORK演算法卻可以關心內容,在前後數據包發送間隔很短的前提下(很重要,否則內核會幫你將分散的包發出),即使你是分散髮送多個小數據包,你也可以通過使能CORK演算法將這些內容拼接在一個包內,如果此時用Nagle演算法的話,則可能做不到這一點。